我做了一个供 2 名玩家玩的 井字棋 游戏。现在,我想给游戏添加 人工智能。
以便该游戏可以在 1 名玩家和电脑 之间进行。
请问,我该如何开始?
回答:
对于井字棋来说,与其说是人工智能,不如说是一个查找表:对于每一种可能的棋盘布局,找到最佳的落子位置。
XKCD 有这样一个查找表。 基本上,每个棋盘布局都有一个唯一的 ID,以及放置下一个标记的单元格地址。 维基百科以另一种格式提供了 那个表格。
这个表格的工作方式如下:X 先走,然后是 O。X 将他的 X 放在 9 个单元格中的一个。当 O 走的时候,现在有 9 种可能的棋盘布局,这取决于 X 放在哪个单元格:
X | |----+----+---- | |----+----+---- | |
如果你查看 O 的棋盘布局,它包含 9 个大网格,左上角的那个在左上角有一个 X,所以应该使用它。 将 O 放在中间。
现在,当 X 再次走的时候,它需要找到这个棋盘布局:
X | |----+----+---- | O |----+----+---- | |
你会在中间找到它。红色的是在 XKCD 图像中放置 X 的位置,它显示你应该将其放在右下角:
X | |----+----+---- | O |----+----+---- | | X
现在,O 再次走,并查找上述棋盘布局,该布局位于左上角的大网格中的右下角小网格中。 O 需要放置在正下方的中间位置:
X | |----+----+---- | O |----+----+---- | O | X
以此类推。 该图一开始可能有点难懂(点击放大),因为它被嵌套了,但正如所说:你创建一个查找表,其中包含每个独特的棋盘布局以及放置下一个标记的位置信息。
这会创建一个完美的对手:电脑永远不会输。 如何让他更像人类,可以通过微调(例如,随机放弃选择并在随机单元格中放置标记)来实现。