6数据结构课程设计报告.pdf
《6数据结构课程设计报告.pdf》由会员分享,可在线阅读,更多相关《6数据结构课程设计报告.pdf(31页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1淮 阴 工 学 院数据结构数据结构课程设计报告课程设计报告选题名称选题名称:五子棋人机对战系(院)系(院):计算机工程学院专专业业:计算机科学与技术班班级级:姓姓名名:学学号号:指导教师指导教师:周海岩单劲松学年学期学年学期:2012 2013 学年 第1学期2012年12月20日2设计任务书设计任务书课题课题名称名称设计设计目的目的1掌握关键数据结构,如线性表、树、图建立过程及操作算法;2掌握常用算法的实现方法及作用;3理解利用数据结构及算法解决实际问题的思想;4学会资料收集与整理方法,学会撰写实习报告;5学会对所学知识进行总结,加深对课堂知识的理解与掌握。实验实验环境环境1Windows
2、 2000 以上操作系统;2C+,C#或 Java 编程工具。任务任务要求要求1利用课余时间去图书馆或上网查阅课题相关资料,深入理解课题含义及设计要求,注意材料收集与整理;2在第 15 周末之前完成预设计,请指导教师审查通过后进行下一步工作;3按所设计方案进行软设计;4完成系统设计,写出报告初稿方可申请参加答辩;5结束后,及时提交实习报告(含纸质稿、电子稿)。工作进度计划工作进度计划序号序号起止日期起止日期工工作作内内容容12012.11.122012.11.25查阅资料,提出设计方案。22012.11.262012.12.8根据提出设计方案逐项完成。32012.12.242012.12.30
3、在机房实现软件系统、系统调试。42013.1.32013.1.6根据教师反馈意见,修改、完善、上交实习报告。指导教师:指导教师:2012年年 11月月10日日3摘要:人工智能是一门正在迅速发展的新兴的,综合性很强的边缘科学。它与生物工程、空间技术一起被并列为二十一世界三大尖端技术。它的中心任务是研究如何使计算机去做那些过去只能靠人的智力才能做的工作。目前各发达国家都把人工智能作为重点列入本车的高科技发展计划当中,投入巨大的人力和物力。计算机人机对弈也是其中之一。作为人智能研究的一个重要分支,计算机博弈是检验人工水平的一个重要方面。它的研究为人工智能带来了很多重要的方法和理论,产生了广泛的社会影
4、响和学术影响。五子棋人机对弈是计算机博弈中的一种。研究其计算机算法,可以让我们看到人工智能的初影,也有助于我们人脑的开发。五子棋是我国发明的,研究它可以让更多的外国人了解,有助于我国优秀文化的推广。关键词:人工智能;计算人机对弈;五子棋;算法4目目录录1.概概 述述.51.1 背景分析 51.2 国内外现状52.需求分析需求分析.52.1 业务需求 52.2 性能需求52.3 系统平台需求63.总体设计总体设计.63.1 系统流程图63.2 系统分析 64.系统实现系统实现.104.1 界面的实现104.2 智能算法实现 115.系统测试分析系统测试分析.265.1 系统测试26总总结结.27
5、致致谢谢.28参考文献参考文献.2951.1.概概 述述当电脑进入我们的生活中,许多与相关学科都欣欣的向上发展。典型的有电子商务、电子邮件等。当然也有人智能了。人们在惊叹机器人高效的工作时,也会想起自己聪明的一面。人工智能也这方面也就深受我们喜爱。1.11.1 背景分析背景分析五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“连珠”,英译为“Ren-ju”,英文称之为“Gobang”或“FIR”(Five in a Row 的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。1.21.2 国内外现状国内外现状国内外研究五子棋的算法不少。有递归
6、法、二叉树等。当然我所讨论的是一般的算了法。无论何种算法,其大体遵循两条原则:1.使规则更加自然流畅,更容易被人接受。2.使棋的内容更加丰富多彩。而对于五子棋来说,所面临的困境归根结底是来自于其最本质的特点,也是目前一切规则的共同之处:连五终局。2.2.需求分析需求分析2.12.1 业务需求业务需求2.1.12.1.1 使用范围要求使用范围要求该系统适于游戏爱好者。2.1.22.1.2 功能要求功能要求(1)玩家能与电脑下子(2)适于新手来玩2.22.2 性能需求性能需求系统不大,但满足玩家基本要求,电脑有一定智能,能给于新手帮助。62.32.3 系统平台需求系统平台需求2.3.1.2.3.1
7、.系统开发平台系统开发平台操作系统:Windows xp 系列开发工具:Visual C+6.03.3.总体设计总体设计进入系统之后。玩家按 F1 开始游戏,首先是玩家下子,接着电脑下子。一直循环。在电脑或是玩家下了一个子后,电脑计算一下,是否电脑获胜或玩家获胜或是和棋。若有一种情况出现,则暂停游戏显示出相应的结果。若玩家还想玩,继续按 F1,若要退出则按 F12。在游戏开始后,玩家可按 F11 进行智能提示。3.13.1 系统流程图系统流程图程序流程图如图 3-1 所示。首先看到的界面是我们熟悉的棋盘。可看到下面有一行文字。当用户按 F1 时,则游戏开始,这时用户先下子。电脑此时先根据算法计
8、算下,是否和棋,是否电脑获胜,是否玩家获胜,若有一种情况发生,则进入暂停阶段,此时下子则无效,电脑显示相应的结果,否则电脑就根据自己的得分算法,计算出最佳位置。电脑下子了后,则电脑继续判断是否和棋,是否电脑获胜,是否玩家获胜,若有一种情况发生,同样进入到暂停阶段,显示相应的结果。若用户按了 F12,则整个系统退出结束。若在开始后,又按了 F11,则显示提示功能。这对于新手来说是很好的功能。3.23.2 系统分析系统分析在看别人下棋时,我们常说一句“当局者迷,旁观者清”,但这句话对于 AI所控制的计算机来说是不正确的。A:求得所有获胜的组合首先,在一场五子棋的游戏中,计算机必须要知道有哪些获胜的
9、组合,因此必须求得获胜的组合的总数,而求出总数后便可建立一个数组。我要做的是 19X19 的棋盘,获胜总数有点多。下面一一来讨论。(以表格作为棋盘,1 表示为某一方的子,其中以(i,j)表示第 i 行第 j 列的格子,)73.2.13.2.1 计算水平方向的获胜组合数计算水平方向的获胜组合数123 1516171819可以看到对于第一行中(1,1),(1,2),(1,3),(1,4),(1,5)这五个格可以是一个获胜组合,而(1,2),(1,3),(1,4),(1,5),(1,6)这五个格子也可以组成玩家下子进入界退 出 游开始游和棋电脑获胜玩家获胜电脑下子和棋电脑获胜玩家获胜暂停并显示结和棋
10、电 脑 获玩 家 获和棋电 脑 获玩 家 获当 前 界退出YNYNYNYNYNNYYNNY3-18一个获胜组合。这样一直到最后一种为(1,15),(1,16),(1,17),(1,18),(1,19)这五个格子组成一个获胜组合。即第一行有 15 种获胜的组合。总的有19 行。可得,对于行中,我们有 19X15=285 种获胜组合。3.2.23.2.2 计算垂直方向的获胜组合数计算垂直方向的获胜组合数同理对于垂直的获胜组合中第一种为第一列的 1,2,3,4,5 可组成一个获胜组合。总的获胜组合也是 19X15=285 种。3.2.33.2.3 计算正斜方向的获胜组合数计算正斜方向的获胜组合数12
11、3451516171819、在第一行中,则可知(1,1),(2,2),(3,3),(4,4),(5,5)为一获胜组合,而(1,3),(2,4),(3,5),(4,6),(5,7)也是一种获胜组合。第一行中的最后一种为(1,15),(2,16),(3,17),(4,18),(5,19)。总的获胜组合有 15种,而最后一行 i 只能到 15。这样我们可以计算得到正斜有 15X15=225 种。3.2.43.2.4 计算反斜方向的获胜组合数计算反斜方向的获胜组合数依据上一种正斜,同理可推知反斜也有 15X15=225 种。由前面的讨论中,我们可计算出 19X19 表格中五子棋的获胜种数。一共有285
12、+285+225+225=1020 种获胜方式。B:建立一些相应的变量对此我建立了一个数组,如下:BOOL cmp19191020;/电脑的每一颗棋子是否在各个获胜组合中BOOL ply19191020;/电脑的每一颗棋子是否在各个获胜组合中int wcount21020;/电脑与玩家在各个组合中的棋子个数(三个变量的简写来源 cmp:computer ply:player wcount:win count)如上述讨论可知,对于电脑,若为正斜中的第一种情况,并假定为 1020 种获胜组合中的第 570 种获胜组合。则其数组元素值设定如下:cmp00570=true;cmp01570=flase
13、;9cmp02570=false;cmp10570=false;cmp11570=true;cmp12570=false;cmp22570=true;cmp33570=true;cmp44570=true;ply数组元素的初始化与 cmp是相同的,但若程序执行时,若玩家的棋占了(0,0)的位置,那么电脑在 cmp00570元素就会置为 false,因为计算机就不可能再下到(0,0)上,第 570 种方法中对电脑来说是不可能的情况了。对于若是电脑占了(0,0)的位置,则玩家中此获胜组合中也置为不可能。wcount21020用来记录玩家或计算机在各自的获胜组合中棋子的个数。其中 wcount0来计
14、算电脑的个数,wcount1用来计算玩家的个数。C:分数的设定组在游戏中,为了让电脑找到最佳的走法,必须计算出电脑下到棋盘中任一格的分数,其中最高分即是电脑下的位置。如下表所示1 12 23 34 45 56 67 78 89 910100 00 00 05 50 00 00 05 50 00 05 50 00 010100 0010100 00 00 00 010100 015150 015150 00 00 00 00 00 01515202020200 00 00 00 00 00 00 00 0C CP P0 00 00 00 00 00 00 01515202020200 00 00
15、 00 00 00 010100 015150 015150 00 00 00 05 50 00 010100 00 010100 00 00 0100 00 00 05 50 00 00 05 50 00 00 00 00 00 00 00 00 00 00 00 0如上表所示,为什么会出现在 C 左边为 0 而下面却为 20 分呢。我们看下上面的表格就可知,C 的左边有三个格,则必须再加上左右边的一个格了,而右边的一个格子被电脑占了,此获胜组合中置为不可能,得分为 0。以上是按每一种获胜组合为 5 分的来计算的。在每一次运行中,电脑都按些种算法,则电脑可以找到最佳的位置。D:攻击与防守经上
16、述讨论可知,电脑一直在找自己一方的最佳位置。若玩家在某个时刻获胜了,电脑也在寻找自己的位置。4.4.系统实现系统实现系统经过分析并加以设计,就可以着手进行实现了,本系统主要分为界面实现和算法实现。4 4.1.1 界面的实现界面的实现本系统首先印入眼帘的是五子棋的界面。本系统的启动界面窗口如图 4-1所示。图 4-1利用 MFC 建立一个 MFC 工程。在 mainFrame 的析构函数中,插入下一句代码:Create(NULL,五子棋11,WS_OVERLAPPEDWINDOW&WS_SIZEBOX&WS_MAXIMIZEBOX,CRect(0,0,700,700),NULL,NULL,0,N
17、ULL);则此窗口生成的标题为“五子棋”,当加入了 WS_SIZEBOX 与WS_MAXIMIZEBOX 后,此窗口就不能最大化显示且不能调整边框大小,即一创建的框架为不可改变的大小,另一个为 CRect(0,0,700,700)。此框架的大小为700X700。窗口创建后就是导入图片。为此首先导入图片到工程中,命名为 IDB_BJ。初始值为 0,加载背景之后就置为 1。则可知,背景只显示一次。其代码如下:CBitmap bj;/存放背景图CDC membj;/内存变量背景membj.CreateCompatibleDC(&dc);/创建相容的内存变量bj.LoadBitmap(IDB_BJ);
18、/加载背景图membj.SelectObject(&bj);/选择背景图/初始时只需显示一次背景就可if(0=flagbj)/若是左键单击了之后才可重新绘图,目的是白子只重新绘制一次if(1=flaglb)dc.BitBlt(0,0,700,700,&membj,0,0,SRCCOPY);/置为 1 表示不再显示背景flagbj=1;4.24.2 智能算法实现智能算法实现为了计算得分,在讨论之前要声明几个变量和几个函数。int borad1919;/五子棋盘的状态。0 表示无棋,1 表示为电脑的棋子,2 表示为玩家的棋子(borad)BOOL cmp19191020;/电脑的获胜组合情况(co
19、mputer)BOOL ply19191020;/玩家的获胜组合情况(player)int wcount21020;/双方的组合情况中子的个数,wcount01020为12电脑,wcount11020为玩家(win count)int pscore1919;/电脑的得分(player score)int cscore1919;/玩家的得分(computer score)BOOL bcmp;/是否轮到电脑下棋(bool computer)BOOL bply;/是否轮到玩家下棋(bool computer)BOOL start;/游戏是否开始(start)BOOL pwin;/电脑是否获胜(pla
20、yer win)BOOL cwin;/玩家是否获胜(computer win)BOOL tie;/是否和棋(tie)BOOL tishi;/是否有智能提示(tishi)void initGame();/初始化棋盘(initalite game)void countScore();/计分函数(count score)void cmpTurn();/电脑下子算法(computer turn)BOOL plyGame();/是否玩家获胜(player game win)BOOL cmpGame();/是否电脑获胜(computer game win)BOOL tieGame();/是否为和棋(tie
21、 game)int topScore();/查找最高分;返回最高分数(top score)/寻找电脑的随机位置并保存在 mc,nc 中(search count)void searchCount(int top,int countTep,int*mc,int*nc);int countTop(int top);/返回最高分的个数(count top score)首先要进行初始化。先对棋盘及分数进行初始化。/0 表示无棋子,1 表示为电脑的棋子,2 表示为玩家的棋子for(i=0;i19;i+)for(j=0;j19;j+)pscoreij=0;/玩家各得分为 0cscoreij=0;/电脑各得
22、分为 0boradij=0;/各空格置为无子13/各获胜组合中的棋子数为 0for(k=0;k1020;k+)wcount0k=0;/电脑获胜组合数的个数wcount1k=0;/玩家获胜组合数的个数然后要对获胜组合进行初始化。/初始时各种获胜组合中的值都为 falsefor(i=0;i19;i+)for(j=0;j19;j+)for(k=0;k1020;k+)cmpijk=false;plyijk=false;/行的组合情况,count 的初始值为 0for(i=0;i19;i+)for(j=0;j15;j+)for(k=0;k5;k+)cmpij+kcount=true;plyij+kcou
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告
限制150内