【发布时间】:2014-12-24 10:29:39
【问题描述】:
我为 2 名玩家制作了一个 Tic-Tac-Toe 游戏。现在,我想给游戏人工智能。
这样游戏就可以在1名玩家和计算机之间进行。
请帮助我如何开始?
【问题讨论】:
标签: c# artificial-intelligence
我为 2 名玩家制作了一个 Tic-Tac-Toe 游戏。现在,我想给游戏人工智能。
这样游戏就可以在1名玩家和计算机之间进行。
请帮助我如何开始?
【问题讨论】:
标签: c# artificial-intelligence
井字游戏与其说是人工智能,不如说是一个查找表:对于每个可能的棋盘布局,找到最佳位置。
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
等等。该图起初有点难以阅读(点击放大),因为它是嵌套的,但正如所说:您创建一个查找表,其中包含每个独特的电路板布局和放置下一个标记的位置的信息。
这创造了一个完美的对手:计算机永远不会输。如何让他更人性化然后是微调(例如,随机丢弃选择并将标记放置在随机单元格中)
【讨论】:
实际上我在很多个月前就写过这样一个野兽,一个从错误中吸取教训的真正的自动机。
游戏的性质意味着您可以存储每个可能位置的结果。虽然对于象棋这样的游戏不可行,但井字游戏只有 39 或 19683 个状态。
这是我使用的智能位。
分配了一个字节数组,给出了每个状态的可取性,并且这些都被初始化为 127,以便所有状态都同样可取。为了让 AI 选择要进行的移动,它会将可能由 可能移动产生的所有状态的分数相加,并使用它生成一个随机数来选择它会移动的移动。
换句话说,如果只有两步可能并且结果的分数分别为 200 和 50,那么 AI 将生成一个从 0 到 249 的随机数并使用它来选择一个,前者将是四倍(值0-199)比后者(值 200-249)更有可能。
至于分数如何变化,人工智能只是记住了游戏中存在的每一个状态,这些状态是由你做出的一个动作产生的。如果它赢得了比赛,所有这些位置的得分都会增加一个(但当然限制为 255,因为它必须适合一个字节)。如果它输了,它会降低分数(保持在一个或多个)。
这样,导致获胜的位置变得更有可能,而导致失败的位置变得不太可能。
可取性从未降至零的原因是,没有任何状态是不可能获得的。当然,如果所有其他人的得分都较高,那么一个愿望得分为 1 的人非常不太可能。
AI 需要经过大量游戏才能成为一名体面的玩家,但你可以通过将其与在相同 AI 和随机动作之间交替的自动敌人进行对抗来加速它。
您可以使用一些技巧来提升或降低比游戏中更多的状态,因为您可以旋转或镜像每个状态以获得相同的位置。
您还可以设置得分达到的下限(而不是一个) - 这将使 AI 更有可能选择不太理想的动作,从而有效地降低智力水平。
【讨论】:
我知道这是一个非常晚的答案,但我想我会帮助任何人找到这个答案。这里有一些帮助来制作一个令人信服和可击败的人工智能。 轮到计算机时,它应该大致遵循以下步骤:
【讨论】:
有了井字游戏,人工智能应该可以分析每一个可能的游戏结果。您可以通过创建一个树形结构来实现这一点,该树形结构为玩家和 AI 可以做出的每一个选择分支。 AI 可以从那里选择一条通往胜利的道路。
不过,要打造一个可击败的对手,您可以限制 AI 执行的分析量(即限制树结构的深度)并让 AI 在不知道最终结果的情况下决定路径。更强大的 AI 会分析更多动作,而更弱的 AI 会更少分析。
【讨论】:
其他答案告诉您使用查找表。但请注意,如果棋盘上的棋子超过 3 个,则有一个非常简单的算法(因为至少存在一条线,其中有两个同类和一个空格):如果可能获胜,否则阻止对手。
那么你只需要一个小得多的查找表来处理开局动作。
【讨论】:
只是添加一些东西,因为我过去做过同样的事情。如果您想让您的计算机对手更容易受到攻击,您可以使用极小极大算法来评估可能的动作。如果您需要有时会输的不太强大的对手,它会变得更加现实。
【讨论】: