五子棋AI算法的改进方法讲解--实用.doc

合集下载

【一分钟围棋】看看AI对老定式的修正,可以更好地理解棋理

【一分钟围棋】看看AI对老定式的修正,可以更好地理解棋理

【一分钟围棋】看看AI对老定式的修正,可以更好地理解棋理例一例一:老定式。

AI变招一AI变招一:白4刺,黑5粘,白6再飞,黑7再尖三三显然呆重,白8高拆棋形舒展。

AI变招二AI变招二:黑5尖三三,白棋可以根据情况回拆A、B或者C位。

以后有机会可以D位逼住冲断。

例二例二:老定式。

AI修正一AI的修正:白棋不做A位的二路扳粘,避免强化黑棋外势,是这一修正的关键点。

AI变招一AI变招一:黑5飞,依照白棋的走法再定下一步的应对,白6、8是一种方法。

白8直接托,成为流行的'芈氏飞刀'的可能行很大(原先的文章有介绍,不再赘述)。

AI变招二AI变招二:黑9扳,白棋重视边空的下法。

以后角上的补棋或者打吃等手段,都是官子了。

AI变招三AI变招三:黑11断,至白16长出,也很有趣,黑到底拔掉白8一子还是连回黑9一子,有些纠结。

AI变招四AI变招四:白14提子,白16点刺,黑17以后就要看双方的战斗力了。

例三例三:当年流行的小飞定式,几乎已经淘汰。

主要原因是AI认为白4这手棋不紧凑,黑5即使脱先,对黑棋也无严厉的攻击手段。

AI修正版本AI修正版本:白4、6连扳。

现在这种走法成为定式。

例四例四:当年的流行定式。

AI认为A、B位的骚扰对黑棋外势影响很大。

AI的修正版本AI的修正版本:黑11爬过。

例五例五:过去的基本定式。

AI认为白4黑5都不是好棋。

AI修正版本AI修正版本:白4飞压,黑5冲断作战是正道。

AI修正版本二AI修正版本二:白4尖,黑5也要大飞,白6飞进角,黑7就满意。

例六例六:定式没有黑15与白16的交换。

AI认为白8托过不好,让黑棋获取了外势,黑15不必保留,走完脱先即可,黑好。

AI修正版本AI修正版本:白8至14强硬压出。

例七例七:老定式。

AI黑11与白12太保守,应该再奔放一些。

AI的修正版本一AI的修正版本一:黑11、白12提高效率,黑13再压。

AI的修正版本二AI的修正版本二:黑11补,白12至20的走法双方都可下。

五子棋人工智能的分析与实现

五子棋人工智能的分析与实现

五子棋人工智能的分析与实现摘要:机器博弈是人工智能的一个重要研究分支,本文通过设计一个五子棋智能博奕程序,采用传统的博弈树算法,利用剪枝和极大极小树搜索最佳位置,从而实现人机智能博弈。

并对现有算法存在的问题进行探究改进,最后给出程序实例,结果表明效果比较理想。

关键词:五子棋;人工智能;博弈;1 主要传统算法1.1 博弈树传统的算法是采用博弈树法来设计程序。

以甲乙两人下棋为例,甲有很多种落子方式,乙也有多种应对走法,如果把所有的走法列出来,自然就构成了一棵树,即为搜索树,也称博弈树。

树的根结点为先手的第一步走法,下面的走法构成了树的子结点,直至棋局结束。

显然,如果棋盘足够大,子结点数会以几何级数上升,而我们的任务是从这些子结点中寻找一个对己方最有利的结点,从而得到棋局的最佳走法。

这必然是一个指数复杂度的过程,费时低效,无法搜索到最终结果(除了棋局结束),通常只能达到一个有限的深度,在有限的范围内来判断走法的好坏,得到一个局部最优解。

[2-3]因此,有必要做一些调整改进,以提高算法的效率和质量。

1.2 极大极小算法极大极小搜索算法就是在博弈树在寻找最优解的一个过程,这主要是一个对各个子结点进行比较取舍的过程,定义一个估值函数F(n)来分别计算各个终结点的分值,通过双方的分值来对棋局形势进行分析判断。

还是以甲乙两人下棋为例,甲为max,乙为min。

当甲走棋时,自然在博弈树中寻找最大点的走法,轮到乙时,则寻找最小点的走法,如此反复,这就是一个极大极小搜索过程,以此来寻找对机器的最佳走法。

