我为2名玩家制作了Tic-Tac-Toe游戏。现在,我想给游戏人工智能。
这样可以在 1个玩家和计算机之间玩游戏 请帮助我如何开始?
答案 0 :(得分:24)
使用Tic Tac Toe,它不是一个AI而是一个查找表:对于每个可能的电路板布局,找到最佳位置。
XKCD has such a lookup table。基本上每个Board Layout都会获得一个唯一的ID以及字段的地址,用于设置下一个标记。维基百科有另一种格式的that table。
表格如下: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
等等。该图有点难以阅读(点击它放大),因为它是嵌套的,但如上所述:您创建一个Lookup表,其中包含每个独特的电路板布局和信息,以便放置下一个标记。
这创造了一个完美的对手:电脑永远不会输。然后如何使他更加人性化(例如,随机丢弃选择并将标记放在随机单元格中)
答案 1 :(得分:6)
我实际上在很多个月前写过这样一个野兽,一个从错误中吸取教训的实际自动机。
游戏的本质意味着您可以存储每个可能位置的结果。虽然像国际象棋这样的游戏不可行,但TicTacToe只有3个 9 或19683个州。
这是我使用的情报部分。
分配了一个字节数组,给出了每个状态的可取性,并且这些都被初始化为127,因此所有状态都是同样可取的。为了让AI选择要进行的移动,它会添加可能由可能的移动产生的所有状态的分数,并使用它来生成随机数以选择它将进行的移动。
换句话说,如果只有两次移动是可能的,并且结果得分为200和50,则AI将生成0到249之间的随机数并使用它来选择一个,前者将是四次(值0-199)比后者更可能(值200-249)。
关于分数如何变化,人工智能简单地记住了游戏中存在的每个状态,这些状态都是由你做出的。如果它赢了比赛,那么所有这些位置的得分都会提高一(但当然要限制为255,因为它必须适合一个字节)。如果它丢失了,它会降低分数(将它们保持在一个或多个)。
这样,导致胜利的位置将变得更有可能,而那些导致损失的位置将变得不太可能。
理想从未降到零的原因是没有任何州无法获得。当然,如果所有其他人的得分都较高,那么得分为1的人非常。
人工智能成为一个体面的玩家需要相当多的游戏,但你可以通过对抗在同一个AI和随机移动之间交替的自动化敌人来加速它。
你可以使用一些技巧来提升或放弃比游戏中存在的状态更多的状态,因为你可以旋转或镜像每个状态以获得相同的位置。
您还可以设置分数的下限(不是一个) - 这样可能会让AI更有可能选择不太理想的移动,从而有效地降低智力水平。
答案 2 :(得分:3)
使用Tic-Tac-Toe,AI应该可以分析每个可能的游戏结果。您可以通过创建一个树结构来实现这一点,该树结构可以为玩家和AI所做的每个选择进行分支。 AI可以从那里选择一条通向胜利的道路。
为了打造一个可打败的对手,你可以限制AI所做的分析量(即限制树结构的深度)并让AI在不知道最终结果的情况下决定一条路径。一个更强大的人工智能将分析更多的动作,更少的人工智能。
答案 3 :(得分:3)
其他答案告诉您使用查找表。但是请注意,如果棋盘上有超过3个棋子,则会有一个非常简单的算法(因为至少会有一条线路有两种类型和一个空的空间):如果可能则赢,否则阻挡对手。 / p>
然后你只需要一个小得多的查找表来处理开始移动。
答案 4 :(得分:3)
我知道这是一个非常晚的答案,但我想我会帮助任何人找到这个。在这里有一些帮助,使一个令人信服和可击败的ai。 在计算机上,它应该大致遵循以下步骤:
答案 5 :(得分:1)
只是为了添加一些东西,因为我过去做过同样的事情。如果你想让你的计算机对手更容易受到攻击,可以使用minimax算法来评估可能的移动。如果你需要那些有时会失败的强大对手,它会更加逼真。