用 C# 实现井字棋游戏中的人工智能

我做了一个供 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 

以此类推。 该图一开始可能有点难懂(点击放大),因为它被嵌套了,但正如所说:你创建一个查找表,其中包含每个独特的棋盘布局以及放置下一个标记的位置信息。

这会创建一个完美的对手:电脑永远不会输。 如何让他更像人类,可以通过微调(例如,随机放弃选择并在随机单元格中放置标记)来实现。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注