【问题标题】:Artificial Intelligence in Tic-Tac-Toe using C#井字游戏中的人工智能使用 C#
【发布时间】:2014-12-24 10:29:39
【问题描述】:

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

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

【问题讨论】:

    标签: c# artificial-intelligence


    【解决方案1】:

    井字游戏与其说是人工智能,不如说是一个查找表:对于每个可能的棋盘布局,找到最佳位置。

    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 
    

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

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

    【讨论】:

    • 唯一的制胜法宝就是不玩?
    • @Ben 不如来一场精彩的国际象棋比赛?
    • @Michael:我看不懂那个表(图片)。
    • @Michael,这可能会有所帮助,它会生成所有可能的结果,可用于构造查找表/codegolf.stackexchange.com/questions/1065/…
    • @Michael:谢谢你的解释。 ;)
    【解决方案2】:

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

    游戏的性质意味着您可以存储每个可能位置的结果。虽然对于象棋这样的游戏不可行,但井字游戏只有 39 或 19683 个状态。

    这是我使用的智能位。

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

    换句话说,如果只有两步可能并且结果的分数分别为 200 和 50,那么 AI 将生成一个从 0 到 249 的随机数并使用它来选择一个,前者将是四倍(值0-199)比后者(值 200-249)更有可能。

    至于分数如何变化,人工智能只是记住了游戏中存在的每一个状态,这些状态是由你做出的一个动作产生的。如果它赢得了比赛,所有这些位置的得分都会增加一个(但当然限制为 255,因为它必须适合一个字节)。如果它输了,它会降低分数(保持在一个或多个)。

    这样,导致获胜的位置变得更有可能,而导致失败的位置变得不太可能。

    可取性从未降至零的原因是,没有任何状态是不可能获得的。当然,如果所有其他人的得分都较高,那么一个愿望得分为 1 的人非常不太可能。

    AI 需要经过大量游戏才能成为一名体面的玩家,但你可以通过将其与在相同 AI 和随机动作之间交替的自动敌人进行对抗来加速它。

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

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

    【讨论】:

    • 对不起,一年后的吹毛求疵,我才发现这篇文章。井字游戏的状态少于 3^9 个 - X 的数量最多比 O 的数量多 1。
    • 这是一个很好的观点,你是绝对正确的。但是,为简单起见,我可能仍然会在评分中允许所有组合,即使有些组合是不可能的。然后我不必担心将吟游诗人分配给数组位置的复杂公式。它当然不会影响移动,因为它们是从最多九个可能的下一步移动中提取的。
    • 好吧,这篇文章可能很晚了,但我只是想问我可以使用你所说的算法在 Hex 游戏中实现 AI 吗?问题是即使对于 11x11 板,可能的状态数量也是巨大的。
    【解决方案3】:

    我知道这是一个非常晚的答案,但我想我会帮助任何人找到这个答案。这里有一些帮助来制作一个令人信服和可击败的人工智能。 轮到计算机时,它应该大致遵循以下步骤:

    • 查看每个位置以获得胜利。如果找到,请继续。
    • 查看每个位置以判断对手获胜。如果找到,将其作为一个块,否则继续。
    • 看看中间的正方形。如果打开,请继续。
    • 查看板的 4 个角。从任何打开的随机选择。没有打开,继续。
    • 查看 4 面并从任何打开的面中随机选择。没有打开,那么比赛是平局。

    【讨论】:

      【解决方案4】:

      有了井字游戏,人工智能应该可以分析每一个可能的游戏结果。您可以通过创建一个树形结构来实现这一点,该树形结构为玩家和 AI 可以做出的每一个选择分支。 AI 可以从那里选择一条通往胜利的道路。

      不过,要打造一个可击败的对手,您可以限制 AI 执行的分析量(即限制树结构的深度)并让 AI 在不知道最终结果的情况下决定路径。更强大的 AI 会分析更多动作,而更弱的 AI 会更少分析。

      【讨论】:

        【解决方案5】:

        其他答案告诉您使用查找表。但请注意,如果棋盘上的棋子超过 3 个,则有一个非常简单的算法(因为至少存在一条线,其中有两个同类和一个空格):如果可能获胜,否则阻止对手。

        那么你只需要一个小得多的查找表来处理开局动作。

        【讨论】:

          【解决方案6】:

          只是添加一些东西,因为我过去做过同样的事情。如果您想让您的计算机对手更容易受到攻击,您可以使用极小极大算法来评估可能的动作。如果您需要有时会输的不太强大的对手,它会变得更加现实。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多