人机对弈五子棋游戏
人工智能五子棋实验报告

题目:智能五子棋游戏一、实验目的理解和掌握博弈树的启发式搜索过程和α-β减枝技术,能够用某种程序语言开发一个五子棋博弈游戏。
二、实验要求(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;}}}五、感想通过这个试验,我对估价函数,极大极小搜索方法,α-β减枝技术有了更全面的认识,对它们的运用也更加熟练。
五子棋人机博弈实验报告

五子棋人机博弈实验报告目录一(课程设计目的............................................. 2 二(课程设计要求............................................. 2 三(课程设计内容............................................. 2 四(课程设计思想............................................. 2 五(系统实现 (2)设计平台 (2)数据结构设计 (3)程序流程图设计 (3)主要算法设计 (4)程序调试及运行结果.............................. 4 六(课程设计总结............................................. 5 七(参考资料................................................... 6 八(附录:五子棋博弈算法源代码 (7)1一( 课程设计目的通过上学期学习的《人工智能》学科,运用推理技术、搜索方法和决策规划和博弈树设计五子棋人机博弈系统,以此进一步深化对理论知识技术的了解,培养学生编程能力以及实践水平。
二(课程设计要求通过本次课程设计要求学生掌握以下内容:1.深入了解博弈树和alpha-beta剪枝算法。
2.设计出适合五子棋算法的启发式函数。
3.熟练掌握启发式的搜索方法。
三(课程设计内容本系统实现的是五子棋博弈算法,运用java语言实现了图形用户界面,方便用户使用。
算法采用了博弈算法和启发式函数进行搜索,人机对弈可自动判断输赢,结束后可重新开局。
四(课程设计思想本系统实现的是五子棋博弈算法,为了方便用户的使用,采用的是java图形用户界面技术。
为了记录棋盘的每一个下棋点,定义数组array[19][19]。
怎样在qq群里玩五子棋

怎样在qq群里玩五子棋相传中华民族的祖先轩辕黄帝无意之中画下了十七条横线十七条竖线,这无意中的发明造就出了五子棋。
下面店铺给你介绍怎样在qq 群里玩五子棋,欢迎阅读。
在qq群里玩五子棋的方法介绍在qq群里有手机五子棋(支持安卓),是人机和人竞的集合软件,可以选择人机模式,也可以选择和QQ玩家对战的模式,甚至可以开个房间去单挑菜鸟(自己把房间号发过去让他进来即可),没信心玩家对战,可以先练习一下人机。
人机里偶尔会有套路bug(你只要怎样怎样走,就可以赢),但是大多数套路都是很优秀、会变通的,可以说这款五子棋是我玩过的最好的了,可以堪比象棋领域的象棋小巫师了,不,说不定更好。
玩qq五子棋的技巧1,最基本的是无论横着、竖着、左斜或者右斜,只要谁先组成连着的五子(五子连珠)谁就赢了。
2,一般刚开始玩都喜欢对方走了连着的三子才开始堵,但是高手比赛或者与高手过招的时候,推荐在对方刚组成活二子(两边都没有敌方棋子的连二子)就要去堵。
3,不要给对方组成活四子的可能,否则必输无疑。
4,在将对方的棋子隔散开来的同时,要保证自己棋子的密集度,并且有两个方向的开放性。
(如果被对手堵在一个圈里,那就不好赢了。
)5,单独组成活四子非常难,不如同时组成两个活三子,两个半四子,一个活三一个半四。
这样子对方无论堵你哪个,你都可以利用另一个获胜。
6,在落子的时候,要先考虑对方是否要同时组成好几个连子,尤其是其中包括活三或者半四的。
如果没有,才能设计自己进攻的套路。
当然在自己有足够把握先对手组成五子的时候,可以先考虑自己的进攻套路,然后再思考对方的目的和走势。
7,正规比赛中有国际规则,比如三三禁手(禁止黑子同时组成两个活三子),六连(黑子有六个连子就输了。
比赛中经常会出现白子方利用白棋走势设计迫使黑子六连而获胜),等等。
8,无论正规或者业余,基本上都是黑子先走(叫黑子先手)。
玩玩的话倒没那么多顾忌。
玩五子棋另外补充:1,网上有很多五子棋教学视频,如果真的喜欢五子棋可以研究一下,有一些“必胜套路”,学了可以偶尔冒充一下高手。
五子棋之人机对弈智能报告

五子棋之人机对弈智能报告
五子棋是一种棋类游戏,古老而又受欢迎,被誉为“智力运动”。
目前,研究人员正在探索五子棋的人机对弈,并分析人机对弈的新技术和新
思想。
近年来,人工智能技术的发展,人工智能程序(AI)在五子棋比赛
中也占据了非常重要的地位,甚至比职业棋手更具优势。
本文将详细介绍
五子棋之人机对弈智能研究,展示人机对弈的新技术与新思想,并分析其
在策略技巧、数学模型分析和智能等技术应用方面的优势。
一、人机对弈的新技术与新思想
在五子棋中,新的技术与思想都为人机对弈带来了新的机遇和挑战。
首先,由于五子棋中的棋子数量有限,不需要考虑博弈树等极其复杂的计
算方法,因此可以采用较为简单的算法,避免过多的运算量。
其次,为了更好地模拟五子棋的复杂性,人机对弈研究者引入了多种
技术来改善AI的能力,如机器学习、数学评估模型和深度学习等。
例如,通过机器学习,人工智能程序可以从以往的游戏历史中学习更加有效的策略,以更快地获取结果。
此外,通过数学评估模型,AI可以根据实时的
棋面评估出每一步的最佳走法,并自动选择最优解,从而使游戏更加有趣。
毕业设计基于labview设计的五子棋游戏

常州信息职业技术学院学生毕业设计(论文)报告系别:电子与电气工程学院专业:电气自动化班号:电气092 学生姓名:刘利学生学号: 0905093210 设计(论文)题目:基于LabVIEW的五子棋游戏开发指导教师:陈琳设计地点:常州信息职业技术学院起迄日期: 2011.09.06—2011.11.20毕业设计(论文)任务书专业电气自动化班级电气092 姓名刘利一、课题名称:基于LabVIEW的五子棋游戏开发二、主要研究内容:1. 游戏的行棋规则:黑先、白后,任一方先在棋盘上形成纵向、竖向、斜向的连续相同颜色五个棋子的一方为胜。
2. LabVIEW程序结构的合理应用。
3. 游戏界面的设计及美化。
三、工作内容和要求:1. 游戏开始,设计子程序对棋盘进行初始化,初始化子程序用循环结构实现,数组显示当期棋盘状态。
2. 初始化结束后,选择游戏模式,选择人机对弈模式或双人对弈模式。
应用条件结构进行选择。
3. 选择游戏模式后,进行游戏,双方下棋子的位置要用数组显示当前棋盘状态。
如果选择了双人对弈,就只要记住双方下子位置。
如果选择了人机对弈,就要搜索当前局面的最佳应对着法,由电脑计算下子位置。
4.游戏中,任一方先在棋盘上形成纵向、竖向、斜向的连续相同颜色的五个棋子的一方为胜。
如果有一方获胜,此时跳出对话框,显示一方获胜,游戏结束。
按下确定,同时初始化棋盘,可以重新开始游戏。
四、主要参考文献:[1] 林飞. 中国艺术经典全书之五子棋[M], 吉林摄影出版社.2003.12[2] 彭建国、那威. 连珠五子棋入门[M], 金盾出版社.1997.6[3] 阮奇桢. 我和LabVIEW——一个NI工程师的十年编程经验[M], 北京航空航天大学出版社,2009.09 [4] 王长飞、蔡强、李海生. 智能五子棋算法的设计实现[M], 系统仿真学报第21卷第四期2009. 02[5] 王永庆. 人工智能原理与方法[M], 西安交通大学出版社.1998.8[6] 崔良沂、赵永昌. 人工智能[M], 第3 版清华大学出版社.2005.9[7] 贾功贤、刘成康等. 基于PC的虚拟仪器的发展趋势[J], 电子技术应用.1999[8] NI. Measurement and Automation Catalog[Z], 2003.9[9] LabVIEW 虚拟仪器程序设计及应用.人民邮电出版社.2008.12[10] LabVIEW8.20程序设计从入门到精通.清华大学出版.2007.7学生(签名)年月日指导教师(签名)年月日教研室主任(签名)年月日系主任(签名)年月日毕业设计(论文)开题报告基于LabVIEW的五子棋游戏目录摘要Abstract第1章前言 (1)第2章 LabVIEW简介 (2)2.1 LabVIEW的概念 (2)2.2 LabVIEW的特点 (2)第3章总体设计方案 (3)3.1五子棋游戏规则 (3)3.2游戏设计框图 (3)3.3游戏设计流程图 (4)3.3.1总体设计流程图 (4)3.3.2人机对弈模式下的游戏流程图 (4)3.3.3双人对弈模式下的游戏流程图 (5)第4章各模块程序设计 (7)4.1初始棋盘模块 (7)4.2多步计算模块 (7)4.2.1多步计算流程图 (7)4.2.2多步计算前面板及程序框图 (8)4.3决定下子方模块 (10)4.4判定胜负模块 (10)4.4.1判定胜负模块设计前面板及程序框图 (10)4.5胜负对话模块 (11)第5章主程序设计 (14)5.1游戏主程序设计 (14)5.1.1五子棋主程序的程序框图 (14)5.1.2五子棋的游戏界面 (15)5.2结果演示 (16)第6章结束语 (17)参考文献 (18)答谢辞 (19)摘要随着生活水平的不断提高,人们不再仅仅满足于物质生活,闲暇时光人们会选择自己喜欢的娱乐活动用做消遣。
五子棋源码实验报告及人机对战说明

1.五子棋对战说明2.实验报告3.源代码五子棋作品特点:C语言程序五子棋作品功能:五子棋人机对战,人人对战。
目录:1 五子棋介绍。
2五子棋棋型介绍。
3人人对战的实现。
4电脑下子的实现。
5棋型价值的计算。
6胜利及棋型的判断。
7补充说明1五子棋介绍。
五子棋是一种两人对弈的纯策略型棋类游戏。
只要任意一方在棋盘上且同一个回合上连为五子为胜。
还有禁手规则,在本程序中不作讨论。
2五子棋棋型介绍。
本程序中的棋型均为本人自定义。
本程序总共设计35种棋型。
●表示玩家的棋子,◎表示电脑的棋子。
以下称电脑方为己方,玩家方为对方。
从一空点向某一方向判断该方向的棋型。
某一方向指1-8方向从右顺时针开始数。
(1)空棋型。
从一空点向一方向看连续2个为空的棋型。
空棋型共1种。
如图,从左端的空点向右看会发现有连续2个空点。
(2)活棋型。
2端无挡的棋型为活棋型。
活棋型共8种:己方4种,对方4种。
左图为己活3 。
从左端的空点向右看会发现己方有连续的3个子,且右端无挡。
故该点的1方向为己活3。
左图为对活2(3)冲棋型。
1端无挡的棋型为冲棋型。
冲棋型共9种:己方4种,对方4种,边界1种。
左图为边界冲棋型。
空点的右端为边界。
或左图为己冲2。
从左端的空点向右看会发现己方有连续的2个子,且右端有挡(此处有挡表示有对方的子或为边界)。
故该点的1方向为己冲2。
左图为对冲4。
(4)空活棋型。
从一空点向一方向看有1个空点,继续看有己方或对方的活棋型。
空活棋型共8种:己方4种,对方4种。
左图为己空活2。
从左端的空点向右看有1个空点,继续看会发现己方有连续的2个子,且右端无挡。
故该点的1方向为己空活2。
左图为对空活1。
(5)空冲棋型。
从一空点向一方向看有1个空点,继续看有己方或对方或边界冲棋型。
空冲棋型共9种:己方4种,对方4种,边界1种。
左图为边界空冲棋型。
空点的右端为空点再右看为边界。
或左图为己空冲2。
从左端的空点向右看有1个空点,继续看会发现己方有连续的2个子,且右端有挡。
基于STM32的人机对战五子棋系统设计
基于STM32的人机对战五子棋系统设计
王梦寻;戴家兴;施武斌;杨鑫;钱林皓玮;薛晶晶
【期刊名称】《工业控制计算机》
【年(卷),期】2023(36)1
【摘要】采用STM32单片机作为系统的主处理器,同时连接显示屏显示出15×15的棋盘,可以触摸屏幕下棋。
同时选择最直观的贪心算法,该算法可以概述为当人下完一步后,单片机会进行搜索合适落子的点,并计算每个落子得到的分数,选出最适合落子(得分最高)的点作为后一步。
经过实验证明,该五子棋人机对战系统具有操作简便、反应灵敏、界面显示清晰等特点。
【总页数】3页(P151-152)
【作者】王梦寻;戴家兴;施武斌;杨鑫;钱林皓玮;薛晶晶
【作者单位】绍兴文理学院机械与电气工程学院
【正文语种】中文
【中图分类】TP3
【相关文献】
1.基于MicroBlaze嵌入式平台的蓝牙五子棋对战游戏系统设计
2.基于STM32的无人机避障系统设计
3.基于STM32的四旋翼无人机控制系统设计
4.基于STM32的搬运机器人机械系统设计
5.基于STM32的集成化复合式无人机飞控系统设计
因版权原因,仅展示原文概要,查看原文内容请购买。
五子棋人机对战原理
五子棋人机对战原理
五子棋人机对战原理:
五子棋人机对战是一种智能对弈方式,通过计算机程序模拟人类玩家与计算机AI进行对战。
其原理主要包括以下几个方面:
1. 搜索算法:计算机AI采用搜索算法来探索可能的游戏走法,并选择最优的下子位置。
常用的搜索算法包括博弈树搜索、α-β剪枝、蒙特卡洛树搜索等。
通过搜索算法,计算机可以预测对手的走法,并选择最有利的下一步。
2. 评估函数:评估函数是五子棋人机对战中非常重要的组成部分。
它根据当前棋局的特征和局势来评估棋局的好坏。
评估函数可以考虑棋子的位置、连子数、棋局的开放度、对手的威胁等因素。
计算机通过评估函数来选择最优的下子位置。
3. 模式库:人机对战中的模式库是一种存储了棋局模式和相应下子位置的数据库。
计算机可以通过模式库来快速判断当前棋局是否符合某个已知的胜利模式,并做出相应的决策。
模式库可以提高计算机的搜索效率,加快计算机下子的速度。
4. 前沿搜索:为了减小计算复杂度,常常采用前沿搜索方法。
即只保留搜索树上一定深度内的节点信息,而将其他未搜索的节点进行剪枝。
这样可以大大缩小搜索空间,提高计算效率。
综上所述,五子棋人机对战的原理主要包括搜索算法、评估函数、模式库和前沿搜索等。
通过这些技术,计算机可以模拟人类玩家的思考过程,选择最优的下子位置。
与人类对战时,计算机AI可以根据实时情况作出相应的调整,使得对战更有挑战性和趣味性。
基于python的五子棋对弈课程设计
一、概述五子棋是一种古老而又经典的策略游戏,它的简单规则和深刻的战术让人们乐此不疲。
而在当今计算机科学和人工智能技术的不断发展之下,通过计算机程序设计进行五子棋对弈已经成为了一种热门的研究方向。
Python作为一种简单易学的编程语言,因其便捷的编程方式而受到了广泛的关注。
本文将围绕基于Python的五子棋对弈课程设计展开讨论,从而深入探讨计算机程序在五子棋对弈中的应用。
二、课程设计内容1. 五子棋规则的实现在课程设计中,首先要实现基本的五子棋规则,包括黑白双方轮流落子、判断胜负、禁手规则等。
利用Python的面向对象编程思想,可以设计出简洁而又高效的五子棋规则模块,让学生通过代码的方式深入理解五子棋的游戏规则。
2. 基于MiniMax算法的智能对弈为了使学生更好地了解人工智能在五子棋中的运用,课程设计中还可以引入MiniMax算法,让学生深入理解该算法在五子棋对弈中的实现原理。
借助Python语言强大的数学计算能力,学生可以编写出基于MiniMax算法的智能对弈程序,从而提高对算法的理解和应用能力。
3. 界面设计与人机对弈除了算法的实现,课程设计中还可以引入Python的图形化编程库,设计出美观、实用的五子棋界面。
这样一来,学生不仅能够深入理解五子棋规则和算法,还可以通过界面设计与程序实践,实现人机对弈的功能,提高对图形化编程的熟练度。
4. 策略优化与深度学习为了呈现更具挑战性的课程内容,课程设计还可以引入深度学习技术,让学生设计出基于神经网络的五子棋对弈程序。
通过训练神经网络,学生可以优化五子棋本人的策略,从而提高程序的对弈水平。
这一部分内容将会极大地挑战学生的编程能力和算法思维,使他们在深入探讨五子棋对弈中的人工智能技术的也能够提升自身的编程水平。
三、课程设计目标通过以上的课程设计内容,我们的课程设计旨在达到以下目标:1. 帮助学生深入理解五子棋游戏规则及其背后的算法原理;2. 提高学生的Python编程技能,并培养其对程序设计和算法思考的能力;3. 引导学生了解人工智能在五子棋对弈中的应用,并培养其对人工智能技术的兴趣;4. 培养学生团队合作和实践能力,使他们通过课程设计形成良好的团队合作意识和项目实践能力。
毕业论文:Android环境下人机对弈五子棋的设计与实现-精品
南阳理工学院本科生毕业设计(论文)学院(系):软件学院专业:软件工程学生:李雪峰指导教师:白光远完成日期 2012 年 04 月南阳理工学院本科生毕业设计(论文)Android环境下人机对弈五子棋的设计与实现The Design And Implementation ofFive in a Row Base on Android总计:毕业设计(论文) 27页表格:0个图片:14个南阳理工学院本科毕业设计(论文)Android环境下人机对弈五子棋的设计与实现The Design And Implementation ofFive in a Row Base on Android学院(系): 软件学院专业:软件工程学生姓名:李雪峰学号: 068108053指导教师(职称):白光远讲师评阅教师:完成日期: 2012年04月01日南阳理工学院Nanyang Institute of TechnologyAndroid环境下人机对弈五子棋的设计与实现软件工程李雪峰[摘要]移动互联网时代的到来极大的改变了我们的生活,而Android是一种以Linux为基础的开放源码操作系统迅速占领了智能机操作系统,所以在android环境下开发显得尤为必要。
本文围绕一个“基于Android平台的五子棋游戏设计与开发”程序的设计和应用系统的开发课题为背景,详细介绍了在Android平台上以Java为语言编写游戏的过程。
五子棋游戏的开发不仅是一个简单游戏的编写过程,更重要的是在系统分析和设计阶段所做的工作.该程序在设计过程中严格遵循软件工程学的方法,用分阶段的生命周期计划严格管理,并主要讲述了程序的总体设计、详细设计阶段,对程序进行需求迭代,不断修正和改进,利用SQlite、SharedPreferences等数据存储功能,直到形成一个完善的可行性系统。
界面美观、大方,方便的操作与良好的视觉感应共同构成了“基于Android平台的五子棋游戏设计与开发”的设计。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计(论文)任务书学院专业班一、课程设计(论文)题目:人机对弈五子棋游戏二、课程设计(论文)工作:三、课程设计(论文) 地点:四、课程设计(论文)内容要求:1.本课程设计的目的(1)使学生掌握软件开发的基本工作流程;(2)巩固JAVA程序设计课程所学的内容;(3)培养学生的计算机思维能力以及合作的精神;(4)培养学生分析、解决问题的能力;(5)提高学生的科技论文写作能力。
2.课程设计的任务及要求1)基本要求:(1)研究课程设计任务,并进行系统需求分析;(2)对系统进行总体设计,分解系统功能模块,进行任务分配,以实现分工合作;(3)实现各功能模块代码;(4)系统组装,测试、完善系统。
2)创新要求:在基本要求达到后,可进行创新设计,如改进界面、增加功能或进行代码优化。
3)课程设计论文编写要求(1)要按照书稿的规格打印誊写课程设计论文(2)论文包括封面、设计任务书(含评语)、摘要、目录、设计内容、设计小结(3)论文装订按学校的统一要求完成4)参考文献:(1)丁振凡,《JAVA语言程序设计》,清华大学出版社(2)丁振凡,《JAVA语言程序设计实验指导与习题解答》,清华大学出版社(3)/5)课程设计进度安排内容天数地点系统总体设计 1 实验室软件设计及调试 1 实验室答辩及撰写报告 1 实验室、图书馆学生签名:2015年6月25日课程设计(论文)评审意见(1)课程设计过程(20分):优()、良()、中()、一般()、差();(2)是否完成调试,系统运行效果(30分):优()、良()、中()、一般()、差();(3)回答问题(20分):优()、良()、中()、一般()、差();(4)课程设计报告(30分):优()、良()、中()、一般()、差();(5)格式规范性及考勤是否降等级:是()、否()评阅人:职称:教授2015年 6月25日人机对弈五子棋游戏设计摘要:近些年来五子棋游戏成为了人们的最爱,游戏的下载量很高可以说一直排在前几位,也是人们日常生活中放松娱乐的最爱,特别是最近IT行业的发展,人工智能的实现,移动客户端的发展和普及为我们五子棋游戏的发展带来了新的生机,新的高潮,人工智能与五子棋的完美结合是五子棋的又一项重要发展,而我们现在开发的人机对弈更是掀起了五子棋发展的新篇章,为五子棋的发展与传播提供了新的机会,但是机会与挑战并存,我们相信通过我们对五子棋程序的不断优化和完善,五子棋一定会越来越受到大家的欢迎。
本次课程设计要求利用Java语言设计出一个人机对弈五子棋游戏,能实现人机对弈五子棋。
了解五子棋对弈规则后,利用本学期所学的Java高级图形界面编程方法的知识,并通过穷举法,考虑八个方向连成五子的几率高低,让计算机具有人工智能,成功设计出人机对弈五子棋的游戏。
除了人机对弈的功能,我们还增加了人人对战的功能。
这项功能使得人与人之间能够互下五子棋,不仅仅是人与计算机对弈。
除此之外,还增加了再来一局、认输、悔棋、退出游戏的功能,为了让游戏功能更加丰富,还增加了棋盘、模式、外观三个菜单栏供用户选择相应功能的菜单项。
目录1、课程设计的目的及目标 (1)1.1课程设计的目的 (1)1.2课程设计的目标 (1)2、概要设计 (1)2.1开发工具及环境 (1)2.2任务及需求分析 (1)2.3工作原理 (1)3、具体实现 (2)3.1类设计 (2)4、运行调试与分析讨论 (3)5、设计体会与小结 (10)6、参考文献 (10)附录:(源程序) (10)1、课程设计的目的及目标1.1课程设计的目的:本次课程设计的目的是为了让学生使用java语言编程的知识,通过编写一个简单的五子棋游戏,检验一个学期以来学习java语言的收获成果,以及检查自己在学习java语言的过程中的漏洞来弥补不足,以便以后更好、更熟练地使用java语言来编写方便、娱乐生活的程序。
1.2课程设计的目标:本次课程设计所要求的五子棋游戏应达到以下几方面的要求:1.运行程序后即刻出现棋盘并可以开始下棋;2.先手为黑棋,后手为白棋;人为先手,计算机为后手;3.程序能响应鼠标点击并在相应位置画出棋子;4.计算机具有一定的智能,能够与人进行五子棋对弈;5.程序可以正确判断出局面的胜负情况并及时报出结果,终止棋局;6.尽可能实现人人对战功能。
2、概要设计2.1开发工具及环境文本编辑器:记事本;运行环境:命令提示符(DOS环境)。
2.2任务及需求分析设计人机对弈五子棋程序,实现人与计算机进行五子棋对弈,具体任务如下:(1)棋盘布局设计;(2)计算机下子的算法分析;(3)编程实现棋子的绘制以及具体的再来一局、认输、悔棋、退出游戏等功能;(4)运行测试程序,调试纠正运行错误。
2.3工作原理(1)工作过程运行程序后,首先出现五子棋游戏窗体,用户点击游戏菜单项,出现相关子菜单,选择模式子菜单中的人机对弈便可进入人机对弈模式。
然后移动鼠标,在窗体的棋盘上点击鼠标下子,即可在棋盘中相应位置显示下的对应棋子。
接下来计算机会根据用户下的棋,采取穷举法选择八个方向上赢面最大的位置下子,用户与计算机谁先达到五子连成一线,谁便是获胜方。
若选择模式子菜单中的人人对战便可进入人人对战模式。
两个用户可同时玩游戏,同样谁先达到五子连成一线,谁便是获胜方。
若下棋过程中,双方中有一方要认输,便可选择游戏菜单项中的认输按钮,认输的一方显然失败,另外一方获胜。
若双方中有一方要悔棋,便可选择游戏菜单项中的悔棋按钮,经过对方的同意后,才能够重新翻盘,再来一局。
若双方势均力敌,可选择游戏菜单项中的棋盘子菜单,点击大号棋盘或超大号棋盘,以便避免棋盘空间不足造成无法分出胜负的情况。
若觉得窗体外观不太美观,可选择外观菜单中的三个选项进行选择。
为了显示程序的相关制作信息,程序提供了版本菜单进行显示。
具体功能实现见第四章节图。
(2)工作原理利用图形界面编程实现,利用到的知识点包括:❑窗体的创建和应用界面布局;❑事件处理,包括按钮的动作事件处理,鼠标事件,窗体事件;❑接口知识:事件处理中通过接口约束事件监听者必须实现相应接口中定义的方法;❑流程控制语句:通过条件判断区分不同事件源,作不同操作处理。
3、具体实现3.1类设计(1) 类名:ChessFrame作用:创建五子棋游戏主窗体和菜单。
该类继承JFrame类,实现ActionListener接口。
类中含有的方法介绍:❑ChessFrame()构造方法:构造五子棋游戏的主窗体;❑makeMenu()方法:构造五子棋游戏的主菜单;❑makeMenuItem()方法:构造五子棋游戏的菜单项;❑makeRadioButtonMenuItem()方法:构造五子棋游戏的单选按钮式菜单项。
(2) 类名:ChessModel作用:规定棋盘的宽度、高度、棋盘的模式;规定棋盘方格的横向、纵向坐标、棋盘方格的横向、纵向坐标所对应的棋子颜色;并且规定了记录棋盘棋子信息数组arrMapShow只有4个值:1,2,3,-1,其中1代表该棋盘方格上下的棋子为黑子,2代表该棋盘方格上下的棋子为白子,3代表为该棋盘方格上没有棋子,-1代表该棋盘方格不能够下棋子;定义了交换棋手的标识符isOdd,棋盘方格上是否有棋子的标识符isExist。
类中含有的主要方法介绍:❑ChessModel()构造方法:根据不同的棋盘模式(modeChess)来构建对应大小的棋盘;❑badxy()方法:判断下子的横向、纵向坐标是否越界;❑readyplay()方法:判断该坐标位置是否可下棋子;❑play()方法:在该坐标位置下棋子;❑computerDo()方法:用穷举法判断每一个坐标点的八个方向的的最大棋子数,最后得出棋子数最大值的坐标,计算机再下子(这八个方向分别是:左、右、上、下、左上、左下、右上、右下);❑checkMax()方法:计算棋盘上某一方格上八个方向棋子的最大值;❑showSuccess()方法:赢棋后的提示;❑showDefeat()方法:输棋后的提示。
(3) 类名:MainPanel作用:1、构建一个面板,在该面板上画上棋盘;2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等);该类继承JPanel类,实现MouseListener、MouseMotionListener接口。
类中含有的主要方法介绍:❑paintComponent()方法:根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),然后调用draw方法在棋盘上画出相应的棋子;❑mousePressed ()方法:响应鼠标的点击事件,根据鼠标的点击来下棋,根据下棋判断胜负等;❑mouseMoved()方法:响应鼠标的拖动事件。
(4) 类名:FiveChessAppletDemo作用:显示五子棋游戏窗体。
类中含有的方法介绍:❑main()方法:程序运行的入口,创建了ChessFrame类的一个实例对象(cf),并启动屏幕显示显示该实例对象。
(5) 类名:ChessWindowEvent作用:响应退出窗口。
类中含有的方法介绍:❑windowClosing()方法:处理窗口关闭;❑ChessWindowEvent ()构造方法:提供无参构造方法。
4、运行调试与分析讨论图4-1 人机对弈模式选择界面图4-2 人机对弈界面图4-3 结果信息显示界面图4-4人人对战模式选择界面图4-5 悔棋界面图4-6 悔棋提示界面图4-7 悔棋后棋盘清空提示界面图4-8 悔棋后棋盘清空界面图4-9 认输界面图4-10 认输提示界面图4-11 认输后结果信息界面图4-12 棋盘选择界面图4-13 外观类型选择界面图4-14 版本选择界面图4-15 版本信息介绍界面5、设计体会与小结通过独立完成五子棋对弈系统的后,发现自己在进行软件开发方面提高不少,同时积极利用所学到的新技术用于自己的设计开发过程。
另外,在整个开发的过程中,时间也比较仓促。
因此,该系统必然会存在一些缺陷和不足。
如:没有讨论五子棋禁手的问题。
另一个就是电脑按即定的算法去与玩家下子。
这种算法有“固定”。
不太会变,玩家若是仔细观察,可以掌握其规律。
还有就是界面不是很华丽有待改进。
尽管本系统存在着很多不足,但其实现了最重要的功能就是有人工智能。
这也让我对计算机中的人工智能领域有一定的了解。
另一个就在做系统的过程中,我学到了Java的一些基本结构,还有就是对于Java有更深一步的认识。
6、参考文献[1] 丁振凡,《JAVA语言程序设计》,清华大学出版社.[2] 丁振凡,《JAVA语言程序设计实验指导与习题解答》,清华大学出版社.[3] Charles Petzold. Windows程序设计. 北京大学出版社,2002.[4] 陈明,《Java语言程序设计》,清华大学出版社.附录:(源程序)import java.awt.*;import java.awt.event.*;import javax.swing.*;class ChessFrame extends JFrame implements ActionListener{private String[] strsize={"标准棋盘","大号棋盘","超大号棋盘"};private String[] strmode={"人机对弈","人人对战"};public static boolean iscomputer=true,checkcomputer=true;private int width,height;private ChessModel cm;private MainPanel mp;public ChessFrame() {this.setTitle("五子棋游戏");cm=new ChessModel(1);mp=new MainPanel(cm);Container con=this.getContentPane();con.add(mp,"Center");this.setResizable(false);this.addWindowListener(new ChessWindowEvent());MapSize(14,14);JMenuBar mbar = new JMenuBar();this.setJMenuBar(mbar);JMenu gameMenu = new JMenu("游戏");mbar.add(makeMenu(gameMenu, new Object[] {"再来一局", null, "棋盘",null,"模式", null,"认输", null, "悔棋", null, "退出"}, this));JMenu lookMenu =new JMenu("外观");mbar.add(makeMenu(lookMenu,new Object[] {"类型一","类型二","类型三"},this));JMenu helpMenu = new JMenu("版本");mbar.add(makeMenu(helpMenu, new Object[] {"关于"}, this));}public JMenu makeMenu(Object parent, Object items[], Object target){JMenu m = null;if(parent instanceof JMenu)m = (JMenu)parent;else if(parent instanceof String)m = new JMenu((String)parent);elsereturn null;for(int i = 0; i < items.length; i++)if(items[i] == null)m.addSeparator();else if(items[i] == "棋盘"){JMenu jm = new JMenu("棋盘");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int j=0;j<strsize.length;j++){rmenu=makeRadioButtonMenuItem(strsize[j],target);if (j==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}else if(items[i] == "模式"){JMenu jm = new JMenu("模式");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int h=0;h<strmode.length;h++){rmenu=makeRadioButtonMenuItem(strmode[h],target);if(h==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}elsem.add(makeMenuItem(items[i], target));return m;}public JMenuItem makeMenuItem(Object item, Object target){ JMenuItem r = null;if(item instanceof String)r = new JMenuItem((String)item);else if(item instanceof JMenuItem)r = (JMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}public JRadioButtonMenuItem makeRadioButtonMenuItem(Object item, Object target){JRadioButtonMenuItem r = null;if(item instanceof String)r = new JRadioButtonMenuItem((String)item);else if(item instanceof JRadioButtonMenuItem)r = (JRadioButtonMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}public void MapSize(int w,int h){setSize(w * 24, h * 27);if(this.checkcomputer)this.iscomputer=true;elsethis.iscomputer=false;mp.setModel(cm);mp.repaint();}public boolean getiscomputer(){return this.iscomputer;}public void restart(){int modeChess = cm.getModeChess();if(modeChess <= 3 && modeChess >= 0){cm = new ChessModel(modeChess);MapSize(cm.getWidth(),cm.getHeight());}}public void actionPerformed(ActionEvent e){String arg=e.getActionCommand();try{if (arg.equals("类型三"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); else if(arg.equals("类型二"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");elseUIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel" );SwingUtilities.updateComponentTreeUI(this);}catch(Exception ee){}if(arg.equals("标准棋盘")){this.width=14;this.height=14;cm=new ChessModel(1);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("大号棋盘")){this.width=18;this.height=18;cm=new ChessModel(2);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("超大号棋盘")){this.width=22;this.height=22;cm=new ChessModel(3);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人机对弈")){this.checkcomputer=true;this.iscomputer=true;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人人对战")){this.checkcomputer=false;this.iscomputer=false;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("再来一局")){restart();}if(arg.equals("悔棋")){if(!checkcomputer){int result = JOptionPane.showConfirmDialog(this, (FiveChessAppletDemo.isBlack==false?"白方悔棋,黑方是否同意?":"黑方悔棋,白方是否同意?"));if (result == 0) {JOptionPane.showMessageDialog(this, "双方同意悔棋决定,棋盘清空!请继续...");restart();}}}if(arg.equals("认输")){int result = JOptionPane.showConfirmDialog(this, "是否认输?");if (result == 0) {JOptionPane.showMessageDialog(this,"游戏结束,"+(FiveChessAppletDemo.isBlack==true?"黑方认输,白方获胜!":"白方认输,黑方获胜!")); }}if(arg.equals("关于"))JOptionPane.showMessageDialog(null, " 制作者:黄甜,熊婷婷,谭飘宝,汤素娟,邓婷\n 制作时间:2015年6月25日", "课程设计制作介绍",JOptionPane.PLAIN_MESSAGE ); if(arg.equals("退出"))System.exit(0);}}class ChessModel {private int width,height,modeChess;private int x=0,y=0;private int[][] arrMapShow;private boolean isOdd,isExist;public ChessModel() {}public ChessModel(int modeChess){this.isOdd=true;if(modeChess == 1){PanelInit(14, 14, modeChess);}if(modeChess == 2){PanelInit(18, 18, modeChess);}if(modeChess == 3){PanelInit(22, 22, modeChess);}}private void PanelInit(int width, int height, int modeChess){ this.width = width;this.height = height;this.modeChess = modeChess;arrMapShow = new int[width+1][height+1];for(int i = 0; i <= width; i++)for(int j = 0; j <= height; j++)arrMapShow[i][j] = -1;}public boolean getisOdd(){ return this.isOdd;}public void setisOdd(boolean isodd){if(isodd)this.isOdd=true;elsethis.isOdd=false;}public boolean getisExist(){ return this.isExist;}public int getWidth(){return this.width;}public int getHeight(){return this.height;}public int getModeChess(){return this.modeChess;}public int[][] getarrMapShow(){ return arrMapShow;}private boolean badxy(int x, int y){if(x >= width+20 || x < 0)return true;return y >= height+20 || y < 0;}public boolean chessExist(int i,int j){if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2) return true;return false;}public void readyplay(int x,int y){if(badxy(x,y))return;if (chessExist(x,y))return;this.arrMapShow[x][y]=3;}public void play(int x,int y){if(badxy(x,y))return;if(chessExist(x,y)){this.isExist=true;return;}elsethis.isExist=false;if(getisOdd()){setisOdd(false);this.arrMapShow[x][y]=1;}else{setisOdd(true);this.arrMapShow[x][y]=2;}}public void computerDo(int width,int height){int max_black,max_white,max_temp,max=0;setisOdd(true);System.out.println("计算机走棋 ...");for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){if(!chessExist(i,j)){max_white=checkMax(i,j,2);max_black=checkMax(i,j,1);max_temp=Math.max(max_white,max_black);if(max_temp>max){max=max_temp;this.x=i;this.y=j;}}}}setX(this.x);setY(this.y);this.arrMapShow[this.x][this.y]=2;}public void setX(int x){ this.x=x;}public void setY(int y){this.y=y;} public int getX(){return this.x;}public int getY(){return this.y;}public int checkMax(int x, int y,int black_or_white){int num=0,max_num,max_temp=0;int x_temp=x,y_temp=y;int x_temp1=x_temp,y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num<5)max_temp=num;x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}y_temp1=y_temp;for(int i=1;i<5;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;max_num=max_temp;return max_num;}public boolean judgeSuccess(int x,int y,boolean isodd){ int num=1;int arrvalue;int x_temp=x,y_temp=y;if(isodd)arrvalue=2;elsearrvalue=1;int x_temp1=x_temp,y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}x_temp1=x_temp;for(int i=1;i<6;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)return true;x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}y_temp1=y_temp;for(int i=1;i<6;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;return false;}public void showSuccess(JPanel jp){JOptionPane.showMessageDialog(jp,"你赢了","结果", RMATION_MESSAGE);}public void showDefeat(JPanel jp){JOptionPane.showMessageDialog(jp,"你输了","结果", RMATION_MESSAGE);}}class ChessWindowEvent extends WindowAdapter{public void windowClosing(WindowEvent e){System.exit(0);}ChessWindowEvent(){}}public class FiveChessAppletDemo {public static Boolean isBlack = true;public static void main(String args[]){ChessFrame cf = new ChessFrame();cf.show();}}class MainPanel extends JPanel implements MouseListener,MouseMotionListener{ private int width,height;private ChessModel cm;MainPanel(ChessModel mm){cm=mm;width=cm.getWidth();height=cm.getHeight();addMouseListener(this);}public void setModel(ChessModel mm){cm = mm;width = cm.getWidth();height = cm.getHeight();}public void paintComponent(Graphics g){super.paintComponent(g);for(int j = 0; j <= height; j++){for(int i = 0; i <= width; i++){int v = cm.getarrMapShow()[i][j];draw(g, i, j, v);}}}public void draw(Graphics g, int i, int j, int v){int x = 20 * i+20;int y = 20 * j+20;if(i!=width && j!=height){g.setColor(Color.darkGray);g.drawRect(x,y,20,20);}if(v == 1 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.black);g.fillOval(x-8,y-8,16,16);FiveChessAppletDemo.isBlack = true;}if(v == 2 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.white);g.fillOval(x-8,y-8,16,16);FiveChessAppletDemo.isBlack = false;}if(v ==3){g.setColor(Color.cyan);g.drawOval(x-8,y-8,16,16);}}public void mousePressed(MouseEvent evt){int x = (evt.getX()-10) / 20;int y = (evt.getY()-10) / 20;System.out.println(x+" "+y);if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){cm.play(x,y);System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]); repaint();if(cm.judgeSuccess(x,y,cm.getisOdd())){cm.showSuccess(this);evt.consume();ChessFrame.iscomputer=false;}if(ChessFrame.iscomputer&&!cm.getisExist()){puterDo(cm.getWidth(),cm.getHeight());repaint();if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){cm.showDefeat(this);evt.consume();}}}}public void mouseClicked(MouseEvent evt){}public void mouseReleased(MouseEvent evt){}public void mouseEntered(MouseEvent mouseevt){}public void mouseExited(MouseEvent mouseevent){}public void mouseDragged(MouseEvent evt){}public void mouseMoved(MouseEvent moveevt){int x = (moveevt.getX()-10) / 20;int y = (moveevt.getY()-10) / 20;cm.readyplay(x,y);repaint();}}。