我知道这个问题已经被问过很多次了,我已经查看了其他代码,但大多数我看到的似乎都不是完美的(从不输),而且简单、优雅和高效。我无法决定哪种解决方案符合这些描述。
我看到的解决方案有:
(1) 使用带有alpha-beta剪枝的minimax算法。这对我来说似乎很复杂,对于这样一个简单的游戏可能是不必要的?它可能太复杂了吗?如果不是,我需要做很多硬编码还是我误解了这个算法?
(2) 使用维基百科上的伪代码策略编写代码… 我不是很确定如何实现这个。例如,它只是说“检查分叉”。这些检查中的大多数是通过有一个winningLines数组并检查它们是否会被填满来完成的吗?如果不是,有人能给我一些关于使用哪些数据结构或关于如何实现伪代码中提出的检查的基本提示吗:http://en.wikipedia.org/wiki/Tic-tac-toe#Strategy。我还看到了一些算法,这些算法给’X’方块和’O’方块赋予数值,然后使用总和来决定赢家,但我不知道为什么这特别有用。
还有其他合理的解决方案吗?
回答:
老实说,在处理AI和启发式方法时,最简单的任务也会很快变得复杂。minimax方法将给你最好的结果,而且考虑到你正在实现AI,它应该不会太难。这是2人回合制游戏逻辑的既定标准。
查看这个网站… 它提供了一些关于井字游戏AI和minimax实现的有用见解。
http://www.ntu.edu.sg/home/ehchua/programming/java/JavaGame_TicTacToe_AI.html
编辑:
注意到有人写了“暴力法”… 这将成为实现minimax中涉及的启发式方法的低效方式。基于其他玩家最后一步迭代所有可能的移动只是实现启发式方法的另一种方式… 但在我看来,这似乎需要更多的工作。minimax实现将简单而有效。
编辑2:
“更简单的实现”在某种程度上是相对的。minimax是标准的,正如我在评论中所说,你可以操纵启发式方法以适应你正在寻找的情况…
我希望我能告诉你最简单的方法,但有太多变量取决于你游戏在代码中的实现方式。
接受这些建议,查看你的游戏实现,然后看看什么最适合你!
对一个人来说简单的东西,对另一个人来说可能很复杂。我只是想给你一些选择,minimax相当可靠。也许试着调整它以适应你的需求。
编辑3:
如果你需要更多指导,请告诉我。我很乐意帮助。