使用C#进行Tic-Tac-Toe的人工智能

我为2名玩家制作了一个Tic-Tac-Toe游戏。 现在,我想给游戏人工智能。

这样的游戏可以在1个玩家和计算机之间玩。
请帮助我如何开始?

使用Tic Tac Toe,它不是一个AI而是一个查找表:对于每个可能的电路板布局,找到最佳位置。

XKCD有这样的查找表 。 基本上每个Board Layout都会获得一个唯一的ID以及字段的地址,用于设置下一个标记。 维基百科以另一种格式提供该表 。

该表的工作方式如下:X先行,然后O. X将他的X放入9个单元中的一个。 当O去的时候,现在有9个可能的Board Layouts,具体取决于哪个Cell有X:

X | | ----+----+---- | | ----+----+---- | | 

如果你看一下O的地图,里面有9个大网格,左上角的那个在左上角有一个X,所以这就是要使用的。 把O放在中间。

现在当X再次出现时,它需要找到这个板布局:

  X | | ----+----+---- | O | ----+----+---- | | 

你会发现这个在中间。 红色是将X放在XKCD图像中的位置,这表示您将其放在右下角:

  X | | ----+----+---- | O | ----+----+---- | | X 

现在,O再次寻找上面的电路板布局,它位于左上方大网格的右下方小网格中。 O需要放在中间底部:

  X | | ----+----+---- | O | ----+----+---- | O | X 

等等。 该图有点难以阅读(点击它放大),因为它是嵌套的,但如上所述:您创建一个查找表,其中包含每个独特的电路板布局和信息,以便放置下一个标记。

这创造了一个完美的对手:计算机将永远不会失去。 如何使他更加人性化然后进行微调(例如,随机丢弃选择并将标记放在随机单元格中)

我实际上在很多个月前写过这样一个野兽,一个从错误中吸取教训的实际自动机。

游戏的本质意味着您可以存储每个可能位置的结果。 虽然像国际象棋这样的游戏不可行,但TicTacToe只有3 9或19683个州。

这是我使用的情报位。

分配了一个字节数组,给出了每个状态的可取性,这些都被初始化为127,因此所有状态都是同样可取的。 为了让AI选择要进行的移动,它将可能由移动产生的所有状态的分数相加,并使用它来生成随机数以选择它将进行的移动。

换句话说,如果只有两次移动是可能的,并且结果得分为200和50,则AI将生成0到249的随机数,并使用它来选择一个,前者将是4次(值0-199) )比后者更可能(值200-249)。

至于分数如何变化,AI简单地记住了游戏中存在的每个状态,这些状态都是由你做出的。 如果它赢了比赛,那么所有这些位置的得分都会提高一(但当然要限制为255,因为它必须适合一个字节)。 如果它丢失了,它会降低分数(将它们保持在一个或多个)。

这样,导致胜利的位置将变得更有可能,而导致损失的位置将变得更不可能。

理想从未降到零的原因是没有任何国家不可能获得。 当然,如果所有其他人的得分都更高,那么一个得分为1的人就不太可能。

人工智能成为一个体面的玩家需要相当多的游戏,但你可以通过对抗在同一个AI和随机移动之间交替的自动化敌人来加速它。

你可以使用一些技巧来提升或放弃比游戏中存在的状态更多的状态,因为你可以旋转或镜像每个状态以获得相同的位置。

您还可以设置分数的下限(不是一个) – 这将使AI更有可能选择不太理想的移动,从而有效地降低智能水平。

通过Tic-Tac-Toe,AI应该可以分析每个可能的游戏结果。 您可以通过创建一个树结构来实现这一点,该树结构可以为玩家和AI所做的每个选择进行分支。 从那里AI可以选择一条通往其胜利的道路。

尽管如此,你可以限制AI的分析量(即限制树结构的深度),并让AI在不知道最终结果的情况下决定路径。 更强大的人工智能将分析更多的动作,更少的人工智能。

其他答案告诉您使用查找表。 但请注意,如果棋盘上有超过3个棋子,则会有一个非常简单的算法(因为至少有一条线路有两种类型和一个空的空间):如果可能则赢,否则阻挡对手。

然后你只需要一个小得多的查找表来处理开始移动。

我知道这是一个非常晚的答案,但我想我会帮助任何人找到这个。 这是一些帮助,使一个令人信服和可击败的ai。 在计算机上,它应该大致遵循以下步骤:

  • 查看每个位置以获得胜利。 如果发现,请继续。
  • 查看每个位置以获得对手的胜利。 如果找到,请将其取出一块,否则继续。
  • 看看中心广场。 如果打开,请继续。
  • 看看板子的四个角落。 随机选择任何开放的。 没有打开,继续。
  • 看看4面并随意选择任何一面。 没有打开,然后游戏是平局。

只是为了添加一些东西,因为我过去做过同样的事情。 如果你想让你的计算机对手更容易受到攻击,你可以使用minimax算法来评估可能的移动。 如果你需要那些有时会失去的强大对手,它会更加逼真。