五子棋课程设计报告.docx
- 文档编号:11107849
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:13
- 大小:21.85KB
五子棋课程设计报告.docx
《五子棋课程设计报告.docx》由会员分享,可在线阅读,更多相关《五子棋课程设计报告.docx(13页珍藏版)》请在冰豆网上搜索。
五子棋课程设计报告
--------六子棋
C语言课程设计
报告
目录
第一章导言
1.1概述………………………………………………2
1.2项目背景………………………………………………2
1.3开发人工作情况概述………………………………………………2
第二章项目概述
2.1软件系统需求分析………………………………………………
2.2软件运行环境………………………………………………3
2.3软件主要设计思想………………………………………………3
2.4软件功能模块说明………………………………………………4
2.5程序流程………………………………………………7
2.6系统数据库设计………………………………………………11
2.7系统功能函数简介………………………………………………12
2.8本软件存在的缺陷………………………………………………14
第三章用户使用手册
3.1六子棋游戏程序的功能说明…………………………………………15
3.2六子棋游戏程序的的性能明…………………………………………15
3.3六子棋游戏的运行说明…………………………………………15
3.4用户操作说明…………………………………………15
第四章课程设计心得体会……………………………………20
第五章系统源代码………………………………………………22
第一章导言
1.1概述
本程序是一款棋类益智游戏程序,类似于五子棋游戏,是采用
C语言编写的可在WINDOWS系统下运行的娱乐游戏平台。
该程序面向广大棋类游戏的爱好者,能够提供方便,实现基本智能控制的游戏环境。
本程序可以实现人人对战以及人机对战,用户可以根据需要自行选择,人机对战中电脑这方具有一定智能,具备对奕能力。
在游戏人机对话接口上,人人对战,为方便双方棋手,采用键盘两边控制,一方是A,S,D,W,SPACE控制棋子移动及下棋,另一方是方向键及ENTER控制移动及下棋,双方都可通过ESC键退出游戏,人机对战中,棋手可用鼠标来操作,点击界面退出按钮终止游戏。
游戏开始后,选择模式,可进入相应界面,左方显示30*30的棋盘,右方会有游戏相关操作说明,本游戏默认黑棋先手,六子连珠者胜,程序会提示当前下棋的棋手,结束时会显示对战双方胜负情况。
1.2项目背景
项目名称:
六子棋
项目发布:
周纯杰,何顶新,周凯波,彭刚
指导老师:
周纯杰,何顶新,周凯波,彭刚
项目开发人员:
华中科技大学——控制科学与工程系
自动化0707班凡速飞(组长),田绍宇
参考资料:
《人工智能》马少平朱晓燕清华大学出版社
《标准C语言课程设计及应用》周纯杰等华中科技大学出版社
《C高级实用程序设计》王士元.北京:
清华大学出版社
《C语言课程设计》陈清华,朱红.南京:
东南大学出版社
《C语言程序设计》潭浩强.北京:
清华大学出版社
《C语言高级实例解析》汪晓平清华大学出版社
《C语言游戏编程》
《高级语言程序设计(C语言版)》刘加海浙江大学出版社
开发成果:
六子棋游戏
1.3开发人员工作情况概述:
凡速飞:
(组长)
具体工作:
编写开始界面,设计编写电脑下棋即人工智能部分的算法和代码,实现界面汉化,并建立工程,组装程序
田绍宇:
具体工作:
整个游戏界面,包括模式选择,游戏进行,结束等界面程序,设计编写游戏主控模块,人人对战算法及最终代码,游戏胜负判定,写程序设计报告。
第二章、项目概述
2.1软件系统需求分析
开始显示30*30的棋盘,通过模式选择实现人人对战及人机对战,六子连珠者胜,黑棋先手,要能动态显示下棋顺序,而且能自动判断输赢及显示胜负信息
2.2软件运行环境
该程序是用C语言在BC下编写的,通过BC的工程化建立了一个工程文件,编译后生成了一个可执行的EXE文件,只要计算机具有BC,该文件可以在WINDOWS环境下点击运行。
2.3软件主要设计思想
本游戏设计的是一款六子棋游戏,在设计中,我们最主要的是通过建立一个二维数组
chess【30】【30】来代表记录棋盘上各点信息,通过宏定义将棋手定义成整型值,便于记录,例如:
当在棋盘左上顶点处1号棋手下了一粒白子后,就将chess【0】【0】这个值记为2,这样就把下棋信息记录下来了,这就是所谓的棋型表,之后的判断胜负,棋手下棋都是通过搜索这个数组来作出相应判断和操作
主控模块中,为实现交换棋手,通过一个中间值step来实现,设一个初值,为0,然后每个棋手下完后,进行step自增,这样通过选择判断,if(step%2==0),则2号棋手下棋,否则1号棋手下棋,主循环用while
(1)不断循环判断执行
为动态显示下棋顺序,是通过书写覆盖,再书写再覆盖来实现的
判断胜负是用judgewin这个函数,再数组中搜索相邻的位置是否是己方棋子,是就用一个变量加一,否则退出,分别向八个方向搜索,一个方向上存在六子连珠就获胜。
智能体中,为实现电脑智能判断,关键是要使电脑能够找到一个最佳位置,我们通过六子棋相关规则及下棋方法,设计一套评分规则,搜索棋型表中己方及对方各点,根据评分规则给各点评分,找到己方及对方分数最高的点,分别代表进攻及放手的最佳位置,然后比较这两点的分数,选择是进攻还是防守,实现对奕功能
2.4软件功能模块说明
胜负判断模块
界面及图形模块
棋子函数
人人对战模块
2号棋手
人机对战模块
电脑(智能体)
2.5程序流程
主函数流程图
初始化图形及数据
显示欢迎界面
选择(Y或N)
NY(或ENTER)
模式选择
选择(1或2)
12
人机对战
人人对战
主循环控制模块
结束
人人对战程序流程
人人对战
Step++Step值的奇偶来判断,初值为0
奇偶step++
2号棋手
1号棋手
下棋
移动棋子
下棋
移动棋子
判断胜负
判断胜负
交换棋手
显示胜负信息
否是是否
显示胜负信息
交换棋手
棋手下棋流程
Player1或player2
显示当前下棋的棋手
AD/ENTER/SPACEW/S/ESC
下移光标
上移光标
退出
下棋
右移光标
左移光标
判断当前有无棋子
有无
显示棋子
退出循环
改变棋型表相应值
判断胜负
是否
退出循环,交换棋手
结束
电脑下棋流程
2.6系统数据结构设计
定义二维数组chess【30】【30】//来存取棋盘上各个位置棋子信息
#defineLEFT0x4b00//控制棋子移动的方向键键值
#defineRIGHT0x4d00
#defineUP0x4800
#defineDOWN0x5000
#defineF10x3b00
#defineA0x1e61
#defineS0x1f73
#defineD0x2064
#defineW0x1177
#defineF20x3c00
#defineESC0X011b//退出键
#defineENTER0x1c0d//下棋键键值
#defineSPACE0x3920
#defineROW30//需要用到的相关定义
#defineCOLUMN30
#defineYES0x1579
#defineNO0x316e
#defineLEFTUP5
#defineRIGHTDOWN6
#defineLEFTDOWN7
#defineRIGHTUP8
#defineSIZE10
#defineFALSE0
#defineTRUE1
#defineCOMPUTER1//定义棋手
#definePLAYER12
#definePLAYER23
2.7系统功能函数简介
voidready();//初始界面,显示相关简介说明
voidinit_graph();初始化图形系统,单独写一个函数减少重复
voidinit_data();初始化数据,即用于存储棋型表的二维数组的值
voidChooseplay_with_who();模式选择界面,根据提示输入选择值,将可进入不同界面,开始不同游戏
voiddrawchessboard(intplay_with_who);
游戏界面,其中具有一个参数play_with_who,接收用户输入的输入值,函数会根据不同值显示不同界面
intjudgewin(intx,inty,intflag,intchess[30][30]);
判断胜负,参数X,Y是棋子所下位置坐标,flag用于接收下棋的棋手信息,chess【】【】是棋型表信息
voidShowchess(intx,inty,intflag);
在当前位置X,Y坐标处根据棋手flag画棋子
voidENDmessage(intplay_with_who,intflag);
结束画面,将显示胜负信息
voidGuangbiao(intx,inty);
光标函数,会在传给它的坐标出显示一个闪动的光标
voidplayer1(intchess[30][30]);
1号棋手下棋控制函数,chess【】【】跟随记录棋盘上当前信息
voidplayer2(intchess[30][30]);
2号棋手下棋控制函数,chess【】【】跟随记录棋盘上当前信息
voidplayer(intchess[30][30]);
人机对战中,人这一方下棋控制函数
voidcomputer(intchess[30][30]);人机对战中智能体部分
intInitmouse();鼠标初始化函数
voidShowmouse();显示鼠标
voidHidemouse();隐藏鼠标
voidReadmouse(int*f,float*x,float*y);读取鼠标位置和状态
voidmouse(intchess[30][30],intstep);
voidopen_hzk();打开汉字库
voidget_hz(charincode[],charbytes[]);读取汉字
voiddishz(intx0,inty0,charcode[],intcolor);在X0,Y0处显示汉字
doublescore(intchess[ROW][COLUMN]);
电脑下棋中根据评分规则用于计算某点分数
doublescore_row(inti,intj,intchess[ROW][COLUMN]);
计算某点在横向上的分数
doublescore_column(inti,intj,intchess[ROW][COLUMN]);
计算某点在纵向上的分数
doublescore_diag_45(inti,intj,intchess[ROW][COLUMN]);
计算四十五度角方向上的分数
doublescore_diag_135(inti,intj,intchess[ROW][COLUMN]);
计算135度角方向上的分数
doubletotal_score(intwho_running,intchess[ROW][COLUMN]);
计算某个棋手的总分
2.8本游戏程序存在的缺陷
由于是初次开发如此大型的程序,没有任何经验,很多困难都是第一次遇到,就目前而言,一些基本的BUG已经排除,到目前为止,基本上没有发现影响程序主体功能的BUG。
另外,对于人工智能部分的设计由于我们水平实在有限,所以,电脑的智能程度并不高,这也是我们的一大遗憾。
在界面制作上有些简陋,不是很漂亮,操作上还不是很人性化,本应该做菜单,实现鼠标菜单操作,让游戏进行起来不方便,但由于一开始没准备设计这项,后来又时间不够,故有此缺憾,不过,我们经历课设还会找时间对其进行一定完善,不让自己留有遗憾。
第三章、用户使用手册
3.1六子棋游戏程序功能说明:
本六子棋游戏程序可以实现BorlandC环境下的简单智能控制的六子棋娱乐游戏,可以自动判断输赢,自动显示胜负信息,下棋中可以动态显示下棋顺序,在人机对战中电脑可以实现基本的智能判断,找到较佳的下棋位置与人对奕。
3.2六子棋游戏程序性能说明:
3本游戏程序具有基本智能,灵活性、方便等特点。
1基本智能
本游戏程序中,计算机可以自动显示下棋顺序,判断胜负,显示胜负信息,计算机也课实现与人对奕。
2.灵活性
本游戏程序可以DOS/WINDOWS9X/ME/2000/XP等操作系统下顺利运行,不会由于操作系统的不同而出现运行上冲突的问题,有极高的适应性。
3.方便
本游戏程序通过键盘两边操作,实现棋手对立操作,避免交叉,而且键盘操作方便,光标移动显示当前位置,人机对战中,实现鼠标控制,操作更便利
3.3六子棋游戏程序运行说明:
本游戏程序无需安装,点击BC编译生成的EXE文件即可执行
3.4用户操作说明:
开始进入欢迎界面,按Y或ENTER进入,按N退出,进入后,显示模式选择,选择不同模式和不同对手对奕。
在人人对战中,黑棋方先行,按方向键控制光标移动,找到位置后,按ENTER键下棋,然后轮到白棋方下,白棋方用A,S,D,W控制光标移动,找到位置后按SPACE下棋,下棋中不必自行判断胜负,电脑会判断并最终显示,双方都可以通过按ESC键强行退出游戏
在人机对战中,己方为黑棋,己方先手,通过鼠标下棋,点击退出按钮可以退出
第四章、课程设计心得体会
田绍宇:
这次C语言课程设计自第三周开始到第八周结束,历时六周,在这六周中,我和我的合作人冥思苦想,刻苦钻研,克服一个又一个困难,虽然这个过程十分艰难,但我们充分进入,享受,经历着这样一个过程,从中学到了不少东西。
刚开始,我们实在是无从下手,一个刚刚学会编写简单C语言题实现简单功能的人突然面对这样一个结构复杂,技术困难,工程庞杂的程序设计项目,实在不知如何是好。
幸好,我们谨尊老师的指导,首先完成目标设定及工作计划,分配好任务,迈出了课设的第一步。
然后,我们着手学习相关知识,包括C绘图,文件操作,动画,键盘控制,鼠标操作,五子棋算法,人工智能博弈搜索算法(极大极小搜索算法),汉化等等知识,然后开始算法设计,这个工作十分艰难和耗时,期间我们多次向人请教,并咨询老师,获得了极大帮助,在此向他们表打由衷的感激之情。
之后,我们开始了代码的编写。
在这之中,最困难的是调试,解决一个又一个BUG,最终,我们的作品呈现在我们面前,不禁教我感慨万千。
经历此次课设,充分加深了我对C语言知识的理解和掌握,极大丰富了我的知识,同时也大大锻炼了我的思维和面对困难解决困难的勇气及方法,另外也让我学会如何与人合作,协调工作,共同努力,这无疑是将来急切需要的一种能力。
总之,课设这个过程将成为一笔宝贵的人生财富,助我们不断成长,进步!
凡速飞:
作为本软件的总体构思和编制者,在本软件的设计过程我遇到了前所未有的困难,这些困难是我在之前的C语言学习过程中从来没有碰到的。
起初面对该课题,基本上是无从下手,面对这么多的知识,那些要用到,那些不会用到,基本上没什么概念,接到课题的头三个星期由于高级编程技术的缺乏,我们一组成员基本上都是在看书,其中想到了很多想法以及如何实现,但现在程序编完了以后,从头来看,得出的结论是:
想法和实现是有很大距离的。
很多想法实现起来有很大的困难,这些困难可能是由于自己以前基础知识的漏洞;可能是由于算法的不完善;可能是由于自己程序与组员的程序联接问题;还有可能是编译工具的使用不熟练…
通过本次的C语言课程设计,我最深的体会就是编程要有详细的计划,明确的方向和流程是多么的重要!
在之前的工作中,由于没有完善的总体设计,我们在程序设计过程中部入了很多误区,编程过程中有一段时间没有什么任何成果,我一度非常灰心丧气,甚至有几天有放弃的念头。
尽管编制软件的过程非常辛苦,但毕竟挺过来了。
跟某些牛叉的人相比,感觉我们的东西就像垃圾,但毕竟是自己的第一个软件作品,看着自己的成果,感到非常欣慰,也许实现方式比较龊,但按要求的基本功能都有了。
它是我从不懂到懂,亲手实践的结晶,对我来说具有非比寻常的意义。
通过这次C语言课程设计的学习,我收获很多,尤其是与他人合作的能力,在这合作项目中,由于分歧,我们小组一度发生严重争吵。
现在我学会了要更多的与人合作,要多与他人交流,才能完成一个好的项目。
第五章程序源代码
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 课程设计 报告