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

Jav*_*ram 14 c# artificial-intelligence

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

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

Mic*_*tum 24

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

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

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

 X  |    |
----+----+----
    |    |
----+----+----
    |    |
Run Code Online (Sandbox Code Playgroud)

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

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

 X  |    |
----+----+----
    | O  |
----+----+----
    |    |
Run Code Online (Sandbox Code Playgroud)

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

 X  |    |
----+----+----
    | O  |
----+----+----
    |    | X 
Run Code Online (Sandbox Code Playgroud)

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

 X  |    |
----+----+----
    | O  |
----+----+----
    | O  | X 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 唯一获胜的举动是不打? (9认同)
  • @Ben如何换一场精彩的国际象棋游戏呢? (3认同)
  • @迈克尔:后来.让我们玩全球热核战争吧. (3认同)
  • @Michael,这可能会有所帮助,它会产生所有可能的结果,可以用来构建一个查阅表/ http://codegolf.stackexchange.com/questions/1065/the-tic-tac-toe-dictionary (2认同)

pax*_*blo 6

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

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

这是我使用的情报位.

分配了一个字节数组,给出了每个状态的可取性,并且这些都被初始化为127,因此所有状态都是同样可取的.为了让AI选择举动作,它加起来,可能会导致从所有国家的得分可能的移动和使用的生成随机数选择哪个移动它将使.

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

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

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

期望从未降到零的原因是没有任何州不可能获得.当然,一个有意愿分数之一是非常不可能的,如果所有的人有更高的分数.

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

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

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