我正在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,-,-)
]).
答案 0 :(得分:0)
我认为我会在数据声明中隐藏电路板大小,只需将其设置为动态,并在用户请求更改时进行初始化:所以,保持代码不变,只需在前面添加(注意:未经测试的代码)
:- 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)).