其中估值函数通常是为了评价棋型的状态,根据实现定义的一个棋局估值表,对双方的棋局形态进行计算,根据得到的估值来判断应该采用的走法。

棋局估值表是根据当前的棋局形势,定义一个分值来反映其优势程度,来对整个棋局形势进行评价。

本程序采用的估值表如下:一般来说,我们采用的是15×15的棋盘,棋盘的每一条线称为一路,包括行、列和斜线,4个方向,其中行列有30路,两条对角线共有58路,整个棋盘的路数为88路。

人工智能五子棋实验报告

人工智能五子棋实验报告

题目:智能五子棋游戏一、实验目的理解和掌握博弈树的启发式搜索过程和α-β减枝技术,能够用某种程序语言开发一个五子棋博弈游戏。

二、实验要求(1)设计一个15行15列棋盘,要求自行给出估价函数,按极大极小搜索方法,并采用α-β减枝技术。

(2)采用人机对弈方式,对弈双方设置不用颜色的棋子,一方走完后,等待对方走步,对弈过程的每个棋局都在屏幕上显示出来。

当某一方在横、竖或斜方向上先有5个棋子连成一线时,该方为赢。

(3)提交一篇实验论文,以及完整的软件(包括源程序和可可执行程序)和相关文档。

三、实验原理①估价函数的设计:下子后,求在该点的所有8个方向上4格之内的所有的没有阻隔的白子的和加上没有阻隔的黑子的数目之和,和为估价函数的值。

直观来说就是,如果在该点下子后连成同颜色的棋子越多,该点的估价值越大,同时阻挡另一种颜色的棋子越多,估价值也越大。

②判断是否有一方胜出:设计is_win函数,在每一次下子后检查是否是终局(一方胜出或者棋盘下满和局)。

对于棋盘上每一个已经下了棋子的点,检查其4个方向上是否有连续5颗同颜色的棋子,若有,则有一方胜出。

③寻找候选点,用于建立博弈树:对于棋盘上每一个还没有下子的点,测试其附近8个点是否已经下了棋子,若有,把该点加入候选点。

④搜寻最佳着点:根据候选点建立3层的博弈树,再利用估价函数对节点进行比较,得出最佳着点。

