我正在尝试用一个简单的极小极大算法来解决井字游戏。简单,但应该涵盖很多语言。到目前为止我所拥有的:
该板表示为 9 个(未绑定)变量的数组,这些变量设置为x
或o
。
获胜条件基本上是:win(Player, [X1,X2,X3|_]) :- X1==Player,X2==Player,X3==Player.
所有八个变体的等等。draw 只是一个简单的检查是否所有变量都被绑定。
move 子句也很简单:move(Player, [X|_], 0, 0) :- var(X), X=Player.
,同样适用于所有可能的位置(我将为以后的程序保留代码重用 :) )。
现在我可以通过简单的回溯生成所有可能的移动:move(Player, Board, X, Y).
这基本上应该是我所需要的 minimax (显然是一个简单的实用函数,如果计算机获胜则返回 1,如果平局则返回 0,如果人类获胜则返回 -1,这就是简单的)。我只是不知道如何实现它,而且我在网上找到的所有示例都相当复杂并且没有得到很好的解释。
请注意,我对 n^2 或更差的运行时行为很好 - 这实际上与效率无关。是的,我确实知道如何在 lisp、python、java 中编写 minimax - 只是不知道如何将该代码“移植”到 prolog。