人工智能课程设计(五子棋)解读

合集下载

人工智能课程设计doc资料

人工智能课程设计doc资料

人工智能课程设计人工智能<五子棋> 技术报告简介本课程设计是基于alpha-beta剪枝算法的五子棋的博弈游戏,具有悔棋,可选择禁手,支持人机对战,人人对战等功能。

整个设计基于Java语言开发,界面美观大方。

alpha-beta剪枝技术的基本思想或算法是,边生成博弈树边计算评估各节点的倒推值,并且根据评估出的倒推值范围,及时停止扩展那些已无必要再扩展的子节点,即相当于剪去了博弈树上的一些分枝,从而节约了机器开销,提高了搜索效率。

具体的剪枝方法如下:(1) 对于一个与节点MIN,若能估计出其倒推值的上确界β,并且这个β值不大于 MIN的父节点(一定是或节点)的估计倒推值的下确界α,即α≥β,则就不必再扩展该 MIN节点的其余子节点了(因为这些节点的估值对MIN父节点的倒推值已无任何影响了)。

这一过程称为α剪枝。

(2) 对于一个或节点MAX,若能估计出其倒推值的下确界α,并且这个α值不小于 MAX的父节点(一定是与节点)的估计倒推值的上确界β,即α≥β,则就不必再扩展该MAX节点的其余子节点了(因为这些节点的估值对MAX父节点的倒推值已无任何影响了)。

这一过程称为β剪枝。

1、数据结构定义本文定义15*15的五子棋棋盘,实现算法,在算法中采用的数据结构包括:int isChessOn[][]描述当前棋盘,0表示黑子,1表示白字,2表示无子;int pre[][]记录棋点的x,y坐标。

由于本课程设计是基于Java语言开发的,在Java中只能用类表示并实现所定义的数据结构。

所以下面将用类来描述相应的数据结构及算法:public class ChessPanel{private ImageIcon map; //棋盘背景位图private ImageIcon blackchess; //黑子位图private ImageIcon whitechess; //白子位图public int isChessOn [][]; //棋局protected boolean win = false; // 是否已经分出胜负protected int win_bw; // 胜利棋色protected int deep = 3, weight = 7; // 搜索的深度以及广度public int drawn_num = 110; // 和棋步数int chess_num = 0; // 总落子数目public int[][] pre = new int[drawn_num + 1][2]; // 记录下棋点的x,y坐标最多 (drawn_num + 1) 个public int sbw = 0; //玩家棋色黑色0,白色1public int bw = 0; // 当前应该下的棋色 0:黑色(默认), 1:白色protected int x_max = 15, x_min = 0; // 边界值,用于速度优化protected int y_max = 15, y_min = 0; // 边界值,用于速度优化protected boolean able_flag = true; // 是否选择禁手标志 0:无禁手 1:有禁手(默认private int h; //棋子长private int w; //棋子宽private int insx; //插入棋子的位置private int insy;private Point mousePoint; //鼠标当前位置private int winer; //获胜方private boolean humanhuman=false; //是否是人人对弈private int plast=0; //走了几步了,public int BLACK_ONE; //0表黑子public int WHITE_ONE; //1表白子public int NONE_ONE; //2表无子public int N; //棋盘边长//---------搜索当前搜索状态极大值--------------------------------////alpha 祖先节点得到的当前最小最大值,用于alpha 剪枝//beta 祖先节点得到的当前最大最小值,用于beta 剪枝。

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

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

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

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

关键词:五子棋;人工智能;博弈;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;}}}五、感想通过这个试验,我对估价函数,极大极小搜索方法,α-β减枝技术有了更全面的认识,对它们的运用也更加熟练。

人工智能课程设计

人工智能课程设计

人工智能<五子棋> 技术报告简介本课程设计是基于alpha-beta剪枝算法的五子棋的博弈游戏,具有悔棋,可选择禁手,支持人机对战,人人对战等功能。

整个设计基于Java语言开发,界面美观大方。

alpha-beta剪枝技术的基本思想或算法是,边生成博弈树边计算评估各节点的倒推值,并且根据评估出的倒推值范围,及时停止扩展那些已无必要再扩展的子节点,即相当于剪去了博弈树上的一些分枝,从而节约了机器开销,提高了搜索效率。

具体的剪枝方法如下:(1) 对于一个与节点MIN,若能估计出其倒推值的上确界β,并且这个β值不大于MIN 的父节点(一定是或节点)的估计倒推值的下确界α,即α≥β,则就不必再扩展该MIN节点的其余子节点了(因为这些节点的估值对MIN父节点的倒推值已无任何影响了)。

