井字游戏:评估节点的启发式值

时间:2018-09-09 11:15:18

标签: c++ tic-tac-toe minimax

请问这个问题是否已经存在,我进行了很多搜索,但还没有得到我想问的问题的答案。因此,基本上,我正在尝试实现一个使用Minimax算法进行移动的Tic-Tac-Toe AI。

但是,我没有得到的一件事是,当在空板上使用Minimax时,返回的值始终为0(这很有意义,因为如果两个玩家都玩得尽善尽美,游戏总是以平局结束)。

因此,当AI为X时,Minimax总是选择第一个图块作为最佳移动(因为所有移动均返回0作为值)。第二步也一样,它总是选择第二个图块。我该如何解决这个问题,使我的AI更有可能获胜呢?这是我使用的评估和Minimax函数(用于Alpha-Beta修剪):

access-control-allow-origin

2 个答案:

答案 0 :(得分:0)

Minimax假定为最佳比赛,因此最大化“获胜概率”不是有意义的概念:由于其他玩家可以强制平局但不能强制胜利,因此他们总是会强制平局。如果您想与并非完全理性的玩家进行最佳比赛(当然,这是获胜的仅有的两种方法之一),则需要假设对手的动作具有一定的概率分布并使用ExpectMinimax ,其中对手的举动很有可能被随机错误所取代。或者,您可以使用启发式方法来针对超出特定深度的对手玩法,故意限制minimax搜索的范围(但仍在游戏树中搜索自己的举动。)

*另一个不玩。

答案 1 :(得分:0)

将代码组织成较小的例程,以使其看起来更整洁且更易于调试。除了递归minimax函数外,所有可能的有效移动生成函数和可靠的评估子例程也是必不可少的(这里似乎缺少)。

例如,在游戏开始时,评估算法应返回非零得分,每个位置均应具有相对得分指数(例如,中间位置的权重可能比边角略高)。

您的极大极小边界条件-如果没有空单元格位置,则返回;是有缺陷的,因为即使在前面的层中发生了赢/输动作,它也会进行评估。这种情况将在更复杂的AI游戏中加剧。

如果您不熟悉minimax,可以在CodeReview上找到很多可以用来编译示例代码的