扫雷小程序设计_第1页
扫雷小程序设计_第2页
扫雷小程序设计_第3页
扫雷小程序设计_第4页
扫雷小程序设计_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

扫雷小程序设计扫雷小程序设计/NUM问题描述与分析问题描述扫地雷是一个广泛游戏,扫地雷的游戏规则:扫雷就是要把所有非地雷的格子揭开即胜利;踩到地雷格子就算失败。当鼠标点击到棋盘范围外时,视为无效,无响应。游戏主区域由很多个方格组成。基本要求为:用程序设计分析思想对选题进行分析设计用C语言对选题进行代码实现测试要求为:进行系统功能性测试,验证基本功能实现情况。进行边界测试及特殊数据用例测试,验证功能模块的逻辑分支流程。问题分析仔细分析课题的要求并粗略分析可以得到大致得到:选择棋盘的大小(6*6,9*9,11*11)选择游戏的难度(简单10%的雷,一般20%的雷,困难30%的雷)绘制一个扫雷的面板。根据鼠标点击位置确定所点格子位置。判断格子是否是地雷,若为地雷则游戏结束。若非地雷显示周围8个格子所含地雷总数。若所有非地雷的格子揭开,则胜利,否则一直循环进行2、3步。

算法设计与流程图算法设计扫雷游戏的设计可以从三方面进行考虑:面板的选择(BoardChoice)难度的选择(LevelChoice)游戏主界面(Game)这三方面即为游戏进行的过程,大致可以画出如图2-1的模块图:图2-1扫雷游戏设计的模块图面板的选择在该模块中,需要决定面板的大小,即每行每列有多少个格子。在设计时,个人决定使用6*6,9*9和11*11的格子面板。设计中,个人决定设置3个按钮分别作为3种面板的选择。在具体实现时,需要从两方面进行考虑,即:位置确定和数据传入。位置确定即为确定点击位置是否有效,确定点击位置与按钮的关系。数据传入即为确定按钮后,将相应的6或9或11载入行列统计变量ROWANDCOLUMN中。难度的选择在该模块中,需要决定面板种雷的个数,面板中应包含多少的地雷。在设计时,个人决定使用10%,20%和30%的总格子数作为雷的总个数。设计中,个人决定设置3个按钮分别作为3种面板的选择。在具体实现时,需要从两方面进行考虑,即:位置确定和数据传入。位置确定即为确定点击位置是否有效,确定点击位置与按钮的关系。数据传入即为确定按钮后,将相应的雷数载入变量MINENUM中。游戏主界面游戏主界面的设计可以包含图形的绘制模块,鼠标区域的获取模块,数据的生成模块。各部分包含的内容如下:图形的绘制基础线条的绘制单个地雷的绘制非雷区域的数字输出游戏结束后所有雷和数字的结果输出鼠标区域的获取有效性判断获取鼠标区域将坐标转换为可以使用的相应的数组数据数据的生成初始化数据随机位置设置雷非雷区域计算相应数值流程图总体流程图函数的主流程图如图2-2。在该流程图中,介绍了游戏的三个界面的切换情况,三者为依次展示的状态,完成前一步骤后方可进入下一界面。图2-2程序的总流程图面板的选择的流程图面板的选择流程图如图2-3。在该流程图中,介绍了面板大小选择的流程,主要的部分为界面的绘制过程,鼠标点击区域的判断,以及相应数值的赋值。该过程是扫雷游戏的第一个界面。该流程的目的是为了传入相应的参数,使得在游戏主界面时,能够初始化相应数组以及绘制对应的界面。图2-3面板选择的流程图难度的选择的流程图难度的选择流程图如图2-4。在该流程图中,介绍了游戏难度的选择流程,主要的部分为界面的绘制过程,鼠标点击区域的判断,以及相应数值的赋值。该过程是扫雷游戏的第二个界面。过程类似于面板选择的流程。该流程的目的是为了传入相应的参数,使得在游戏主界面时,能够初始化相应数组以及绘制对应的界面。图2-4难度选择的流程图游戏主界面的流程图游戏主界面的流程图如图2-5。在该流程图中,主要的操作为绘制相应的主界面面板,即多个格子。获取鼠标点击的位置,而后进行储存数据的判断,雷区与非雷区的判断,游戏是否结束的判断等等操作,相应的过程如下所示。图2-5游戏主界面的流程图