这一过程称为α剪枝。

(2) 对于一个或节点MAX,若能估计出其倒推值的下确界α,并且这个α值不小于MAX 的父节点(一定是与节点)的估计倒推值的上确界β,即α≥β,则就不必再扩展该MAX节点的其余子节点了(因为这些节点的估值对MAX父节点的倒推值已无任何影响了)。

这一过程称为β剪枝。

1、数据结构定义本文定义15*15的五子棋棋盘,实现算法,在算法中采用的数据结构包括:int isChessOn[][]描述当前棋盘,0表示黑子,1表示白字,2表示无子;int pre[][]记录棋点的x,y坐标。

由于本课程设计是基于Java语言开发的,在Java中只能用类表示并实现所定义的数据结构。

所以下面将用类来描述相应的数据结构及算法:public class ChessPanel{private ImageIcon map; //棋盘背景位图private ImageIcon blackchess; //黑子位图private ImageIcon whitechess; //白子位图public int isChessOn [][]; //棋局protected boolean win = false; // 是否已经分出胜负protected int win_bw; // 胜利棋色protected int deep = 3, weight = 7; // 搜索的深度以及广度public int drawn_num = 110; // 和棋步数int chess_num = 0; // 总落子数目public int[][] pre = new int[drawn_num + 1][2]; // 记录下棋点的x,y坐标最多(drawn_num + 1) 个public int sbw = 0; //玩家棋色黑色0,白色1public int bw = 0; // 当前应该下的棋色0:黑色(默认),1:白色protected int x_max = 15, x_min = 0; // 边界值,用于速度优化protected int y_max = 15, y_min = 0; // 边界值,用于速度优化protected boolean able_flag = true; // 是否选择禁手标志0:无禁手1:有禁手(默认private int h; //棋子长private int w; //棋子宽private int insx; //插入棋子的位置private int insy;private Point mousePoint; //鼠标当前位置private int winer; //获胜方private boolean humanhuman=false; //是否是人人对弈private int plast=0; //走了几步了,public int BLACK_ONE; //0表黑子public int WHITE_ONE; //1表白子public int NONE_ONE; //2表无子public int N; //棋盘边长//---------搜索当前搜索状态极大值--------------------------------////alpha 祖先节点得到的当前最小最大值,用于alpha 剪枝//beta 祖先节点得到的当前最大最小值,用于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的棋盘上相互交替放置黑色和白色的棋子。

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

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

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

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

常见的搜索算法有暴力搜索、极小化极大搜索(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;}随着技术的飞速发展,高性能计算在各个领域的应用越来越广泛。

基于python的五子棋对弈课程设计

基于python的五子棋对弈课程设计

一、概述五子棋是一种古老而又经典的策略游戏,它的简单规则和深刻的战术让人们乐此不疲。

而在当今计算机科学和人工智能技术的不断发展之下,通过计算机程序设计进行五子棋对弈已经成为了一种热门的研究方向。

Python作为一种简单易学的编程语言,因其便捷的编程方式而受到了广泛的关注。

本文将围绕基于Python的五子棋对弈课程设计展开讨论,从而深入探讨计算机程序在五子棋对弈中的应用。

二、课程设计内容1. 五子棋规则的实现在课程设计中,首先要实现基本的五子棋规则,包括黑白双方轮流落子、判断胜负、禁手规则等。

利用Python的面向对象编程思想,可以设计出简洁而又高效的五子棋规则模块,让学生通过代码的方式深入理解五子棋的游戏规则。

2. 基于MiniMax算法的智能对弈为了使学生更好地了解人工智能在五子棋中的运用,课程设计中还可以引入MiniMax算法,让学生深入理解该算法在五子棋对弈中的实现原理。

借助Python语言强大的数学计算能力,学生可以编写出基于MiniMax算法的智能对弈程序,从而提高对算法的理解和应用能力。

3. 界面设计与人机对弈除了算法的实现,课程设计中还可以引入Python的图形化编程库,设计出美观、实用的五子棋界面。

这样一来,学生不仅能够深入理解五子棋规则和算法,还可以通过界面设计与程序实践,实现人机对弈的功能,提高对图形化编程的熟练度。

4. 策略优化与深度学习为了呈现更具挑战性的课程内容,课程设计还可以引入深度学习技术,让学生设计出基于神经网络的五子棋对弈程序。

通过训练神经网络,学生可以优化五子棋本人的策略,从而提高程序的对弈水平。

这一部分内容将会极大地挑战学生的编程能力和算法思维,使他们在深入探讨五子棋对弈中的人工智能技术的也能够提升自身的编程水平。

三、课程设计目标通过以上的课程设计内容,我们的课程设计旨在达到以下目标:1. 帮助学生深入理解五子棋游戏规则及其背后的算法原理;2. 提高学生的Python编程技能,并培养其对程序设计和算法思考的能力;3. 引导学生了解人工智能在五子棋对弈中的应用,并培养其对人工智能技术的兴趣;4. 培养学生团队合作和实践能力,使他们通过课程设计形成良好的团队合作意识和项目实践能力。

人工智能课程设计报告

人工智能课程设计报告
第 2 页 共 11 页 学 生:李伟 指导老师:赵曼
《人工智能》程序设计报告
题目: 五子棋
//预测棋盘局势,判断输赢
3、算法设计与实现 3.1 算法的伪代码
3.1.1αβ剪枝算法选择优化函数:
long alphabeta(long alpha,long beta,int d,bool m) //αβ剪枝算法算出该将棋子放在哪个位置 { 深度为 2 if depth<=0 Then 调用评估函数,将结果赋给 current , Return current 值。 for 对整个棋盘循环搜索, If grid[i][j]==0,棋盘上面的个点无子, 则 break。 if 棋盘已满,没有地方可以再移动, Then 调用评估函数,将结果赋给 current , return current 值。 else: 循环搜索棋盘空间,生成当前所有合理的走法 If(对于一个 MAX 结点) 对每一个走法 执行:putchess(set_color,i,j); current=alphabeta(a,b,d-1,!m); (我们已经发现了最好的移动方法、 、 、 、 、 ) 撤销走法: If(current >alpha) then alpha=score;(cut off alpha) If (alpha>= beta) then return alpha If(d==depth) return alpha (这是最好的移动方法) else (对于一个 MIN 结点) 对每一个走法 执行:putchess(set_color,i,j); current=alphabeta(a,b,d-1,!m); (我们已经发现了最好的移动方法、 、 、 、 、 ) 撤销走法: If(current <beta) then beta=current;(cut off beta) If (alpha>= beta) then return beta If(d==depth) return beta (这是最好的移动方法) }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《人工智能导论》课程报告课题名称:五子棋姓名: X X 学号:114304xxxx课题负责人名(学号): X X114304xxxx同组成员名单(学号、角色):x x1143041325XXX1143041036指导教师:张建州评阅成绩:评阅意见:提交报告时间:2014年 1 月 9 日五子棋计算机科学与技术专业学生XXX 指导老师张建州[摘要]人类之所以不断在进步,是因为我们人类一直不断的在思考,五子棋游戏程序的开发符合人类进步也是促进人类进步的一大动力之一。

五子棋游戏程序让人们方便快捷的可以下五子棋,让人们在何时都能通过下棋来提高逻辑思维能力,同时也培养儿童的兴趣以及爱好,让孩子更加聪明。

同时,五子棋游戏程序的开发也使得五子棋这个游戏得到了广泛的推广,让世界各地的人们知道五子棋,玩上五子棋,这已经不是局限。

五子棋游戏程序使得越来越多的人喜欢上了五子棋,热爱下五子棋,它是具有很好的带动性的。

关键词:五子棋进步思考目录《人工智能导论》课程报告 01 引言 (3)1.1五子棋简介 (3)1.2 五子棋游戏的发展与现状 (3)2 研究问题描述 (4)2.1 问题定义 (4)2.2 可行性研究 (4)2.3 需求分析 (5)2.4 总体设计 (5)2.5 详细设计 (6)2.6编码和单元测试 (6)3 人工智能技术 (6)4 算法设计 (7)4.1α-β剪枝算法 (7)4.2极大极小树 (7)4.3深度优先搜索(DFS) (8)4.4静态估值函数 (9)5 软件设计和实现 (9)5.1 数据结构定义 (9)5.2 程序流程图 (17)6 性能测试 (18)6.1 程序执行结果 (18)7 总结 (21)参考文献 (21)1 引言1.1五子棋简介五子棋是一种两人对弈的纯策略型汉族棋类益智游戏,棋具与围棋通用,由中国汉族人发明,起源于中国上古时代的传统黑白棋种之一。

主要流行于华人和汉字文化圈的国家以及欧美一些地区。

容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

已在各个游戏平台有应用。

古代五子棋棋盘与围棋棋盘是通用的,汉魏时为十七路(17×17)棋盘,至南北朝时即已流行十九路(19×19)棋盘,直至1931年出现所谓五子棋专用棋盘。

1.2 五子棋游戏的发展与现状目前,连珠这一棋类运动已迅速在国际上发展起来。

外国人都十分看好这一不起眼的智力游戏,并认为五子棋不仅能提高思维、开发智力、手脑并用、修身养性而且富含哲理,具有东方的神秘和西方的直观,是中西文化的交汇点。

许多国家的人对五子棋都有不同的爱称,例如韩国人把五子棋称之为“情侣棋”,言下之意是情人之间下五子棋有利于增加情感的交流;欧洲人称之为“中老年棋”,表示五子棋适合中老年人的生理特点和思维方式;美洲人喜欢将五子棋称之为“商业棋”,就是说商人谈生意时可一边下棋一边谈生意,棋下完了生意也谈成了。

由此可见,尽管国度不同,语言各异,但人们都可以借助五子棋这一简单而又深奥的棋艺进行交流、比赛,增进友谊。

当前,有40多个国家和地区都在下五子棋,并有各种规模和级别的比赛。

1989年8月在日本京都、1991年8月在俄罗斯联邦的莫斯科、1993年8月在瑞典、1995年8月在爱沙尼亚的塔林分别举行了第一、二、三、四届世界锦标赛。

除第三届的冠军是爱沙尼亚人之外,其余三届的冠军都是日本人。

五子棋的世界锦标赛,每两年举办一次,其申国竞争也十分激烈。

日本目前拥有自己的五子棋职业棋手,并且对连珠(五子棋)技术的研究也相当普遍和全面,就水平也正在日益增强。

同时,五子棋的理论研究与探索也呈现蓬勃发展的势头,从1858年第一部五子棋专著问世以来,目前,全世界有2000多种五子棋的书籍及期刊,分别以日文、俄文、英文、瑞典文及中文出版发行。

五子棋在我国的北京、上海、天津、云南、浙江、广东、四川、湖北、辽宁、新疆、河北等省(区)市都有很大的发展。

北京多次举办了北京地区的五子棋赛,如“思曼杯”、“京空杯”、“奇奇童杯”、“北京第六届民族团结杯”和“北京第四岂民族运动会”的五子棋比赛。

上海地区举办了“上文杯”五子棋大赛。

云南省以及其他省市亦举办过许多五子棋比赛。

所有这些赛事都越来越多地吸引了无数人的关注,表明了根植于中国的五子棋有着广泛的群众基础,是群众喜闻乐见的体育活动。

而现在,很多很多游戏平台上面都有五子棋游戏供我们玩,任何游戏平台上面只要有棋牌类游戏的,那么它就有五子棋在里面,网络五子棋比赛,在联众,263,QQ游戏,UC里进行了10几年了可见,五子棋游戏在网络上面是非常火暴的,而且在棋牌游戏里面玩家人数排名总会占到很前面,不愧是风靡全球的棋牌游戏啊!在未来中,将会有越来越多的人关注五子棋,喜欢五子棋,那么将其变为商业化也会越来越多,而且还可以以教育孩子的方式来将其嵌套进去,或者用来做测试等等,可以说以后的五子棋游戏会是那么的精彩,那么的让人憧憬。

那么对于它的游戏开发和发展也将会上升到举足轻重的地位去,它的发展会是相当之快的,就让我们拭目以待吧。

2 研究问题描述2.1 问题定义问题定义的一个的关键问题是“要解决的问题是什么”,这个是这个阶段必须要明确要回答的问题。

在没将问题定义好,试图准备下个阶段的任务。

这明显是不成熟,甚至不可能的事。

本次系统设计中首先明确了需要解决的问题是五子棋AI算法,基本的要求是设计一款能够实现人机对战、人人对战和禁手的五子棋游戏,提供一些基本的操作如退出系统,向后悔棋等操作,重点是放在AI算法的研究。

而并不是美工设计,也不是为了提供各种操作丰富的接口。

主要是通过这种可视化的界面探讨AI,当然增加可玩性和美工会给系统润色不少。

上面只是很粗略的明确大概的方向,严格按照软件工程的方法这个阶段需要生产一份书面报告。

需要通过对系统的实际用户访问调查,扼要地写出他对问题的理解,并在用户和使用部门负责人的会议上认真讨论这份书面报告,澄清含糊不精的地方,改正理解不正确的地方,最后得出一份双方都满意的文档。

本系统的需求很少也很明显了。

2.2 可行性研究这个阶段要回答的关键问题:“对于上一个阶段所确定的问题是否可行?”为了回答这个问题,我们需要进行一次大大压缩和简化了的系统分析和设计的过程,也就是在较抽象的高层次上进行的分析和设计的过程。

可行性研究应该比较简短,这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决办法。

可行性研究应该比较简短,这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决办法。

可行性研究以后的那些阶段将需要投入要多的人力物力。

及时中止不值得投资的工程项目,可以避免更大的浪费。

根据这些基本的概念,我在技术上主要是通过相关文档资料的查找后确定可行性,凭着大学期间打下厚实的专业科基础,特别是数据结构和算法,能够在这段时间理解通透并应该有所改进,后来证明是对的。

利用剩下时间也应该来说也比较充裕的。

经济上暂不考虑。

下面主要从技术上进行分析:工具: Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。

Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。

所以用java来编写是一个很好的选择。

算法:在这图论搜索技术这方面,前人已有很成熟的算法。

如粗糙的有深度优先算法(DFS)和广度优先算法(BFS)这两个基本的算法,关键需要解决的是能够设计出一种高效的剪枝函数,减小搜索问题的规模。

目前博弈类游戏中的人工智能基本都采用极大极小值方法这对我来说是个挑战,而剪枝的则采用Alpha-Beta,通过丰富的文档资料初步了解到这些技术已经很成熟了。

我们有信心能解决好这个问题。

2.3 需求分析人工智能的第一大成就是下棋程序,在下棋程度中应用的某些技术,如向前看几步,把困难的问题分解成一些较容易的子问题,发展成为搜索和问题归纳这样的人工智能基本技术。

今天的计算机程序已能够达到下各种方盘棋和国际象棋的锦标赛水平。

但是,尚未解决包括人类棋手具有的但尚不能明确表达的能力。

如国际象棋大师们洞察棋局的能力。

另一个问题是涉及问题的原概念,在人工智能中叫做问题表示的选择,人们常能找到某种思考问题的方法,从而使求解变易而解决该问题。

到目前为止,人工智能程序已能知道如何考虑它们要解决的问题,即搜索解答空间,寻找较优解答。

在设计本系统时考虑到用户需要的是一个操作简便界面简单的游戏软件,同时要提供人机和人人这样的功能,特别是人机部分,要考虑到不同级别的用户,电脑智能不能太低需要有一定的智能下棋功能等等。

所以采用α-β剪枝法算法时就是为了达到这些目标。

2.4 总体设计这个阶段必须回答的关键问题是:“概括地说,应该如何解决这个问题?”首先,应该考虑几种可能的解决方案。

如,目标系统的一些主要功能是用计算机自动完成还是用人工完成;如果使用计算机,那么是使用批处理方式还是人机交互方式;信息存储使用传统的文件系统还是数据库……。

通常至少应该考虑下述几类可能的方案:低成本的解决方案。

系统只能完成最必要的工作,不能多做一点额处的工作。

本系统的最基本要求就是能够实现必要的操作,其他额外的一些工作在后面完成中等成本的解决方案。

这样的系统不仅能够很好地完成预定的任务,使用起来很方便,而且可能还具有用户没有具体指定的某些功能和特点。

虽然用户没有提出这些具体要求,但是系统分析员根据自己的知识和经验断定,这些附加的能力在实践中将证明是很有价值的。

这个成本方案在完成上面的低成本方案后添加的。

如增加保存棋局,美化界面,实现观看电脑与电脑之间的对战等功能。

高成本的“十全十美”的系统。

这样的系统具有用户可能希望有的所有功能和特点。

结构设计的一条基本原理就是程序应该模块化,也就是一个大程序应该由许多规模适中的模块按合理的层次结构组织而成。

总体设计阶段的第二项主要任务就是设计软件的结构,也就是确定程序由哪些模块组成以及模块间的关系。

通常用层次图或结构图描绘软件的结构。

2.5 详细设计总体设计阶段以比较抽象概括的方式提出了解决问题的办法。

详细设计阶段的任务就是把解法具体化,也就是回答下面这个关键问题:“应该怎样具体地实现这个系统呢?”这个阶段的任务还不是编写程序,而是设计出程序的详细规格说明。

这种规格说明的作用很类似于其他工程领域中工程师经常使用的工程蓝图,它们应该包含必要的细节,程序员可以根据它们写出实际的程序代码。

相关文档
最新文档