【发布时间】:2013-04-01 23:19:25
【问题描述】:
我知道这个问题被问了很多,我也搜索了其他代码,但我看到的大部分代码似乎都不是完美无缺的(永远不会丢失),而且简单、优雅和高效。而且我无法确定哪种类型的解决方案适合该描述。
我见过的解决方案是:
(1) 使用带有 alpha-beta 修剪的 minimax。这对我来说似乎很复杂,对于这样一个简单的游戏来说可能是不必要的?是不是太复杂了?如果不是,我需要做很多硬编码还是我误解了算法?
(2) 使用 Wikipedia 中的伪代码策略编写代码...我不确定如何实现。例如,它只是说“检查分叉”。这些检查中的大多数是否会通过拥有一系列winningLines并检查它们是否会被填写或类似的东西来完成?如果没有,有人可以给我关于什么数据结构的提示或关于如何在此处实现伪代码中提出的检查的任何基本提示:http://en.wikipedia.org/wiki/Tic-tac-toe#Strategy。我还看到了一些算法,它们为“X”方和“O”方提供数值,然后使用总和来决定获胜者,但我不明白为什么这特别有用。
还有其他合理的解决方案吗?
【问题讨论】:
-
对于这么小的游戏树,只需暴力破解它。模拟所有可能的游戏完全不需要时间。
-
似乎并非完美无瑕(总是获胜)= 似乎很正常。我总是在井字游戏中获胜。或者最坏的关系。任何聪明的人都会有同样的结果。这就是为什么没有人在 10 岁之后玩井字游戏。没有人赢就不好玩。
-
另外,“总是赢”不是一个有效的要求(永远)。想象一下你的算法与自己对抗。
-
那么您可能应该编辑您的问题。
-
Minimax 并不一定很复杂,对于这么小的游戏来说,剪枝并不是真正需要的。参见例如this implementation
标签: javascript artificial-intelligence tic-tac-toe