在过去的几天里,我尝试在 prolog 程序中做游戏 Adugo,但是逻辑编程对我来说有点困难。我尝试尽可能简单,初始矩阵是:
[[1,1,1,0,0,0,0],
[1,1,1,0,0,0,0],
[1,1,2,0,0,0,0],
[1,1,1,0,0,0,0],
[1,1,1,0,0,0,0]]).
用户只能控制狗,而美洲虎将是一个机器人。我已经用C++完成了这个游戏,但在Prolog中我不知道该怎么做。
这个游戏很好玩。我还没有完成开发, 但基本思想是使用谓词
set_arg/4
来更改棋盘
状态。 ISO 核心标准中已经存在谓词 arg/3,它只是从复合中选择一个参数。如果尚未预定义,可以通过 univ (=..)/2 进行引导,如下所示:
arg(K, C, A) :-
C =.. [_|L],
nth1(K, L, A).
现在谓词 set_arg/3 的工作方式类似,但其目的不是访问参数,而是修改参数。但由于在 Prolog 中术语是不可变的,我们只需返回一个新的修改术语,从而保留声明性。它可以按如下方式引导:
set_arg(K, C, A, D) :-
C =.. [F|L],
nth1(K, L, _, H),
nth1(K, R, A, H),
D =.. [F|R].
Prolog 实现者不会喜欢这样的引导,众所周知,univ (=..)/2 是一个会减慢 Prolog 解释器速度的谓词。在 Jekejeke Prolog 中,我们对内置 set_arg/4 提供本机支持,这减轻了 Prolog 解释器的负担。
通过set_arg/4,我们可以相对简单地实现Adugo游戏动作。下面是一个示例动作,美洲虎 (*) 跳过狗 (o) 将其吃掉。链接谓词表示包括“街道”的板拓扑:
move(S, K, *, T, K-I) :-
link(K, J, M),
arg(J, S, o),
N is M+1,
link(J, I, N),
arg(I, S, +),
set_arg(J, S, +, H),
set_arg(K, H, +, L),
set_arg(I, L, *, T).
这是我们游戏开发的截图。游戏会话可以通过谓词 game/2 开始。 game/2 谓词尚无法正确检测游戏的结束。但我们正在努力:
效率还不错。由于 Prolog 解释器允许及时多参数索引,因此通过 link/3 拓扑数据库的移动搜索速度相当快。其他区域可能需要改进,例如狗的柜台和一些 alpha/beta 修剪。