四、代码人主要代码public void refreshMax(int n){switch(n){case 1:{ //更新预测棋盘1最大值及其坐标maxValue1=0;number1=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard1[i][j]>maxValue1){maxX1.clear();maxY1.clear();maxX1.add(i);maxY1.add(j);number1=1;}else if(preBoard1[i][j]==maxValue1){maxX1.add(i);maxY1.add(j);number1++;}}}break;}case 2:{ //更新预测棋盘2最大值及其坐标maxValue2=0;number2=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard2[i][j]>maxValue2){maxX2.clear();maxY2.clear();maxX2.add(i);maxY2.add(j);number2=1;}else if(preBoard2[i][j]==maxValue2){maxX2.add(i);maxY2.add(j);number2++;}}}break;}case 3:{ //更新预测棋盘3最大值及其坐标maxValue3=0;number3=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard3[i][j]>maxValue3){maxX3.clear();maxY3.clear();maxX3.add(i);maxY3.add(j);number3=1;}else if(preBoard3[i][j]==maxValue3){maxX3.add(i);maxY3.add(j);number3++;}}}break;}case 4:{ //更新预测棋盘4最大值及其坐标maxValue4=0;number4=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard4[i][j]>maxValue4){maxX4.clear();maxY4.clear();maxX4.add(i);maxY4.add(j);number4=1;}else if(preBoard4[i][j]==maxValue4){maxX4.add(i);maxY4.add(j);number4++;}}}break;}case 5:{ //更新预测棋盘5最大值及其坐标maxValue5=0;number5=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard5[i][j]>maxValue5){maxX5.clear();maxY5.clear();maxX5.add(i);maxY5.add(j);number5=1;}else if(preBoard5[i][j]==maxValue5){maxX5.add(i);maxY5.add(j);number5++;}}}break;}case 6:{ //更新预测棋盘6最大值及其坐标maxValue6=0;number6=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard6[i][j]>maxValue6){maxX6.clear();maxY6.clear();maxX6.add(i);maxY6.add(j);number6=1;}else if(preBoard6[i][j]==maxValue6){maxX6.add(i);maxY6.add(j);number6++;}}}break;}case 7:{ //更新预测棋盘7最大值及其坐标maxValue7=0;number7=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard7[i][j]>maxValue7){maxX7.clear();maxY7.clear();maxX7.add(i);maxY7.add(j);number7=1;}else if(preBoard7[i][j]==maxValue7){maxX7.add(i);maxY7.add(j);number7++;}}}break;}}}AI主要代码public void refreshMax(int n){switch(n){maxValue1=0;number1=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard1[i][j]>maxValue1){maxValue1=preBoard1[i][j];maxX1.clear();maxY1.clear();maxX1.add(i);maxY1.add(j);number1=1;}else if(preBoard1[i][j]==maxValue1){maxX1.add(i);maxY1.add(j);number1++;}}}break;}maxValue2=0;number2=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard2[i][j]>maxValue2){maxValue2=preBoard2[i][j];maxX2.clear();maxY2.clear();maxX2.add(i);maxY2.add(j);number2=1;}else if(preBoard2[i][j]==maxValue2){maxX2.add(i);maxY2.add(j);number2++;}}}break;}maxValue3=0;number3=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard3[i][j]>maxValue3){maxValue3=preBoard3[i][j];maxX3.clear();maxY3.clear();maxX3.add(i);maxY3.add(j);number3=1;}else if(preBoard3[i][j]==maxValue3){maxX3.add(i);maxY3.add(j);number3++;}}}break;}maxValue4=0;number4=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard4[i][j]>maxValue4){maxValue4=preBoard4[i][j];maxX4.clear();maxY4.clear();maxX4.add(i);maxY4.add(j);number4=1;}else if(preBoard4[i][j]==maxValue4){maxX4.add(i);maxY4.add(j);number4++;}}}break;}maxValue5=0;number5=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard5[i][j]>maxValue5){maxValue5=preBoard5[i][j];maxX5.clear();maxY5.clear();maxX5.add(i);maxY5.add(j);number5=1;}else if(preBoard5[i][j]==maxValue5){maxX5.add(i);maxY5.add(j);number5++;}}}break;}maxValue6=0;number6=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard6[i][j]>maxValue6){maxValue6=preBoard6[i][j];maxX6.clear();maxY6.clear();maxX6.add(i);maxY6.add(j);number6=1;}else if(preBoard6[i][j]==maxValue6){maxX6.add(i);maxY6.add(j);number6++;}}}break;}maxValue7=0;number7=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard7[i][j]>maxValue7){maxValue7=preBoard7[i][j];maxX7.clear();maxY7.clear();maxX7.add(i);maxY7.add(j);number7=1;}else if(preBoard7[i][j]==maxValue7){maxX7.add(i);maxY7.add(j);number7++;}}}break;}}}五、感想通过这个试验,我对估价函数,极大极小搜索方法,α-β减枝技术有了更全面的认识,对它们的运用也更加熟练。

五子棋人工智能算法设计与实现

五子棋人工智能算法设计与实现

五子棋人工智能算法设计与实现一、引言五子棋,作为一种古老而又广泛流行的棋类游戏,一直以来都备受人们的喜爱。

它不仅考验玩家的智力和思维能力,同时也是人工智能算法在博弈领域中的经典案例之一。

本文将重点探讨五子棋人工智能算法的设计与实现,通过对五子棋的规则和特性的分析,提出一种基于博弈树查找的算法,并进行相应的试验,来验证这一算法在五子棋中的有效性。

二、五子棋的规则和特性五子棋是一种双人对弈的棋类游戏。

目标是在一个15x15的棋盘上,以先连成五子的玩家为成功。

每个玩家交替下子,只能在无子的位置下子,棋子只能放在网格交叉点上。

在五子棋中,我们需要思量如下几个规则和特性:1. 规模较小:相较于国际象棋等游戏,五子棋的规模较小,棋盘上只有225个空位,而且在早期阶段每个空位都有浩繁可供选择的位置。

2. 复杂度高:尽管规模小,但五子棋的游戏复杂度分外高,奕棋的每一步对于后面的局势都会产生重要的影响。

3. 查找空间大:在五子棋中,游戏的可能走法分外多,依据计算,一个人的平均走法数可以达到10^170种。

基于以上特点,设计一个高效的五子棋人工智能算法是分外具有挑战性的。

三、五子棋人工智能算法的设计思路针对五子棋的规则和特性,我们提出了一种基于博弈树查找的算法,以实现人工智能在五子棋中的应用。

1. 构建博弈树:起首,我们需要构建五子棋的博弈树。

根节点表示当前局面,每个子节点表示每一步的奕棋位置。

我们假设每个玩家都做出最优的选择,通过递归的方式,构建一棵完整的博弈树。

2. 构建评估函数:为了对博弈树进行评估,我们需要设计一个评估函数来评估每个局面的优劣。

该函数可以依据棋盘上的棋子分布状况、连子数目以及棋子的位置等来计算得分,越高表示该局面越好。

3. Alpha-Beta剪枝:由于查找空间分外大,传统的博弈树查找算法效率较低。

为了提高查找效率,我们引入Alpha-Beta剪枝算法。

这一算法可以在查找过程中剪去一些不必要的分支,使查找过程更加高效。

五子棋AI算法分析

五子棋AI算法分析

五子棋AI规则五子棋AI算法分析:制作五子棋的AI ,我们首先从五子棋的规则谈起,五子棋分为“有禁手”和"无禁手" 两种规则。

相对而言,“有禁手”的规则更为专业些,而“无禁手”的规则更为大众些,所以,这里我们以“无禁手”的规则制作五子棋游戏。

对于五子棋的AI 而言,主要的思路就是对棋盘上的棋子进行分析,记录自己与对手的棋型,进而对其进行判断,根据对自己更有利的原则,进行优先级分析,然后选定要下棋子的点,并对其进行赋值。

下面是五子棋的棋型的分类:1.五子:某一方形成五个相同颜色的棋子相连2.活四:形成四子相连,并且两端是都没有子的3.冲四:形成四子相连,并且有一端是有对方棋子或者是墙壁,而另一端是没有子的4.活三:形成三子相连,并且两端是都没有子的5.死三:形成三子相连,并且有一端是有对方棋子或者是墙壁,而另一端是没有子的6.活二:形成两子相连,并且两端是都没有子的7.死二:形成两子相连,并且有一端是有对方棋子或者是墙壁,而另一端是没有子的8.单子:一个棋子最后是对形成各种棋型进行一个评估,以方便于去对下子的位置做出最优的选择。

所以给落子的“点”相应的评分,去判断该点会形成什么样的棋型:1.五子:1002.活四:803.活三: 704.冲四: 605.死三:506.活二: 407.死二:308. 单子:0接下来就是对<自己的棋型>进行分析,然后对<对方的棋型>分析,进而对自己和对家进行总体的打分,得出自己应该是应该进行进攻还是防守。

(这是一个基本思路,具体在实现过程中在进行添加)高级AI 思索:将每个位置进行分析,假设AI落子在该位置,用以上打分规则为AI打分,并将得到的分数加一。

然后,假设玩家落子在该点,为玩家打分,然后将所有的分值汇总。

取最高分作为这个位置的估分,接下来就是取分数最高的位置下棋了。

“位置估分”,下棋的时候,既可以考虑到自己攻击对手,又能考虑到对对手的防御,可以说,很多时候可以顶上考虑两步的AI。

五子棋规则改进研究

五子棋规则改进研究

五子棋规则改进研究五子棋,这一历史悠久的棋类游戏,深受人们的喜爱。

在我国,它被称作“连珠”或“五目连珠”,其规则经过长时间的发展已经相当成熟。

然而,随着时代的进步,对五子棋规则进行改进的讨论也未曾停止。

传统的五子棋比赛中,选手们轮流在棋盘上放置黑子和白子。

一般情况下,棋盘的规格为15×15的方格,但也有使用更大或更小的棋盘的情况。

游戏的目标是率先在棋盘上形成横线、竖线或斜线中的任意一条连续的五子直线。

然而,传统规则亦存在一些问题。

例如,由于黑子具有先手优势,棋局的结果在一定程度上受到起始布局的影响。

另外,在比赛过程中,有时会出现双方实力明显不均的情况,这使得比赛失去了一定的公平性。

因此,针对这些问题,对五子棋规则进行改进显得尤为重要。

一种可能的改进方案是采用随机的方式决定执黑子和白子的顺序,以此平衡先手优势。

比赛开始前,可以通过抛硬币、抽签等方式来确定哪一方先行,这样可以在一定程度上确保比赛的公平性。

另一个建议是引入计时制度,限制每位选手的落子时间。

例如,可以规定每回合的落子时间不超过30秒,这样可以增加比赛的节奏,提高选手的思维敏捷性和决策能力。

为了增加比赛的观赏性,还可以考虑在棋盘上设置特殊的标记或陷阱。

例如,可以在棋盘的某些位置设置“禁手”,使得该位置上的棋子无法形成有效的连线。

或者,在棋盘上设置一些“宝藏”,率先找到这些宝藏的选手可以获得一定的奖励。

这些改进都可以使得比赛更加有趣和具有挑战性。

总的来说,五子棋规则的改进是一个需要不断尝试和创新的过程。

通过改进规则,我们可以使得比赛更加公平、激烈和吸引人,从而激发更多人参与五子棋这项运动的热情。

五子棋人工智能算法设计与实现

五子棋人工智能算法设计与实现

五子棋人工智能算法设计与实现五子棋是一种流行的策略游戏,玩家需要在一个15×15的棋盘上相互交替放置黑色和白色的棋子。

游戏的规则简单,但在实际游戏中,需要考虑到许多因素,例如棋盘的当前状态、对手的反应以及自己的策略,这使得五子棋成为一个很有挑战性的游戏。

在设计和实现一个五子棋算法时,需要考虑以下步骤:游戏状态表示:算法首先需要一个方法来表示当前的游戏状态。

这可以通过一个函数来完成,该函数接受当前棋盘上的所有棋子作为输入,并返回一个字符串或字节串表示当前游戏状态。

搜索算法:搜索算法是人工智能算法的核心,它需要找到一个好的落子位置。

常见的搜索算法有暴力搜索、极小化极大搜索(MinMax)算法以及A*搜索算法等。

在五子棋中,可以使用极小化极大搜索算法来找到一个好的落子位置。

评估函数:评估函数用于评估棋盘的当前状态以及每个可能落子的得分。

在五子棋中,评估函数需要考虑当前棋盘上的连珠、对手的威胁以及自己可能形成的威胁等因素。

剪枝:在极小化极大搜索算法中,可以使用剪枝来减少搜索的深度和广度。

通过剪枝,可以排除一些明显不好的落子位置,从而提高搜索效率。

玩家和电脑的落子:在实现算法时,需要编写一个函数来处理玩家和电脑的落子。

这个函数应该接受当前游戏状态和玩家选择的落子位置作为输入,然后更新棋盘状态并返回下一步棋盘状态和落子信息。

游戏结束条件:算法还需要检测游戏是否已经结束。

在五子棋中,当一方获胜时,游戏结束。

public class Gomoku {private static final int SIZE = 15;private int board = new int[SIZE][SIZE];private int heuristic = new int[SIZE][SIZE];public void init() {for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {board[i][j] = 0;public int get(int x, int y) {return board[x][y];public void set(int x, int y, int player) {board[x][y] = player;}随着技术的飞速发展,高性能计算在各个领域的应用越来越广泛。

(完整版)五子棋人工智能课题毕业论文设计

(完整版)五子棋人工智能课题毕业论文设计

人工智能专家系统论文题目五子棋AI算法和网络通信的研究学生姓名陈维梅学号系别商务学院年级2009专业计算机科学与技术指导教师职称讲师完成日期五子棋AI算法和网络通信的研究摘要:本系统将利用五子棋游戏作为研究对象,通过设计出一个能够实现两种不同对战模式的五子棋游戏。

并对所涉及到的相关技术进行初步的探讨,将重点放在人机对奕中AI算法研究方面。

游戏中提供两种选择模式:人机对战和人人对战。

在人机对战中玩家通过选择不同的AI等级和电脑一决高下。

在人人对战中双方可以进行下棋,悔棋但要通过对方的同意。

同时还可以实现在线聊天。

AI的不同等级是以不同的搜索深度确定的。

本系统以深度为2,3,4分别为初级,中级,高级。

网络对战中则使用Socket实现点对点通信。

关键字:五子棋、博奕AI算法、网络通信Research the AIof Renju and the CommunicationSummary:This system will use Renju as research objects, passing to design a Renju game that can provide two kinds of dissimilarities to the play mode.to involve to of the related technique carry on the study of the first step, play more attention in the AI calculate way research aspect.It provide two kinds of choice modes in the game:Person's machine to the war and the everyone to war.The player passes to choose the different AI grade and computer in person's machine the rightness the war a definitely superiority.Both parties can carry on play chess in the everyone the rightness the war, the regrets chess but want to pass the approval of the other party.Can also carry out on-line chat in the meantime.AI different grade with search the depth assurance differently.This system takes depth as 2, 3, 4 is an entry-level respectively, medium class, using the Socket realization to order in the war to.Key word: Renju ,AI,networks目录第一章引言 (4)1.1问题背景 (4)1.2五子棋简介 (5)第二章详细设计过程 (5)2.1.概要介绍 (5)2.1.1 本程序介绍 (5)2.1.2 本程序优点 (5)2.2用软件工程方法学指导开发过程 (5)2.2.1 问题定义 (6)2.2.2 可行性研究 (7)2.2.3 需求分析 (8)2.2.4总体设计 (9)2.2.5 详细设计 (10)2.2.6 编码和单元测试 (10)2.3用户界面 (10)2.4系统解析 (11)2.4.1 界面部分 (11)2.4.1.1CFiveChessView的属性 (11)2.4.1.2CFiveChessView的函数 (12)2.4.2 通信部分 (14)2.4.3 其他部分 (15)2.4.3.1 CMatch---棋盘类 (16)2.4.3.2 CMessg—消息类 (17)2.4.3.3 CComputer—电脑类 (18)2.5.人机对战中的AI算法 (18)2.5.1 极大极小树 (19)2.5.2深度优先搜索(DFS) (19)2.5.3 剪枝方法 (20)2.5.4 静态估值函数 (21)2.5.5AI算法的分析和改进 (21)2.5.5.1算法分析 (22)2.5.5.2 算法改进 (24)第三章运行测试 (25)3.1 网络部分 (25)3.2 人机部分 (25)第四章总结部分 (27)4.1 系统总结 (29)4.2 不足说明 (29)4.3 致谢 (28)参考文献 (29)第一章引言1.1 问题背景计算机运算速度一直遵循着摩尔定律在飞速的发展,随着这些技术的快速发展,使得大规模的运算得以在很短的时间内实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

又是本人一份人工智能作⋯⋯首先道歉,从Word到Livewrter,好多格式没了,也没做代高亮⋯⋯大家凑活着看⋯⋯想做个好的人机弈的五子棋,可以需要考的是很多的,我将制作有大AI 五子棋的程分十四步,我来步步介。

第一步,了解禁手做一个五子棋的程序,自然五子棋需要有足的了解,在默大家在和我研究五子棋之前了解是一多的。

以个基,介多数人不大熟悉的方面。

五子棋的上有两种:有禁手和无禁手。

由于无禁手的比,因此被更多人所接受。

其,于下五子棋的人来,有禁手才是。

所以,里先“有禁手” 行一下介:五子棋中“先手必”已得到了,似“花月定式”和“浦月定式”,很多先手必下法然需要大量的,但高手确能做到必。

所以五子棋的行了化,得到了“有禁手”五子棋。

五子棋中,黑棋必然先行。

因此“有禁手”五子棋技中黑棋有以下“禁手”限制:“三三禁”:黑棋下子位置同形成两个以上的三;“四四禁”:黑棋下子位置同形成两个以上的四;“ 禁”:六子以上的黑棋成一。

黑棋如下出“禁手“ 上掉棋局。

不如果“ 五”与“禁手”同出“禁手”是无效的。

所以于黑棋只有冲四活三(后面会有解)是无解局面。

反白棋多了一种方式,那就是逼迫黑棋必定要下在禁点。

了迎合所有玩家,五子棋自然需要做出两个版本,或者是可以行禁手上的控制。

第二步,游界面里,我制作了一个的界面,但是,于人机弈来,用。

和很多网上的精美界面相比,我的界面也略粗糙,但,开速度高,用了不到半天。

下面我看下界面的做法。

界面我采用了 WPF ,表和完全分开,前台基本可以通拖拽完成布局,里就不做多介。

根据界面截介1 处实际上市两个渐变Label 但是没有做事件响应。

通过按钮属性。

也许有人会奇怪,为什么的拼接,2 、3 是两个 label ,4 、 56 、7 、8 、9的控制,修改labelButton 会丝毫看出不出有Button实际上是两个Button,和 Button的Content的影子,这里战友whrxiao 写过一个Style 如下<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type Button}"><Grid><ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True"/></Grid></ControlTemplate></Setter.Value></Setter></Style>这里我们把这个Style称为Style1。

界面逻辑上,将是否开始、是否禁手和是否电脑先行作为两个全局变量的布尔型值,通过设置和判断 bool 型值进行逻辑上的控制。

中间的棋盘是个canvas ,一个 15*15 的 Grid 放满 Button 并将每个 Button 应用 Style1 开始时候透明度设为 0 ,也就是根本看不到,在下棋的时候改变 Button 的背景和透明度,实现落子的效果,因为Grid的位置关系,所以可看起来好像是下在横竖的交线处。

第三步,进行输赢判断:因为规则不同,“无禁手”和“有禁手”的输赢判断自然不同。

先看无禁手:这个比较简单,遍历每个位置,然后从这个位置开始,分别判断它的四个方向:即横、竖、左上到右下、左下到右上。

每个方向从中间点开始,往两边数连子数,然后将两个方向的连字数加和再加一(中间的棋子)。

如果得到大于等于 5 ,那么就说明下子方赢棋。

对于有禁手的五子棋,输赢判断还需要判断禁手,禁手的判定较为复杂。

将待判断点放入黑棋子。

然后搜索待判断点周边棋盘;还原棋盘;利用搜索结果依次对各方向进行分析,判断黑棋放入后所产生的棋型是否形成长连或形成某种四连或三连的的棋型。

若形成长连,判定为禁手,返回长连禁手标识。

若形成某种四连或三连的棋型,该棋型统计数加 1 ,再对下一个方向进行判断,直到各个方向分析结束。

若四连棋型或三连棋型的统计数大于1,则返回为禁手。

其余情况返回非禁手。

第四步:构造棋型估分“有禁手”规则比较复杂,涉及到比较多下棋方面的技巧,而且对算法的思路没有丝毫影响,所以下面我们主要考虑无禁手规则下的AI 设计。

若设计好无禁手AI ,只需要让AI 执黑时坚决不下到禁手点,就可以很快构造有禁手的 AI 。

虽然这种方式没有利用有禁手规则下的技巧,但这些技巧只需要修改下面所讲到的估分函数即可。

我们可以将五子棋的连珠可以分为以下几种:成 5 :即构成五子连珠活4 :即构成两边均不被拦截的四子连珠。

死 4 :一边被拦截的四子连珠活3 :两边均不被拦截的三字连珠死3 :一边被拦截的三字连珠活 2 :两边均不被拦截的二子连珠死2 :一边被拦截的二子连珠单子:四周无相连棋子根据五子棋的技巧,可以将五子棋的棋型用连珠进行分类,分类过后我们按照威力给每种棋型打分。

因为五子棋一次只落一子,因此很容易理解,双活三和三活三的威力是一样的,类似情况不多做解释。

程序中,我以100 分为满分,对棋型进行了以下打分:成5, 100 分活4 、双死 4 、死 4 活 3 , 90 分双活 3 , 80 分死3 活 3 , 70 分死4 , 60 分活3 , 50 分双活 2 , 40 分死 3 , 30 分活2 , 20 分死 2 , 10 分单子 0 分有了估分方法,就有了五子棋AI 的基础,接下来就是一些博弈的方法了。

第五步:得到位置估分AI单纯应用棋谱以及对五子棋当前局势的分析,对每步进行估分,程序中做如下工作:将每个位置进行分析,假设AI 落子在该位置,用以上打分规则为AI 打分 ,并将得到的分数加一。

然后,假设玩家落子在该点,为玩家打分,然后将所有的分值汇总。

取最高分作为这个位置的估分,接下来就是取分数最高的位置下棋了。

“位置估分”,下棋的时候,既可以考虑到自己攻击对手,又能考虑到对对手的防御,可以说,很多时候可以顶上考虑两步的AI 。

作实验,从网上下载了一个用博弈做的AI ,和“位置估分”对下,结果是一胜一负。

谁先子,谁赢得胜利。

而且一步估分毫无疑问是最快的,即使遍历所有位置,也能很快的做出决策。

第六步:应用博弈树,提高AI 智能做五子棋的博弈,自然会用到博弈树,这里我说下自己的思路。

在对弈中, 根据下一步由谁来走 ,AI 对任何一个局面根据前面估分方法给出一个分数, 我们把这个估分方法汇总成一个评估函数,并返回分值。

据此来选择下一步的走法。

由于人和AI 是轮流落子,可以将人的估分也算入,并将前面加负号。

那么,估值越大表明对AI 越有利,估分越小则表明对AI 越不利。

那么每次AI 选择都是从它可能的走法树的某层节点,返回评估值中最大点。

而用户总是从走法树的某层节点中选择最小点,从而形成一棵极大极小搜索树,然后根据深度优先搜索,可以最后得到固定搜索深度下的一个最好的走法。

我做了下试验,单纯应用博弈树,可以在 100ms之内让AI考虑完整的两步,由于组合爆炸,当需要考虑三步的时候,就需要6s 左右, 4 步就需要 1 分钟。

拿两步来和一步估分作比较,虽然比较慢,但是确实有了一定智能。

第七步:考虑层数,提高AI 智能上面的设计对于返回值是统一处理的, 但是,层数是个很重要的信息. 因为下棋时如果能 2 步获胜 , 不应选择 4 步获胜。

对于输的棋型层数就更重要,AI 必须尽可能拖延输的时间,就有更大的可能让AI 化险为夷。

这样,可以通过设置一个dep 值。

深度约浅,dep 越大,用dep 和得到的得分相乘,得到搜索节点的得分,再进行以上算法,进一步提高AI 的智能。

第八步:应用α- β剪枝,提高AI速度在搜索博弈树的过程中,实际上搜索有很多点是多余的,例如下图图中,方形框节点是该AI 走 , 圆形框节点是该人走 .比如 C 节点 , 它需要从 E 和 F 当中选取最大的值。

目前已经得出 E 为 2, 当搜索 F 节点时 , 因为 F 是人走的节点,那么 F 需要从 K L M 中选取最小的,因为K 已经是 1 ,也就是说 F<=1 ,那么 L, M 就不需要搜索,因此就发生了α剪枝。

然后看 A 节点,该人走了,需要从 C 和 D 中选取最小值,因为 C 节点是 2 ,而 G 是 7 ,那么 D 至少是 7 。

因此, D 的其他节点不必再考虑,就发生如上图所示的β剪枝。

总结上面规律,我们可以得到剪枝方法如下:当前为 AI 下棋节点:α剪枝:如果当前节点的值不比父节点的前兄弟节点的大值大, 则舍弃此节点。

β剪枝:如果当前节点子节点的值不比当前节点的前兄弟节点中的最小值小, 则舍弃该子节点和该子节点的所有后兄弟节点。

当前为用户下棋节点:α剪枝:如果当前节点的某子节点的值不比当前节点的前兄弟节点中的最大值大, 则舍弃该子节点和该子节点的所有后兄弟节点。

β剪枝:如果当前节点的子节点的值不比当前的父节点的前兄弟节点中的最小值小则舍弃此节点。

经过α- β剪枝,可以极大的减少搜索的数量,很多时候,能把几十亿的搜索数量,缩小到几亿,那么,就可以把搜索深度增 1 。

第九步:应用下棋范围,提高AI 速度当前节点的子节点的数量和排列顺序对于搜索的速度起着至关重要的影响。

根据五子棋的特点, 可, 以产生一个棋面搜索范围。

记录当前棋面所有棋子的最左最右最上最下点构成的矩形我们认为下一步棋的位置不会脱离这个框 3 步以上。

这样在棋子较少的时候,搜索节点的数量大大减少。

可以将AI 的速度提高一倍左右。

第十步:利用棋型得分,提高AI 速度,因为每种下法都对应一种得分,所以,可以每次只考虑当前得分前十的节点进行下一步搜索大大减少了搜索范围,可以进一步增加搜索的深度。

第十一步:利用置换表,提高AI 速度我们一般用递归的方法实现博弈树,但是,递归的效率是低的,而且很明显,有很多重复搜索的节点,所以,我们可以用一个表,记录下所有搜索过节点的情况,然后只要遇到搜索到的节点,就可以直接得到结果。

相关文档
最新文档