当前位置:  开发笔记 > 编程语言 > 正文

gomoku的AI策略(tic tac toe的变体)

如何解决《gomoku的AI策略(tictactoe的变体)》经验,为你挑选了5个好方法。

我正在写一个游戏,它是Gomoku的变种.基本上是一个巨大的板上的tic tac脚趾.

想知道是否有人知道一个好的人工智能策略.我目前的实现是非常愚蠢的,需要很长时间(O(n ^ 3),大约1-2秒才能移动):

-(void) moveAI {
    //check if the enemy is trying to make a line horizontally, vertically, or diagonally
    //O(n^3 * 3)
    [self checkEnemies];

    //check if we can make a line horizontally, vertically, or diagonally
    //O(n^3 * 3)
    [self checkIfWeCanMakeALine];

    //otherwise just put the piece randomly
    [self put randomly];
}

编辑:谢谢大家的反馈!我会尝试你的答案,让你们知道我是否可以做出任何改进.



1> TMS..:

对于gomoku,已经找到了获胜策略.见本文:L.Victor Allis,HJ van den Herik,MPH Huntjens.Go-Moku和威胁空间搜索.当我写自己的程序时,它对我帮助很大.通过这种方式,你将能够编写出能够很好地攻击对手并找到胜利组合的程序.


如果有人已经找到了完美的策略,那么编写自己的程序就没有乐趣 - 搜索自己更有趣!:)但感谢链接.赞成你.

2> Kaganar..:

为这类游戏编写AI的传统且相当有效的策略是典型的树搜索策略.也就是说,每个板状态在图形中形成节点,并且在每个节点和可以由单个移动产生的状态之间放置有向边缘.以这种方式构建树,其中根板是空节点.然后,以一种巧妙的方式遍历树,找到看起来像"好"的状态."良好"状态通常通过使用一些聪明的启发式的评估函数来度量.显然你不想访问树中的所有节点 - 这将是很多工作!你只想要一些聪明的东西.

您可以添加预先计算的早期游戏和结束游戏以加速这些场景,然后依靠针对游戏中期的优化的树遍历启发式算法.

这种树遍历算法的实际名称是"Minimax"算法.在维基百科上寻找它,你会看到很多相当不错的材料.有一些方法可以提高算法的效率,其中最引人注目的是alpha-beta修剪,所以一定要看一下.您可能需要查看connect-four启发式方法,并决定如何将它们应用到游戏中.例如,用于评估电路板状态的可能良好的启发式方法是计算可连续的2次运行,3次运行和4次运行的数量,并将它们加权到分数中.(例如,每次2次运行值1点,每次3次运行值10点,每次4次运行值1000点)

另一种优化策略是开发一种启发式算法,优先考虑minimax算法应该搜索的位置 - 通常通过估计板评估函数的某种确定性.

有了这个策略,你应该能够在相同的时间内获得不那么愚蠢的AI.然而,真的,非常好的AI需要花费很多精力来构建,即使在这些"简单"的游戏中,它仍然可能需要超过10秒或更长时间才能让聪明的动作不受影响.另一方面,有一些聪明的编程技巧,例如在人类对手忙于思考时通过树预先计算遍历.嘿,人类可以在计算机的同时思考.公平是公平的!

希望我能得到一些帮助.祝好运!这是一个有趣的项目.


好评.但有一件事:计算终端游戏在Gomoku中是不现实的.它适用于国际象棋或西洋棋,由于事实上只剩下很少的游戏棋子,因此最终游戏更容易计算.另一方面,在gomoku中,件数增加(每一步都是新件),所以它不起作用.

3> Rauni Lillem..:

我一直试图为同一个程序创建一个算法.

你当然应该做的第一件事就是检查是否有办法形成5并取胜.如果没有,那么下一个应该是检查你的对手是否可以做到这一点,如果是,那么防守.

你有多少玩过自己的gomoku?你对基础知识的掌握程度如何?

好的,下一步是思考:我们如何才能获得能够获胜的位置?显然,要赢,我们必须连续四次.但它我们只是连续形成四个这样的:

__________
____XOOOO_
__________

然后对手可以关闭它.

但如果我们形成"开放四",就像这样:

__________
____OOOO__
__________

然后对手不能关闭双方,你可以赢.因此,形成一个开放的四是获胜的一种方式.现在问题是:我们怎样才能形成一个开放的四个?当然,如果我们形成"开放三",就像这样:

__________
____OOO___
__________

然后对手可以阻止我们:

___________
____XOOO___
___________

我们回到了开始.

为了获胜,我们可以同时组成两个空位三分球:

____________
____OOO_____
_____O______
____O_______

现在,如果对手阻挡其中一个,我们可以使用另一个来形成一个开放的四个:

____________
_______O____
___XOOO_____
_____O______
____O_______
____________

赢了:

________O___
_______O____
___XOOO_____
_____O______
____O_______
___X________

在gomoku术语中,如果您同时进行两次打开三分球,则称为3x3.

请注意,两个三分必须是开放的:你能理解为什么吗?

还有其他获胜方式:

4x3:你看到胜利的举动以及为什么赢了?

____________
__XOOO______
__XXXO______
____OX______
____________

4x4:看到获胜的举动?

____________
__XOOO______
__XXXO______
__OXOX______
___O________
__X_________

这些只是游戏的基础.了解这些策略有助于您思考如何构建AI,因此您可以对原则进行硬编码.

当然,这只是一个开始.如果你能尝试实现这一点然后给我反馈,我将不胜感激.

我一直在尝试用Java编写程序.你想看看我做过的代码吗?你可以玩游戏吗?它还不是很好,但你可以从中获得新的想法.虽然注释和变量名称是用爱沙尼亚语编写的,但可能很难理解.:(



4> Gurgeh..:

我创造了一个gomoku播放器一次,它使用alpha-beta修剪非常成功,并给每个位置一个分数取决于每个玩家有多少半打开和完全打开的2s,3s和4s.

计算这不是n ^ 3.您只需检查最新的移动是否会关闭任何对手线,如果它延伸了一些线,则相应地修改得分.

如果你需要它玩得更好,我会研究一些国际象棋电脑的技术.例如,尝试"杀手移动"(记住哪些移动得分高或在其他位置直接获胜)首先搜索时会显着提高树搜索的效率.重要的是在alpha-beta修剪中首先尝试假定的最佳动作.

当你拥有你的玩家时,你应该尝试通过互相玩不同的版本来找出不同元素(2s,3s,4s,开放和半开放等)的得分最好.



5> Tomas Kubes..:

五子棋可以解决,但在空缺位置和有限的资源下玩不能解决。

我是Hewer gomoku程序和Gomocup组织者的作者,我可以告诉你,编写好的Gomoku AI需要花费很长时间。人居要复杂得多。您可以使用Gomocup界面简化工作,并编写“仅” AI。

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有