编码与测试程序编码程序的编码部分可以分为四各模块,即:主函数的程序部分,面板大小选择部分,难度选择部分,游戏主界面部分,每个部分内均可以分类编写,互不干扰,以下为代码的主要部分,详细代码由于篇幅的限制,可以在附录中查阅。主函数程序代码#include<graphics.h>#include"BoardChoice.h"#include"LevelChoice.h"#include"Game.h"intROWANDCOLUMN;//行列数intMINENUM;//雷数intCHESSSIZE;//格子大小intmain(){ BoardChoiceb1;//面板一 b1.main(); LevelChoiceb2;//面板二 b2.main(); Gameb3;//面板三 b3.main(); return0;}面板选择的类声明及主要代码BoardChoice类的声明classBoardChoice{public: voidmain();//面板控制private: voidDrawBoard();//主界面绘制 voidChoiceClick();//鼠标输入};主要代码//主界面绘制voidBoardChoice::DrawBoard(){ setcaption("扫雷游戏"); setbkcolor(WHITE); setcolor(BLACK); setfont(25,0,"宋体",0); outtextxy(150,30,"面板选择"); rectangle(100,80,300,130); rectangle(100,180,300,230); rectangle(100,280,300,330); outtextxy(169,93,"6*6"); outtextxy(169,193,"9*9"); outtextxy(156,293,"11*11");}//鼠标输入voidBoardChoice::ChoiceClick(){ while(true) { mouse_msgm; m=getmouse(); if(m.is_down()&&m.x>100&&m.x<300) { //判断鼠标所处坐标 if(m.y>80&&m.y<130)//6*6 { ROWANDCOLUMN=6; CHESSSIZE=60; break; } if(m.y>180&&m.y<230)//9*9 { ROWANDCOLUMN=9; CHESSSIZE=50; break; } if(m.y>280&&m.y<330)//9*9 { ROWANDCOLUMN=11; CHESSSIZE=45; break; } } }}难度选择的类声明及主要代码LevelChoice类的声明classLevelChoice{public: voidmain();//面板控制private: voidDrawBoard();//主界面绘制 voidChoiceClick();//鼠标输入};主要代码//面板控制voidLevelChoice::main(){ initgraph(400,400); DrawBoard(); ChoiceClick(); closegraph();}voidLevelChoice::ChoiceClick(){ while(true) { mouse_msgm; m=getmouse(); if(m.is_down()&&m.x>100&&m.x<300) { //判断鼠标所处坐标 if(m.y>80&&m.y<130)//10%的雷 { MINENUM=ROWANDCOLUMN*ROWANDCOLUMN*0.1; break; } if(m.y>180&&m.y<230)//20%的雷 { MINENUM=ROWANDCOLUMN*ROWANDCOLUMN*0.15; break; } if(m.y>280&&m.y<330)//30%的雷 { MINENUM=ROWANDCOLUMN*ROWANDCOLUMN*0.2; break; } } }}游戏主界面的类声明及主要代码Game类的声明classGame{public: voidmain();//面板控制private: voidDrawBoard();//主界面绘制 boolChoiceClick();//鼠标输入 voidDataInital();//数据初始化private: voidDrawMine(intx,inty);// 画一个雷 voidDrawNum(intx,inty,intnum);// 画一个数字 voidPrintWhole();//游戏结束打印所有位置 boolDrawClickArea(intx,inty);//绘制所处位置返回true继续//数组计算private: voidRandMine();//数组随机布雷 intCalculateMineNum(intx,inty);//计算指定位置周边雷个数 voidSetMineNum();//数组赋值周边雷个数//数据private: intstatus[11][11];//每个状态 boolopenStatus[11][11];//是否点击 intcount;//计数器:未按且不是雷};主要代码//随机布雷voidGame::RandMine(){ intn=MINENUM; while(n!=0) { inti=random(ROWANDCOLUMN); intj=random(ROWANDCOLUMN); if(status[i][j]==0)//若无雷则变雷 { status[i][j]=-1; n--; } }}//计算周边雷个数intGame::CalculateMineNum(intx,inty){ intnum=0; if(x-1>=0&&y-1>=0&&status[x-1][y-1]==-1)num++; if(x-1>=0&&status[x-1][y]==-1)num++; if(x-1>=0&&y+1<ROWANDCOLUMN&&status[x-1][y+1]==-1)num++; if(y-1>=0&&status[x][y-1]==-1)num++; if(y+1<ROWANDCOLUMN&&status[x][y+1]==-1)num++; if(x+1<ROWANDCOLUMN&&y-1>=0&&status[x+1][y-1]==-1)num++; if(x+1<ROWANDCOLUMN&&status[x+1][y]==-1)num++; if(x+1<ROWANDCOLUMN&&y+1<ROWANDCOLUMN&&status[x+1][y+1]==-1)num++; returnnum;}//设置非雷区的周边雷统计值voidGame::SetMineNum(){ for(inti=0;i<ROWANDCOLUMN;i++) { for(intj=0;j<ROWANDCOLUMN;j++) { if(status[i][j]!=-1) { status[i][j]=CalculateMineNum(i,j); } } }}测试结果本次课程设计中要求需要进行系统功能性测试,并且验证基本功能实现情况。同时需要进行边界测试及特殊数据用例测试,验证功能模块的逻辑分支流程。针对这些要求,我做了以下的测试。界面一:面板选择的相关测试针对面板一需要进行的测试为鼠标的相关测试。面板一可以划分为以下四个区域:空白的无效区域,按钮一6*6区域,按钮二9*9区域,按钮三11*11区域。首先测试的是空白的无效区域,运行程序后,经过多次的鼠标点击空白的无效区域,可以从实际使用中发现,并没有任何效果。而后测试三个按钮区域。在调试过程中,可以发现三个区域判断无误,并且从变量区中,可以看到决定面板大小的变量ROWANDCOLUMN传值正确,说明界面一的功能无误。图3.1即为面板选择界面的图示。图3-1面板选择界面的运行图界面二:难度选择的相关测试针对面板二同样需要测试鼠标的相关点击。具体区域可以划分以下四个:空白的无效区域,按钮一6*6区域,按钮二9*9区域,按钮三11*11区域。首先测试的是空白的无效区域,运行程序后,经过多次的鼠标点击空白的无效区域,在调试过程中可以发现,鼠标位置的传入正确,数值参数无误。而后测试三个按钮区域。在调试过程中,同样可以发现三个区域判断无误,并且从变量区中,可以看到决定雷数的百分比根据10%,20%,30%的比例设置正确,决定雷数的变量MINENUM计算值正确,说明界面二的功能和数值无误。图3-2即为难度选择界面的图示。图3-2难度选择界面的运行图界面三:主界面的相关测试在界面三中具体需要测试的内容有:面板的绘制是否与预期相符。雷的布置是否正确以及非雷区域的周边雷数计算是否正确。鼠标点击的相关测试。游戏是否结束的判断及游戏结束后的真实界面公示。首先需要测试面板的绘制是否与预期相符,这需要查看数值的传入对于面板的大小的影响,因而通过多次使用界面一和界面二来初步观察界面的格子数字是否与预期相符。图3-3至图3-5为不同选择下面板的格子数与格子大小的变化。图3-3界面为6*6的运行初始主界面图图3-4界面为9*9的运行初始主界面图图3-5界面为11*11的运行初始主界面图其次雷的布置以及非雷区域的周边雷数计算是否正确。以下为6*6以及适中难度下的测试。在调试过程中,图3-6为观察变量区域status的初始状态,初始状态时各变量均为0,与预期相符。图3-7为设置雷以及非雷区域的计算结果,各变量经过检验,均与预期吻合,测试结果正确。图3-6面板6*6适中难度的初始雷区数组图图3-7面板6*6适中难度的布雷后数组变量变化图鼠标点击的相关测试中需要确认的有:未点击的位置进行点击是否会正确显示雷或数字;无效区域点击是否会产生未知效果。在实际检测中,在点击空白空格后能够正常显示数字,若点击范围为雷区,则正确显示雷。在点击无效区域时,棋盘没有任何其他效果。在调试中,数值的传入传出与预期均相符。鼠标点击的结果,如图3-8所示。图3-8界面为6*6简单模式的游戏过程图游戏是否结束的判断及面板公示测试过程中,需要从两方面考虑即:鼠标点击至雷区,游戏失败结束,并且打印失败的信息;所有非雷区都被点开,游戏胜利,打印获胜信息。因此从这两方面单独对编写的程序进行测试。图3-9为6*6面板大小简单难度下的游戏失败时的测试结果,该结果是用于测试点击至雷区后是否游戏真正结束。在失败后,正确打印了失败的提示字符,并且此时鼠标点击任意位置均无效。图3-10为游戏失败后的棋盘公示画面。图3.11和图3-12为6*6面板大小简单难度下的游戏胜利的测试结果。图3-11是在游戏过程中显示各数字区域的画面,图3.12为游戏胜利之后提示的游戏胜利的画面。图3-13为游戏胜利后的棋盘公示画面。以上测试说明游戏结束的判断及面板公示正确。图3-9界面为6*6简单模式的游戏失败图图3-10界面为6*6简单模式的游戏结果公示图图3-11界面为6*6简单模式的游戏过程图图3-12界面为6*6简单模式的游戏胜利图图3-13界面为6*6简单模式的游戏结果公示图

