武汉理工大学数据结构与算法综合实验连连看.pdf
《武汉理工大学数据结构与算法综合实验连连看.pdf》由会员分享,可在线阅读,更多相关《武汉理工大学数据结构与算法综合实验连连看.pdf(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、.学生学号学生学号Xxx实验课成绩实验课成绩学学 生生 实实 验验 报报 告告 书书实验课程名称实验课程名称开课学院开课学院指导教师姓名指导教师姓名学生姓名学生姓名学生专业班级学生专业班级数据结构与算法综合实验计算机科学与技术学院xxxxxxxx2015-2016学年第2学期.实验课程名称:数据结构与算法综合实验实验项目名称实验者同组者xxx连连看游戏综合实践专业班级xxxxx报告成绩组别完成日期年月日第一部分:实验分析与设计(可加页)一、实验目的和要求1.目的目的调研连连看游戏,了解连连看游戏的功能和规则等。掌握集成开发工具。掌握 C+的基础编程。了解 MFC 框架,包括 MFC Dialo
2、g 应用程序和 GDI 编程。了解线性结构,重点掌握数组和栈操作,掌握数组的遍历、消子和胜负判断等算法。了解企业软件开发过程,了解系统需求分析和设计,应用迭代开发思路进行项目开发。养成良好的编程习惯和培养软件工程化思维,综合应用“C+编程、MFC Dialog、算法、线性结构”等知识,开发“连连看游戏”桌面应用程序,达到掌握和应用线性核心知识的目的。2.要求要求待开发的连连看游戏称为“欢乐连连看”,使用二维数组来保存游戏地图的数据,实现连连看的核心功能。欢乐连连看的功能有:主界面、开始游戏、消子、判断胜负、提示、重排、计时、游戏模式。主界面.游戏主界面就是进行各项操作的入口。开始游戏玩家选择开
3、始游戏模式,进入游戏后,选择开始游戏,系统根据设置的主题风格生成图片布局,以供玩家点击消除。游戏地图大小为 640*400,是一个 16 行乘 10 列的矩形,分成 160 个小正方形,存放 160 张图片,每张图片大小为 40*40。消子对玩家选中的两张图片进行判断,判断是否符合消除规则。只有符合以下规则的图片对才能被消除:一条直线连通两条直线连通三条直线连通如果可以消除,从游戏地图中提示连接路线,然后消除这两张图片,并计算相应的积分。如果不能消除,则保持原来的游戏地图。判断胜负当游戏完成后,需要判断游戏胜负。不同模式下判断胜负的规则不同。基本模式时,如果在五分钟内将游戏地图的所有图片都消除
4、,则提示玩家胜利。休闲模式时,如果游戏地图中所有图片都被消除,则提示玩家获胜。提示可以提示界面上能够消除的一对图片。计时设定一定时间来辅助游戏是否结束。.重排根据随机数,重新排列地图上的图片。游戏模式游戏模式有:基本模式、休闲模式和关卡模式三种,可以根据是否定时等规则进行设置。二、分析与设计1.数据结构的设计1)1)顶点存储顶点存储添加 global.h 文件,定义结构体 tagVertex,用于保存游戏地图中一个点的行号、列号、值信息。typedef struct tagVertexint row;/行int col;/列int info;/信息类Vertex;2)2)游戏地图存储结构游戏地
5、图存储结构使用二位数组来保存连连看游戏地图,在给没一种图片一个编号,并将这些编号保存在二位数组中。用户在屏幕上选择两张图片,对应为数组中的两组坐标。分别实现三个消子判断算法:一条直线连通、两条直线连通、三条直线连通,并使用者三个算法进项消子判断。若符合消子规则,就在屏幕上消除一对图片,并把数组对应元素清空。游戏地图中图片种类和重复次数与游戏的级别汉难度有关。图片种类越多,.重复次数越小,游戏难度越大,反之则越容易。只有两张相同的图片才能消除。为保证游戏中的图片能够完全消掉,每种图片出现的次数一定是偶数,即 2 的倍数。地图的大小与图片元素种类之间的关系地图的行数*地图的列数=图片种类数*每种图
6、片重复的次数。地图数据的存储a.用 int 类型的动态二位数组(int*m_pGameMap)存储地图中元素图片的编号。b.获得某行某列对应的元素编号。2.核心算法设计随机开局算法1)计算游戏中元素个数:行数*列数。2)计算每种花色重复数:行数*列数/花色数。判断(行数*列数%花色数)是否为 0。如果不为 0,则进行异常处理。判断每一种花色的重复数能否被 2 整除,如果不能被二整除,则进行异常处理。3)按从左到右,从上到下,将花色数填入游戏地图。实现代码如下:.int nRepeatNum=nRows*nCols/nPicNums;int count=0;for(int i=0;inPicNu
7、ms;i+)for(int j=0;j col2)int temp=col1;col1=col2;col2=temp;/判断两个顶点间是否有不为空的图片for(int i=col1+1;irow2)int temp=row1;row1=row2;row2=temp;for(int i=row1+1;i=row2;i+)if(i=row2)return true;if(m_Mapicol!=BLANK).break;return false;两条直线消子算法若一条直线无法连通,则判断两条直线的情况。在CGameLogic 类中定义OneCornerLink()函数判断两点是否能两条直线连通。先判
8、断两个顶点的 X 和 Y 方向的直线相交的两个顶点,是否为空。若能构成两条指向连通,那么相交的顶点必须为空才行。若顶点有一个为空,则判断该顶点与两个顶点,横向与纵向一条直线是否连通,若都连通,则表示两条直线消子成功,否则不能相消。实现代码如下:bool CGameLogic:OneCornerLink(int m_Map1015,Vertex v1,Vertex v2).int row1=v1.row;int col1=v1.col;int row2=v2.row;int col2=v2.col;/判断相交的顶点是否为空if(m_Maprow1col2=BLANK)/判断两个同行的顶点是否一条
9、直线连通.if(LineY(m_Map,row1,row2,col2)&LineX(m_Map,row1,col1,col2)if(m_Maprow2col1=BLANK)/判断两个同列顶点是否一条直线连通Vertex V=row1,col2,BLANK;AddVertex(V);return true;if(LineY(m_Map,row1,row2,col1)&LineX(m_Map,row2,col1,col2)Vertex V=row2,col1,BLANK;return false;三条直线消子算法AddVertex(V);return true;若两条直线无法连通,则判断三条直线的
10、情况。在 CGameLogic 类中定义TwoCornerLink()函数判断两点能否三条直线连通。三条直线消子时,假设选择的两张图片的位置为(nRow1,nCol1)和(nRow2,nCol2),则先寻找与 Y 轴平行的连通线段。.如果 Y 轴没有找到可以连通的三条直线,则寻找以 X 轴平行的连通线段。1)搜索关键路径假设玩家选择的两个顶点为 V0(row0,col0),V3(row3,col3),步骤如下:第一步:从地图的第一行开始扫描,当前扫描到 nRow 行。第二步:设置拐点:V1(nRow,col0),V2(nRow,col3)。第三步:判断 V1 和 V2 是否水平方向向上连通,如
11、果连通,则 V1 到 V2 的连线即为关键路径。如果不连通则接着扫描下一行,重复第二四步。2)判断三条直线连通采用枚举法判断三条直线连通,假设玩家选择两个顶点为 V0 和 V3,判断三条直线连通的具体实现的具体步骤如下:找到其中一条关键路径 V1,V2。判断 V1 和 V0 是否连通。判断 V2 和 V3 是否连通。如果同时满足 V1 和 V0 连通,V2 和 V3 连通,则 V0 和 V3 满足三条直线连通。否则,在此关键路径下V0 和 V3 不连通,找到下一条关键路径,重复24,直到判断出 V0 和 V3 是否连通。3)保存连通路径使用栈来保存连通路径中的关键点:起始点 V0,拐点 V1,
12、拐点 V2 和终点 V3。保存连通路径的步骤如下:保存其实点 V0。判断是否存在能够满足三条直线消子的关键路径 V1、V2。如果存在,保存顶点 V1、V2、V3,如果不存在,在删除起始点 V0。实现代码如下:.bool CGameLogic:TwoCornerLink(int m_Map1016,Vertex v1,Vertex v2)int row1=v1.row;.int col1=v1.col;int row2=v2.row;int col2=v2.col;for(int col=0;col16;col+)if(m_Maprow1col=BLANK&m_Maprow2col=BLANK)
13、if(LineY(m_Map,row1,row2,col)if(LineX(m_Map,row1,col1,col)&LineX(m_Map,row2,col2,col)Vertex V1=row1,col,BLANK;Vertex V2=row2,col,BLANK;AddVertex(V1);AddVertex(V2);return true;.for(int row=0;row10;row+)return false;4)胜负判断算法当所有元素被消掉,进行胜负判断,遍历地图中所有元素的值,当所有元素都为空时,表示获胜,游戏结束,否则继续游戏。实现代码如下:.if(m_Maprowcol1
14、=BLANK&m_Maprowcol2=BLANK)if(LineX(m_Map,row,col1,col2)if(LineY(m_Map,row,row1,col1)&LineY(m_Map,row,row2,col2)Vertex V1=row,col1,BLANK;Vertex V2=row,col2,BLANK;AddVertex(V1);AddVertex(V2);return true;.if(m_GameProgress.GetPos()EnableWindow(TRUE);else if(m_GameProgress.GetPos()0&cgc.IsBlank(cgc.m_Ma
15、p)KillTimer(PLAY_TIMER_ID);int result;result=MessageBox(_T(获胜!是否重新开始游戏?),_T(提示);if(result=IDOK)else exit(0);GetDlgItem(IDC_BUTTON_START)-EnableWindow(TRUE);.5)重排当进行游戏的过程中会出现无法再进行消子的情况,点击重排按钮就可以将剩下子进行随机重排以便客户能够正常进行消子操作。首先在 CGameLogic 类中定义一个DisOrderMap()函数来对剩下的元素进行重排,实现代码如下:void CGameLogic:DisOrderMap
16、(int m_Map1016)srand(int)time(NULL);int nVertexNum=nRows*nCols;for(int i=0;inVertexNum;i+)/随机获得两个坐标int nIndex1=rand()%nVertexNum;int nIndex2=rand()%nVertexNum;int nTemp=m_MapnIndex1/nColsnIndex1%nCols;int nRows=10;int nCols=16;m_MapnIndex1/nColsnIndex1%nCols=m_MapnIndex2/nColsnIndex2%nCols;.m_MapnIn
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 武汉理工大学 数据结构 算法 综合 实验 连连
限制150内