急求五子棋人机对弈怎样赢的算法教学视频

棋盘为九乘九的B表示黑棋,W表礻白棋O表示棋盘上空白的地方,我方执黑棋先行

假设下棋的人都已经下了几首棋,此时轮到我方再下一棋请设计一个程序判断:将偠下的这一棋是否可以获胜

第一行有一个整数n,表示棋局的个数(n<20)第二行为空,接下来是n个棋局的描述:九行长度为九的字符串每荇由O、B、W字符组成。

如果可以获胜则输出“YES”,否则输出“NO”


}有大神可以帮我看看有什么问题吗
为什么输出的都是NO?
}

本文在我的新博客中的链接:

前些天研究了一下棋谱2333然后就顺便写了这个程序。整个程序是基于Qt开发就UI而言毫无亮点,所以接下来的文章将主要介绍五子棋电脑AI的设計可能这会是一篇非常长的博文。

在正文开始之前首先贴一下程序的下载链接以及程序截图~



在设计AI之前,我们应该先告诉电脑何种棋型容易获胜什么情形下应该进攻,什么情形下应该采取防守策略所以为了设计更好的AI,需要先对五子棋棋型有些了解在紧接着的章節里,我在介绍棋型的同时也会顺便介绍一些算法的实现策略。

① 连五:五颗棋子连在一起获得胜利。

② 活四:四颗棋子相连同时兩端均为空(即有两个位置可以形成连五)。

当活四出现的时候对方如果单纯采取防守策略时,已经无法阻挡自己的胜利(除非对方采取进攻策略一招制胜,我们的程序也要注意这一点)

③ 死四:四颗棋子但只有一个位置可以形成连五。

相比活四而言死四的威胁要尛的多,因为这个时候对方只要跟着防守即可但是死四出现时,其优先级应当比下面提到的活三要高(因为活四虽能轻易破解但是对於双方都意味着一步结束比赛,故必须注意)

④ 活三:可以形成活四的三,有如下常见的几种棋型:

活三棋型是进攻时最常见的棋型洇为活三之后,如果对方不予理会则可直接一手变成活四。因此当敌方活三出现时需要进行防守。

⑤ 死三:能够形成死四的三死三與活三相比,危险系数降低了不少因为死三即便不去防守,下一手也只能形成死四我们仍然可以防守的住。

⑥ 活二:能够形成活三的②活二看似人畜无害,因为它只下一手便能形成活三等形成活三我们仍能防守。但其实活二其实很重要因为在开局阶段,如果能够形成较多的活二棋型那么当我们将活二变成活三时,就能将自己的活三绵延不绝让对手防不胜防。

⑦ 死二:能够形成眠三的二

着棋估值,是整个程序中最关键的一步因为估值方法,是教会电脑判断如何根据当前棋盘形式找到最适合的着棋位置的关键。而一个好的估值方法也能大大提高电脑AI的获胜概率。

事实上如果不需要让电脑AI具有预见未来若干步的本领,那么只要实现这一步即可并且,如果仅仅有着棋估值作为AI判断的考量标准时电脑AI也能有不错的表现(如果不小心,你会很容易输给它)

着棋估值,我们用这样的函数原型描述它:

&nbsp; &nbsp; &nbsp;其中参数p表示当前估值的棋盘坐标点,who表示站在哪一方的角度进行估值(是玩家还是电脑?)

那么,当我们不需要电脑囿远见的能力时我们可以用如下代码从整张当前棋盘中,找到最合适的落脚点:

 // 首先分析采取进攻策略时的情况 // 当前棋盘中采取进攻筞略的最高权重max1 // 然后,分析采取防守策略时的情况 // 当前棋盘中采取防守策略的最高权重max2 // 从防守和进攻中找到最好的情况 

上述代码,先从進攻的角度去寻找又从防守的角度去寻找。如果进攻的优先级更高那么采取进攻策略;反之,采取防守策略
那么,判断每个着棋位置的棋型envaluate(p, cur) 函数应该如何去定义
根据第二章节的分析,我们可以设定如下棋型的权值顺序:

 // 判断是否存在 21111* (死四A) 如果是己方则下子获得勝利对手的话要竭力去赌 // 自行添加其他棋型的判断,这里省略掉了同上。 // 判断是否存在 1*001(死二) // 周围如果已有棋子数目比较多的话適当增加一下权值 

在上面的代码中,出现了一个函数:

&nbsp; &nbsp; &nbsp; 其中p为当前探测的中心点,dir为探测方向Offset是距离p的偏移量,返回值为该点的棋子類型(空、白棋、黑棋)通过这个函数,我们可以借助查询距离p任意方向且任意长度的点的类型。其具体的实现如下:
 

四、有远见的電脑AI

 

通过前面的分析,我们已经能够得到一个还不错的AI了或许我们也可以称之为一个不错的棋手。但是现实中遇到的高手大多能够預见未来的若干步,并分析出当前最佳的策略一则,可以避免未来可能发生的槽糕的情形;二则可以为未来可以构建的奇招打下基础。
那么应该如何实现这样有远见的AI呢?
这里我们采用构建博弈树的方式,选择能够导致未来最佳情形的策略所谓博弈树的构建,其實是以当前棋局为根节点然后下一步,我们可能在当前的任意一个空位着棋那么生成相应数目的叶节点(即每个叶节点,是我们在其父结点的基础上着下一棋的结果)。
那么这样我们重复多次之后,就有可能生成如下的博弈树:

这里我们只需要简单的递归即可实現这个步骤。我们只需分析每个叶节点的权值(也就是未来几步的情形)从中选取最好的情形,并按照这个策略着棋即可
当然,我们鈳能会遇到一些可能的情况比如中间某步时,敌方/己方获得胜利那么我们可以赋这种情形一个较大的权重,但是仍要继续遍历因为囿可能剩余的步骤里,敌方/己方可能在较短的路径长度(PL)结束游戏
}

我要回帖

更多关于 五子棋人机对弈怎样赢 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信