总结与分析在本次实验过程中,遇到的最大的问题是扫雷界面的制作以及对雷区和非雷区的布置和计算,即图形的绘制以及实际数据的生成及匹配。在处理图形问题的时候我选择了使用EasyGraphicsEngine的图形库,利用里面的函数来绘制图形,具体操作时使用rectangle函数画矩形,利用line函数绘制相关格子的线条,并使用鼠标的相关函数,来获取鼠标点击的坐标点,从而且确定范围的有效性。在处理数据以及相关问题时,我的解决方案是,利用两组二维数组来表示所有的格子。第一组二维数组status用于存放与雷相关的数据,若为雷区,则对应数组的位置为-1,其余位置利用自定义的相关函数计算并存放周围8个区域所存放的雷的个数。第二个二维数组openStatus用于存放鼠标是否点击的信息,若点击则置1,未点击则为0。该数组的作用是,若点击前位置已被点击一次,则不展示数组数据,且点击无效;若点击前未曾点击,则展示数组数据,并将openStatus的相应位置置1表示为已点击。通过上述的几个构思之后,我解决了扫雷小程序设计的大部分问题,在后续的实现中也更好的解决了相关的问题,完成了项目设计的目标。此次实验中,我收获了很多。从程序设计方面来说,首先需要需求分析,再进行总体的规划,而后是局部的设计,最终再到代码实现,逐层递进的方式,能够将问题解决的较为简便。同时我也学到了模块化的思想,在具体完成设计的过程中,首先将各个界面相互独立,使用对应的类进行封装,并分开编写图形界面与数据的实现。模块化的思想能将功能局部分解,简单实现。最后还懂得了独立测试程序的方式,在测试程序时,需要考虑全面,不仅需要进行正确的测试,更要考虑到各种极端的情况,减少一些不易察觉的错误。

