《五子棋游戏课程设计报告.doc》由会员分享,可在线阅读,更多相关《五子棋游戏课程设计报告.doc(14页珍藏版)》请在三一办公上搜索。
1、 目录第一章 需求分析11.1 总体分析11.2 初始化11.3 主循环控制模块11.4 玩家下子11.5 盘面分析填写棋型表21.6 对方下子21.7 胜负判断2第二章 功能描述32.1 功能模块图32.2 功能说明3第三章 系统设计43.1 流程图43.2 流程图说明5第四章 运行结果6第五章 总结8第六章 致谢9附录一 参考文献10附录二 源代码11五子棋游戏第一章 需求分析1.1 总体分析软件需求分析是软件开发周期的第一个阶段,也是关系到软件开发成败的关键一步。对于任何一个软件而言,需求分析工作都是至关重要的一步。只有通过软件需求分析,才能把软件的功能和性能由总体的概念性描述转化为具体
2、的规格说明,进而建立软件开发的基础。实践表明,需求分析工作进行得好坏,在很大程度上决定了软件开发的成败。软件需求分析的任务是:让用户和开发者共同明确将要开发的是一个什么样的软件。具体而言,就是通过对问题及其环境的理解、分析和综合,建立逻辑模型,完成新软件的逻辑方案设计。基于本游戏,首先得为整个棋盘建立一张表格用以记录棋子信息,我们使用一个15*15的二维数组Table1515(15*15是五子棋棋盘的大小),数组的每一个元素对应棋盘上的一个交叉点,用0表示空位、1代表己方的子、2代表对方的子;这张表也是今后分析的基础。在此之后还要为两个玩家双方各建立一张棋型表Computer15154和Pla
3、yer15154,用来存放棋型数据。1.2 初始化首先,建立盘面数组Table1515、对战双方的棋型表Computer15154和Player15154并将它们清零以备使用;然后初始化显示器、键盘、鼠等输入输出设备并在屏幕上画出棋盘(棋盘可以不显示)。 1.3 主循环控制模块控制下棋顺序,当轮到某方下子时,负责将程序转到相应的模块中去,主要担当一个调度者的角色。1.4 玩家下子当轮到玩家下时,您通过键盘或鼠标在棋盘上落子,程序会根据该点的位置,在Table1515数组的相应地方记录2,以表明该子是玩家下的。1.5 盘面分析填写棋型表您在下五子棋时,一定会先根据棋盘上的情况,找出当前最重要的一
4、些点位,如“活三”、“冲四”等;然后再在其中选择落子点。先来分析己方的棋型,我们从棋盘左上角出发,向右逐行搜索,当遇到一个空白点时,以它为中心向左挨个查找,如果遇到己方的子则记录然后继续,如果遇到对方的子、空白点或边界就停止查找。左边完成后再向右进行同样的操作;最后把左右两边的记录合并起来,得到的数据就是该点横向上的棋型,然后把棋型的编号填入到Computerxyn中就行了(x、y代表坐标,n=0、1、2、3分别代表横、竖、左斜、右斜四个方向)。而其他三个方向的棋型也可用同样的方法得到,当搜索完整张棋盘后,己方棋型表也就填写完毕了。然后再用同样的方法填写对方棋型表。注意:所有棋型的编号都要事先
5、 定义好,越重要的号数越大! 1.6 对方下子有了上面填写的两张棋型表,就是遍历棋型表Computer15154和Player15154找出其中数值最大的一点,在该点下子即可。但这种算法的弱点非常明显,只顾眼前利益,不能顾全大局,这就和许多五子棋初学者一样犯了“目光短浅”的毛病。 如果在这儿下子将会形成对手不得不防守的棋型(例如:冲四、活三);那么下一步对手就会照您的思路下子来防守您,如此一来便完成了第一步的预测。这时再调用模块4对预测后的棋进行盘面分析,如果出现了四三、双三或双四等制胜点,那么己方就可以获胜了(当然对黑棋而言双三、双四是禁手,另当别论);否则照同样的方法向下分析,就可预测出第
6、二步、第三步等一等,要是盘面上没有对手必须防的棋型,哪该怎么办呢?进攻不成的话就得考虑防守了,将自己和对手调换一下位置,然后用上面的方法来预测对手的棋,这样既可以防住对手巧妙的攻击,又能待机发动反击,何乐而不为呢!1.7 胜负判断务须多言,某方形成五子连即获胜;若黑棋走出双三、双四或长连即以禁手判负。第二章 功能描述2.1 功能模块图图2.1 功能模块图2.2 功能说明该五子棋程序基本上实现了五子棋的游戏功能,有双方下棋的界面及最终判定结果的界面。同时该游戏采用二维坐标实现,明了易懂,方便玩家在游戏过程中的基本操作,使游戏更加简便。在细节方面,该系统提供实时存储功能,随时记录为完成的游戏,使用
7、户可以很好的处理意外中断的情况。该游戏基本实现了游戏的一些要求和特征。在游戏的源程序及文档方面,我们也严格遵守软件工程思想,立足实验要求,确定任务,需求分析,设计和编码,每个步骤力求清晰易懂。原代码注释详尽,各功能模块功能分明,可移植性强。当然该系统也有很多不足的地方,第一次进行独立的课程设计,也有很多细节方面是考虑到的,这款游戏也是在不断的调试和修改中产生和完善的。希望老师能够指出不足,帮助我不断提高。第三章 系统设计3.1 流程图图3.1 流程图3.2 流程图说明本程序定义了各种操作函数、各种状态判定宏,思想明确,思路清晰。各个判断选择了不同路径,因此继续进行或输出结果。程序中,“循环”的
8、利用非常直接和清晰,双方交替下棋,因此循环往复。最终决出胜负或最终平局。分析时,也考虑了许多种情况,针对各个情况均作出了相对措施和解决方案。程序采用循环进行双方交替下棋,并进行了很多判断。首先判断棋盘是否已满,若棋盘已满,则输出平局,结束游戏;若棋盘未满,则继续进行。然后判断“0”方是否胜出,若“0”方获胜,则输出“0”方获胜,结束游戏;若“0”方没有获胜,则继续进行。再判断“x”方是否获胜,若“x”方获胜,则输出“x”方获胜,结束游戏;若“x”方没有获胜,则继续进行。回到“首先”的判断。如此循环第四章 运行结果图4.1 运行结果初始图图4.2 游戏过程图图4.3 游戏进行图图4.4 “0”方
9、获胜图第五章 总结第六章 致谢附录一 参考文献1严蔚敏,吴伟民.数据结构.北京:清华大学出版社,2010年2苏仕华,魏韦巍,王敬生,刘燕君.数据结构课程设计(第二版).北京:机械工业出版社,2010年3谭浩强.C程序设计(第二版).北京:清华大学出版社,1999年4谭浩强.C+程序设计.北京:清华大学出版社,2009年附录二 源代码#include using namespace std; int Hsheng(char a15);/判断o子是否获胜的函数 int Bsheng(char a15);/判断x子是否获胜的函数 int he(char a15);/判断是否平局(也就是棋盘下满了)的
10、函数 void qipan(char a1515)/执行输出棋盘命令 cout本游戏采用二维数组实现,棋盘为15X15的二维直角坐标系,均从1到15,祝二位游戏愉快.; for(int i=0;i15;i+)/打印棋盘 for(int j=0;j15;j+) coutaij; coutendl; int main() char a1515; int x,y; for(int i=0;i15;i+) for(int j=0;j15;j+) aij= ; qipan(a); while(1)/用循环语句执行o,x交替下子,这些while语句看起来似乎是个死循环实际上都会经过break结束 int
11、a1=1; while(1) for(;a1;) coutxy; if(axy=o|axy=x)/判断是否已有子 cout已有子请重下=15|y=15)cout输入错误请重输,;continue; else axy=o; a1=0; break; qipan(a);/下好o子后将棋盘显示 if(Hsheng(a)/判断o子是否已经获胜 couto子获胜endl; break; while(1)/下x子 coutxy; if(axy=o|axy=x|x=15|y=15) for( ; axy=o|axy=x; ) cout已有子请重下; coutxy;continue; for ( ; x=15
12、|y=15|x; ) cout输入错误请重输,; /判断输入棋子位置是否正确 coutxy;continue ; axy=x;break; else axy=x; break; qipan(a);/再一次输出棋盘 if(Bsheng(a)/判断x子是否已经获胜 coutx子获胜endl; break; if(he(a)/判断是否平局 cout平局endl; break; return 0; int Hsheng(char a15) int i,j;/判断横着的5个是否都相等 for(i=0;i15;i+) for(j=0;j15;j+) if(aij=o&aij+1=o&aij+2=o&aij
13、+3=o&aij+4=o) return 1; for(j=0;j15;j+)/判断竖着的5个是否都相等 for(i=0;i15;i+) if(aij=o&ai+1j=o&ai+2j=o&ai+3j=o&ai+4j=o) return 1; for(i=0;i15;i+)/判断左斜5个 for(j=0;j15;j+) if(aij=o&ai+1j+1=o&ai+2j+2=o&ai+3j+3=o&ai+4j+4=o) return 1; for(i=0;i3;j-) if(aij=H&ai+1j-1=o&ai+2j-2=o&ai+3j-3=o&ai+4j-4=o) return 1; retur
14、n 0; int Bsheng(char a15)/同o,只是改字符 int i,j; for(i=0;i15;i+) for(j=0;j15;j+) if(aij=x&aij+1=x&aij+2=x&aij+3=x&aij+4=x) return 1; for(j=0;j15;j+) for(i=0;i15;i+) if(aij=x&ai+1j=x&ai+2j=x&ai+3j=x&ai+4j=x) return 1; for(i=0;i15;i+) for(j=0;j15;j+) if(aij=x&ai+1j+1=x&ai+2j+2=x&ai+3j+3=x&ai+4j+4=x) return 1; for(i=0;i3;j-) if(aij=x&ai+1j-1=x&ai+2j-2=x&ai+3j-3=x&ai+4j-4=x) return 1; return 0; int he(char a15) for(int i=0;i15;i+) for(int j=0;j15;j+) if(aij= )/当棋盘全部子都不是 时才能return 1,即棋盘已下满 return 0; return 1;