我正在用Prolog写一个游戏。游戏有一个“棋盘”的形式如下所示,它有两个列表的“棋子”。董事会的大小固定在16个位置。我想让董事会“动态”,以便当游戏开始时,用户将定义大小。我想到了一种方法,但问题是,我的方式更多的是一种程序性的方式,而对于Prolog来说则不是那么正确。我想创建一个谓词大小/1,它将由用户在开始时初始化,然后所有的列表都将根据该谓词初始化,使用重复和裁剪并断言.有人能提出更好的实施方案吗?
/*--------------------------------------------------------------------------
Initial armies (lists of 1 to 8)
--------------------------------------------------------------------------*/
black_army([1,2,3,4,5,6,7,8]).
white_army([1,2,3,4,5,6,7,8]).
/*--------------------------------------------------------------------------
Initial Board (all positions empty)
--------------------------------------------------------------------------*/
board([
(1,-,-),(2,-,-),(3,-,-),(4,-,-),
(5,-,-),(6,-,-),(7,-,-),(8,-,-),
(9,-,-),(10,-,-),(11,-,-),
(13,-,-),(14,-,-),(15,-,-),(16,-,-),(12,-,-)
]).发布于 2015-12-17 14:47:20
我想我会在数据声明中保持板的大小,使其动态化,并在用户请求更改时初始化:所以,保持代码原样,只需在前面添加(注意:未经测试的代码)
:- dynamic(black_army/1).
:- dynamic(white_army/1).
:- dynamic(board/1).
initialize_data(Size) :-
Size > 1, % this should be a sensible value, of course
retract(black_army(_)),
retract(white_army(_)),
retract(board(_)),
numlist(1,Size,B),
assertz(black_army(B)),
numlist(1,Size,W),
assertz(white_army(W)),
D is Size*2, findall((I,-,-), between(1,D,I), Board),
assertz(board(Board)).https://stackoverflow.com/questions/34335880
复制相似问题