参考文献EGE图形库主站EasyGraphicsEngine.h,2018.EGE文档与源代码./ege-open-source,2018.EGE(EasyGraphicsEngine)15.04./manual,2018.EasyGraphicsEngine基础教程./category/lesson,2018.谭浩强.C++程序设计(第3版).北京:清华大学出版社,2015.严蔚敏,李冬梅,吴伟民.数据结构(C语言版第2版).北京:人民邮电出版社,2015.王红梅,胡明,王涛.数据结构(C++版).北京:清华大学出版社,2011.严蔚敏,陈文博.数据结构及应用算法教程(修订版),北京:清华大学出版社,2011.严蔚敏,陈文博.数据结构及应用算法教程(修订版),北京:清华大学出版社,2011.Decoder.C/C++程序设计.北京:中国铁道出版社,2002.谭浩强.C++面向对象程序设计(第2版).北京:清华大学出版社,2014.

附录必选题题目使用折半插入排序的方法对10个数进行排序,按照要求画流程图,给出代码及结果截图。流程图图附-1排序算法流程图程序代码#include<iostream>usingnamespacestd;voidBInsertSort(int*arr,intlength){ for(inti=1;i<length;i++) { inttemp=arr[i];//需要插入的值存放入temp intlow=0; inthigh=i-1; while(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论