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