Prolog-编写名为Adugo的棋盘游戏

时间:2018-07-22 20:26:13

标签: matrix 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]]).
  • 1个代表狗
  • 2是美洲虎
  • 0没什么

用户将只控制狗,而美洲虎将成为机器人。我已经用C ++编写了这个游戏,但是在Prolog中我不知道该怎么做。

1 个答案:

答案 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谓词尚不能正确检测到游戏结束。但是我们正在努力:

enter image description here

效率还不错。由于Prolog解释器允许及时对多参数进行索引,因此通过link / 3拓扑数据库进行移动搜索的速度非常快。其他方面可能需要改进,例如为狗提供计数器和一些alpha / beta修剪。