


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.目录第 1 章问题描述与分析 .11.1问题描述 .11.2问题分析 .1第 2 章算法设计与流程图 .22.1算法设计 .22.2流程图.32.2.1总体流程图 .32.2.2面板的选择的流程图 .42.2.3难度的选择的流程图 .52.2.4游戏主界面的流程图 .6第 3 章编码与测试 .83.1程序编码 .83.1.1主函数程序代码 .83.1.2面板选择的类声明及主要代码.93.1.3难度选择的类声明及主要代码.113.1.4游戏主界面的类声明及主要代码.123.2测试结果 .153.2.1界面一:面板选择的相关测试.153.2.2界面二:难度选择的相关测试.163.2.3界面三:主
2、界面的相关测试.17第 4 章总结与分析 .24参考文献.25附 录1.必选题题目 .262.流程图.273.程序代码 .274.测试结果 .29;.第1章问题描述与分析1.1问题描述扫地雷是一个广泛游戏, 扫地雷的游戏规则: 扫雷就是要把所有非地雷的格子揭开即胜利;踩到地雷格子就算失败。 当鼠标点击到棋盘范围外时, 视为无效,无响应。游戏主区域由很多个方格组成。基本要求为:1. 用程序设计分析思想对选题进行分析设计2. 用 C 语言对选题进行代码实现测试要求为:1. 进行系统功能性测试,验证基本功能实现情况。2. 进行边界测试及特殊数据用例测试,验证功能模块的逻辑分支流程。1.2问题分析仔细
3、分析课题的要求并粗略分析可以得到大致得到:1. 选择棋盘的大小 (6*6, 9*9, 11*11)2. 选择游戏的难度 ( 简单 10%的雷,一般 20%的雷,困难 30%的雷 )3. 绘制一个扫雷的面板。4. 根据鼠标点击位置确定所点格子位置。5.判断格子是否是地雷,若为地雷则游戏结束。若非地雷显示周围8 个格子所含地雷总数。6.若所有非地雷的格子揭开,则胜利,否则一直循环进行2、 3 步。;.7.第2章算法设计与流程图2.1算法设计扫雷游戏的设计可以从三方面进行考虑:1. 面板的选择 (BoardChoice)2. 难度的选择 (LevelChoice)3. 游戏主界面 (Game)这三方
4、面即为游戏进行的过程,大致可以画出如图2-1 的模块图:扫雷游戏面板的选择难度的选择游戏主界面图 2-1扫雷游戏设计的模块图(1) 面板的选择在该模块中,需要决定面板的大小,即每行每列有多少个格子。在设计时,个人决定使用 6*6 ,9*9 和 11*11 的格子面板。设计中,个人决定设置3 个按钮分别作为3 种面板的选择。在具体实现时,需要从两方面进行考虑,即:位置确定和数据传入。位置确定即为确定点击位置是否有效,确定点击位置与按钮的关系。数据传入即为确定按钮后,将相应的6 或 9 或 11 载入行列统计变量ROWANDCOLUMN中。(2) 难度的选择在该模块中,需要决定面板种雷的个数,面板
5、中应包含多少的地雷。在设计时,个人决定使用10%,20%和 30%的总格子数作为雷的总个数。;.设计中,个人决定设置 3 个按钮分别作为 3 种面板的选择。在具体实现时,需要从两方面进行考虑,即:位置确定和数据传入。位置确定即为确定点击位置是否有效,确定点击位置与按钮的关系。数据传入即为确定按钮后,将相应的雷数载入变量MINENUM中。(3) 游戏主界面游戏主界面的设计可以包含图形的绘制模块,鼠标区域的获取模块,数据的生成模块。各部分包含的内容如下:a) 图形的绘制 基础线条的绘制 单个地雷的绘制 非雷区域的数字输出 游戏结束后所有雷和数字的结果输出b) 鼠标区域的获取 有效性判断 获取鼠标区
6、域将坐标转换为可以使用的相应的数组数据c) 数据的生成 初始化数据 随机位置设置雷 非雷区域计算相应数值2.2流程图总体流程图函数的主流程图如图2-2 。在该流程图中,介绍了游戏的三个界面的切换情况,三者为依次展示的状态,完成前一步骤后方可进入下一界面。;.开始界面一面板选择界面二难度选择界面三游戏主界面结束图 2-2程序的总流程图面板的选择的流程图面板的选择流程图如图2-3 。在该流程图中,介绍了面板大小选择的流程,主要的部分为界面的绘制过程, 鼠标点击区域的判断, 以及相应数值的赋值。 该过程是扫雷游戏的第一个界面。该流程的目的是为了传入相应的参数,使得在游戏主界面时,能够初始化相应数组以
7、及绘制对应的界面。;.开始面板绘制鼠标输入无效区域鼠标输入区域判断有效区域根据区域对变量ROWANDCOLUMN(行列数值)赋值结束图 2-3面板选择的流程图难度的选择的流程图难度的选择流程图如图2-4 。在该流程图中,介绍了游戏难度的选择流程,主要的部分为界面的绘制过程, 鼠标点击区域的判断, 以及相应数值的赋值。 该过程是扫雷游戏的第二个界面。 过程类似于面板选择的流程。该流程的目的是为了传入相应的参数,使得在游戏主界面时,能够初始化相应数组以及绘制对应的界面。;.开始面板绘制鼠标输入无效区域鼠标输入区域判断有效区域根据区域对变量MINENUM(雷数)赋值结束图 2-4难度选择的流程图游戏
8、主界面的流程图游戏主界面的流程图如图2-5 。在该流程图中,主要的操作为绘制相应的主界面面板,即多个格子。获取鼠标点击的位置,而后进行储存数据的判断,雷区与非雷区的判断,游戏是否结束的判断等等操作,相应的过程如下所示。;.开始面板绘制获取鼠标点击位置无效区域有效性已点击判断有效是否已经点击未点击是否为雷区为雷区非雷区非雷位置总输出该位计数器是否不为 0置的数字为 0值为 0输出游戏输出游戏非雷位置计数失败提示胜利提示器-1信息信息任意键盘输入输出实际的面板任意键盘输入结束图 2-5 游戏主界面的流程图;.第3章编码与测试3.1程序编码程序的编码部分可以分为四各模块, 即:主函数的程序部分, 面
9、板大小选择部分,难度选择部分,游戏主界面部分,每个部分内均可以分类编写,互不干扰,以下为代码的主要部分,详细代码由于篇幅的限制,可以在附录中查阅。主函数程序代码#include<graphics.h>#include"BoardChoice.h"#include"LevelChoice.h"#include"Game.h"int ROWANDCOLUMN;/行列数int MINENUM;/雷数int CHESSSIZE;/格子大小int main()BoardChoice b1;/面板一b1.main();LevelCho
10、ice b2;/面板二b2.main();Game b3;/面板三b3.main();return 0;.面板选择的类声明及主要代码1. BoardChoice 类的声明 class BoardChoicepublic:void main();/面板控制private:void DrawBoard();/主界面绘制void ChoiceClick();/鼠标输入;2.主要代码/主界面绘制void BoardChoice:DrawBoard()setcaption("扫雷游戏 ");setbkcolor(WHITE);setcolor(BLACK);setfont(25, 0
11、, "宋体 ", 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");/ 鼠标输入void BoardChoice:ChoiceClic
12、k();.while (true)mouse_msg m;m = getmouse();if (m.is_down() && m.x > 100 && m.x < 300)/ 判断鼠标所处坐标if (m.y > 80 && m.y < 130)/ 6*6ROWANDCOLUMN = 6;CHESSSIZE = 60;break;if (m.y > 180 && m.y < 230)/ 9*9ROWANDCOLUMN = 9;CHESSSIZE = 50;break;if (m.y > 28
13、0 && m.y < 330)/ 9*9ROWANDCOLUMN = 11;CHESSSIZE = 45;break;.难度选择的类声明及主要代码1. LevelChoice 类的声明 class LevelChoicepublic:void main();/面板控制private:void DrawBoard();/主界面绘制void ChoiceClick();/鼠标输入;2.主要代码/面板控制void LevelChoice:main()initgraph(400, 400);DrawBoard();ChoiceClick();closegraph();void L
14、evelChoice:ChoiceClick()while (true)mouse_msg m;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 = ROWANDCOL
15、UMN*ROWANDCOLUMN*0.15; break;if (m.y > 280 && m.y < 330)/ 30%的雷MINENUM = ROWANDCOLUMN*ROWANDCOLUMN*0.2; break;游戏主界面的类声明及主要代码1. Game类的声明 class Gamepublic:void main();/面板控制private:void DrawBoard();/主界面绘制bool ChoiceClick();/鼠标输入void DataInital();/数据初始化;.private:void DrawMine(int x, int y)
16、;/画一个雷void DrawNum(int x, int y, int num);/画一个数字void PrintWhole();/游戏结束打印所有位置bool DrawClickArea(int x, int y);/绘制所处位置返回 true继续/数组计算private:void RandMine();/数组随机布雷int CalculateMineNum(int x, int y);/计算指定位置周边雷个数void SetMineNum();/数组赋值周边雷个数/数据private:int status1111;/每个状态bool openStatus1111;/是否点击int cou
17、nt;/计数器:未按且不是雷;2. 主要代码/ 随机布雷void Game:RandMine()int n = MINENUM;while (n != 0)int i = random(ROWANDCOLUMN);int j = random(ROWANDCOLUMN);if (statusij=0)/若无雷则变雷statusij = -1;n-;./ 计算周边雷个数int Game:CalculateMineNum(int x, int y)int num = 0;if (x - 1 >= 0 && y - 1 >= 0 && statusx -
18、1y - 1 = -1) num+; if (x - 1 >= 0 && statusx - 1y = -1) num+;if (x - 1 >= 0 && y + 1<ROWANDCOLUMN&&statusx - 1y + 1 = -1)num+;if (y - 1 >= 0 && statusxy - 1 = -1) num+;if (y + 1<ROWANDCOLUMN&&statusxy + 1 = -1) num+;if (x + 1<ROWANDCOLUMN&
19、;&y - 1 >= 0 && statusx + 1y - 1 = -1)num+;if (x + 1<ROWANDCOLUMN&&statusx + 1y = -1) num+;if (x + 1<ROWANDCOLUMN&&y + 1<ROWANDCOLUMN&&statusx + 1y + 1 = -1) num+;return num;/ 设置非雷区的周边雷统计值void Game:SetMineNum()for (int i = 0; i < ROWANDCOLUMN; i+)fo
20、r (int j = 0; j < ROWANDCOLUMN; j+)if (statusij != -1);.statusij = CalculateMineNum(i, j);3.2测试结果本次课程设计中要求需要进行系统功能性测试, 并且验证基本功能实现情况。 同时需要进行边界测试及特殊数据用例测试,验证功能模块的逻辑分支流程。针对这些要求,我做了以下的测试。界面一:面板选择的相关测试针对面板一需要进行的测试为鼠标的相关测试。面板一可以划分为以下四个区域:空白的无效区域,按钮一6*6 区域,按钮二9*9 区域,按钮三 11*11 区域。首先测试的是空白的无效区域,运行程序后, 经过多
21、次的鼠标点击空白的无效区域,可以从实际使用中发现,并没有任何效果。而后测试三个按钮区域。 在调试过程中, 可以发现三个区域判断无误,并且从变量区中,可以看到决定面板大小的变量ROWANDCOLUMN传值正确,说明界面一的功能无误。图 3.1 即为面板选择界面的图示。;.图 3-1面板选择界面的运行图界面二:难度选择的相关测试针对面板二同样需要测试鼠标的相关点击。具体区域可以划分以下四个:空白的无效区域,按钮一6*6 区域,按钮二9*9区域,按钮三 11*11 区域。首先测试的是空白的无效区域,运行程序后,经过多次的鼠标点击空白的无效区域,在调试过程中可以发现,鼠标位置的传入正确,数值参数无误。
22、而后测试三个按钮区域。在调试过程中,同样可以发现三个区域判断无误,并且从变量区中,可以看到决定雷数的百分比根据 10%,20%,30%的比例设置正确,决定雷数的变量 MINENUM计算值正确,说明界面二的功能和数值无误。 图 3-2 即为难度选择界面的图示。;.图 3-2难度选择界面的运行图界面三:主界面的相关测试在界面三中具体需要测试的内容有:(1) 面板的绘制是否与预期相符。(2) 雷的布置是否正确以及非雷区域的周边雷数计算是否正确。(3) 鼠标点击的相关测试。(4) 游戏是否结束的判断及游戏结束后的真实界面公示。首先需要测试面板的绘制是否与预期相符,这需要查看数值的传入对于面板的大小的影
23、响,因而通过多次使用界面一和界面二来初步观察界面的格子数字是否与预期相符。图 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 适中难度的初始雷区
24、数组图;.图 3-7 面板 6*6 适中难度的布雷后数组变量变化图鼠标点击的相关测试中需要确认的有:未点击的位置进行点击是否会正确显示雷或数字;无效区域点击是否会产生未知效果。在实际检测中, 在点击空白空格后能够正常显示数字,若点击范围为雷区,则正确显示雷。在点击无效区域时,棋盘没有任何其他效果。在调试中,数值的传入传出与预期均相符。鼠标点击的结果,如图3-8 所示。图 3-8界面为 6*6 简单模式的游戏过程图;.游戏是否结束的判断及面板公示测试过程中,需要从两方面考虑即:鼠标点击至雷区,游戏失败结束,并且打印失败的信息;所有非雷区都被点开,游戏胜利,打印获胜信息。因此从这两方面单独对编写的
25、程序进行测试。图 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 简单模式的游戏结果公
26、示图图 3-11界面为 6*6 简单模式的游戏过程图;.图 3-12界面为 6*6 简单模式的游戏胜利图图 3-13界面为 6*6 简单模式的游戏结果公示图;.第4章总结与分析在本次实验过程中,遇到的最大的问题是扫雷界面的制作以及对雷区和非雷区的布置和计算,即图形的绘制以及实际数据的生成及匹配。在处理图形问题的时候我选择了使用Easy Graphics Engine的图形库,利用里面的函数来绘制图形,具体操作时使用 rectangle 函数画矩形,利用 line 函数绘制相关格子的线条, 并使用鼠标的相关函数, 来获取鼠标点击的坐标点, 从而且确定范围的有效性。在处理数据以及相关问题时, 我的
27、解决方案是, 利用两组二维数组来表示所有的格子。第一组二维数组status用于存放与雷相关的数据,若为雷区,则对应数组的位置为 -1 ,其余位置利用自定义的相关函数计算并存放周围8 个区域所存放的雷的个数。第二个二维数组openStatus 用于存放鼠标是否点击的信息,若点击则置1,未点击则为 0。该数组的作用是,若点击前位置已被点击一次,则不展示数组数据,且点击无效;若点击前未曾点击,则展示数组数据,并将openStatus 的相应位置置1表示为已点击。通过上述的几个构思之后, 我解决了扫雷小程序设计的大部分问题, 在后续的实现中也更好的解决了相关的问题,完成了项目设计的目标。此次实验中,我
28、收获了很多。从程序设计方面来说,首先需要需求分析,再进行总体的规划,而后是局部的设计,最终再到代码实现,逐层递进的方式,能够将问题解决的较为简便。 同时我也学到了模块化的思想, 在具体完成设计的过程中, 首先将各个界面相互独立, 使用对应的类进行封装, 并分开编写图形界面与数据的实现。 模块化的思想能将功能局部分解, 简单实现。最后还懂得了独立测试程序的方式, 在测试程序时,需要考虑全面,不仅需要进行正确的测试,更要考虑到各种极端的情况,减少一些不易察觉的错误。;.参考文献1.EGE图形库主站 Easy Graphics Engine., 2018.2.EG
29、E文档与源代码 . /ege-open-source, 2018.3.EGE(Easy Graphics Engine )15.04./manual, 2018.4.Easy Graphics Engine 基础教程 . /category/lesson, 2018.5. 谭浩强 . C+ 程序设计 ( 第 3 版). 北京:清华大学出版社 , 2015.6. 严蔚敏 , 李冬梅 , 吴伟民 . 数据结构 (C 语言版第 2 版). 北京:人民邮电出版社 , 2015.7. 王红梅 , 胡明 , 王涛 . 数据
30、结构 (C+版). 北京:清华大学出版社 , 2011.8. 严蔚敏 , 陈文博 . 数据结构及应用算法教程 ( 修订版 ), 北京:清华大学出版社 , 2011.9. 严蔚敏 , 陈文博 . 数据结构及应用算法教程 ( 修订版 ), 北京:清华大学出版社 , 2011.10. Decoder. C/C+ 程序设计 . 北京:中国铁道出版社 , 2002.11. 谭浩强 . C+ 面向对象程序设计 ( 第 2 版). 北京:清华大学出版社 , 2014.;.12.附 录1. 必选题题目使用折半插入排序的方法对10 个数进行排序,按照要求画流程图,给出代码及结果截图。;.2. 流程图开始输入数据从第二个数字开始比较将带插入记录暂存到监视哨中设置查找区间初值比较左区间Y最左值待比较值Y最右值 ?中间值 ?N比较右区间N插入点后所有记录后移并将数据插入输出全部比较结果结束图附 -1排序算法流程图3. 程序代码#include<iostream>using namespace std;void BInsertSort(int *arr,int length);.for (int i = 1; i < length; i+)int temp = ar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高中化学新教材同步 必修第一册 第3章 第2节 实验活动2 铁及其化合物的性质
- 【四川卷】四川省德阳市高中2022级(2025届)高三质量监测考试(二)(德阳二诊)(2.21-2.23)英语试卷答案
- 倾废航行数据记录仪战略市场规划报告
- 镍精矿战略市场规划报告
- 信鸽教练合同范本
- 加盟 转让合同范本
- 值守合同范本
- 中国学生发展核心素养心得体会
- 台车出售合同范本
- 水利工程师水力学试题(附参考答案)
- 新种子法律法规培训讲解
- 2025年东营科技职业学院高职单招数学历年(2016-2024)频考点试题含答案解析
- 2025-2030年中国民用通信天线行业发展趋势规划研究报告
- 2025年计算机二级考试题库350题含答案(WPS)
- 浙江省金华市婺城区2024-2025学年九年级上学期期末数学试卷(含答案)
- 《中药房使用课件》
- 万达广场筹备期项目管理规范
- 品管圈PDCA改善案例-降低住院患者跌倒发生率
- 财务会计(对外经济贸易大学)知到智慧树章节测试课后答案2024年秋对外经济贸易大学
- 分布式计算平台设计与实现
- 护理总带教老师讲课
评论
0/150
提交评论