【发布时间】:2012-04-20 14:46:04
【问题描述】:
我正在尝试使用简单的极小极大算法来解决井字游戏。简单,但应该涵盖很多语言。到目前为止我所拥有的:
板表示为 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). 这基本上应该是我对极小极大所需的全部(显然是一个简单的实用函数,如果计算机获胜则返回 1,如果平局则返回 0 和 -1如果人类获胜,那很容易)。我只是不知道如何实现它,我在网上找到的所有示例都相当复杂,没有很好的解释。
请注意,我对 n^2 或更差的运行时行为很好 - 这实际上与效率无关。是的,我确实知道如何在 lisp、python、java 中编写 minimax - 只是不知道如何将该代码“移植”到 prolog。
【问题讨论】: