在过去的几天中,我尝试在序言程序中进行游戏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中我不知道该怎么做。
答案 0 :(得分:0)
游戏非常有趣。我尚未完成开发, 但基本思想是使用谓词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 development中间的屏幕截图。谓词game / 2可以开始游戏会话。 game / 2谓词尚不能正确检测到游戏结束。但是我们正在努力:
效率还不错。由于Prolog解释器允许及时对多参数进行索引,因此通过link / 3拓扑数据库进行移动搜索的速度非常快。其他方面可能需要改进,例如为狗提供计数器和一些alpha / beta修剪。