《扫雷课程设计报告.docx》由会员分享,可在线阅读,更多相关《扫雷课程设计报告.docx(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、扫雷课程设计报告 Har bi n I nst i t ut e of Technol ogy 课程设计报告 课程名称: 数据结构与算法课程设计 设计题目: 扫雷 院 系 计算机科学与技术学院 班 级 : 10503104 设计者: 陆亮 学 号: 1050310404 指导教师: 晓燕 设计时间: 2022-8-27 至U 2022-9-8 工业大学 工业大学课程设计任务书 姓名:陆亮院(系):计算机科学与技术学院 专业:计算机科学与技术班号:1050310404 任务起至日期:2022年8月27日至2022年9月9日 课程设计题目:扫雷游戏 课程设计要求: 能够给出游戏结果(输、赢、剩余的
2、雷数、用掉的时间按妙计)。 游戏界面最好图形化,否则一定要清楚的字符界面。 设计任务总述: 本题目做一个N x M的扫雷游戏,每个方格包含两种状态:关闭(closed )和打开(opened), 初始化时每个方格都是关闭的,一个打开的方格也会包含两种状态:一个数字(clue)和一个雷(bomk)。你可以打开(open)一个方格,如果你打开的是一个bomb,那么就失败;否则就会打开一个数字,该数字是位于0,8的一个整数,该数字表示其所有邻居方格(neighboring squares )所包含的雷数,应用该信息可以帮助你扫雷。 工作计划及安排: 8月27日-8月30日:学习VC+6.0的MFC编
3、程,以及扫雷所需设计的算法; 8月31日-9月5日:实现扫雷的基本框架; 9月6日-9月9日:优化功能; 系统总任务描述: 本题目做一个Nx M的扫雷游戏,每个方格包含两种状态:关闭(closed )和打开(ope ned), 初始化时每个方格都是关闭的,一个打开的方格也会包含两种状态:一个数字(clue )和 一个雷(bomb)。你可以打开(open)一个方格,如果你打开的是一个bomb,那么就失败; 否则就会打开一个数字,该数字是位于0,8的一个整数,该数字表示其所有邻居方格 (n eighbori ng squares )所包含的雷数,应用该信息可以帮助你扫雷。 已完成工作描述: 1.
4、所需的算法都已经设计完毕,包括展拓空白区域,判胜,获得周围雷数,以及随机布雷 2. 翻阅了大量有关的书籍,初步学习了VC+6 一、题目分析 本题目做一个N x M的扫雷游戏,每个方格包含两种状态:关闭(closed )和打开(opened),初始化时每个方格都是关闭的,一个打开的方格也会包含两种状态:一个数字(clue )和一个雷(bomb。你可以打开(open)个方格,如果你打开的是一个bomb 那么就失败;否则就会打开一个数字,该数字是位于0,8的一个整数,该数字表示其所有 邻居方格(neighboring squares )所包 含的雷数,应用该信息可以帮助你扫雷。 图4-20扫雷游戏的
5、图例 具体实现要求的细节: a. 能够打开一个方格,一个已打开的方格不能再关闭。 b. 能够标记一个方格,标记方格的含义是对该方格有雷的预测(并不表示真的一定有 雷),当一个方格标记后该方格不能被打开,只能执行取消标记的操作,只 能在取消后才能打开一个方格。 C.合理分配各个操作的按键,以及各方格各种状态如何合理显示。 (2) 基本要求 a. 能够给出游戏结果(输、赢、剩余的雷数、用掉的时间按妙计) 。 b. 游戏界面最好图形化。 (3) 所需解决的冋题 a. 运行的结果必须采用可视化的界面,因此开发工具我选择了VC+6.0,用MFC 工程解决此题目; b. 题目要求M*N的雷区,因此学要与用
6、户对话,以获得区域大小和雷数目,可以使用MFC 中的对话框来实现; c. 雷的位置应该是随机的,因此必须采用生成随机数的办法布雷,同时还应该注意避免用户第一次就点击到了雷,这是没有意义的; d. 方格会处于各种不同的状态,设计其结构并定义相应的状态宏是必要的; e. 因游戏的状态不同,消息机制是会对鼠标信息进行不同处理,因此要定义游戏状态宏,并时时记录游戏的状态; f. 点击到了某区域发现其周围没有雷,那么显而易见应该点开周围的区域,如果这样的操作由用户一一完成,将增加用户很多的操作负担,大大减少了游戏的趣味性,因此周围的空白区域应该自动打开,这就需要一个函数来递归的完成此任务; g. 为了获
7、得所点击的方格周围雷数,要设计一个函数,其中要注意处理边界方格; h. 当鼠标左或右键点击后,都应该判断是否胜利,胜利条件应当选择准确; i. 左右键点击后,响应其消息的函数是相当复杂的,应当根据点击的位置,游戏的状态以及点击的方格状态,来进行不同的处理; j. 确定点击的是哪一个方格,可以用点击的位置坐标来计算; k. 设计一个计时器,显示游戏进行的时间; l. 设计一个计数器,显示剩余的雷数,考虑标记的雷数比实际的雷数多时的情况 二、总体设计 1.要实现点击后出现不同的图像,如空白或标记为雷或标记为有2两颗雷等,就需要利用MFC勺重绘机制。重绘的依据是方块的属性,重绘的时间是在以下三个动作
8、结束之后:左键点击,右键点击,以及重置游戏。下面就分别介绍这三个动作要进行什么样的处理,为重绘做好准备。 (1) .左键点击 左键点击后 判断位置点击位置 通过坐标获取方块位置 下面重点分析点击在雷区后的处理m_poldmi ne = GetMi ne(poi nt.x, poin t.y) / /如果游戏处于等待状态 if(GameState =GS_WAIT) /启动计时器; SetTimer(); /布雷; LayMi ne(); /改变游戏状态为运行; GameState = GS_RUN; _ /如果游戏处于进行状态 if(GameState = GS_RUN) /方块状态为正常时进
9、行处理,对于已经点开的区域不再处理If(方块属性为正常) If( IsMi ne()所点击的方格是雷则要进行失败处理 Dead(); else/不是雷的处理 around = GetAro undn um();获取其周围雷的数目if(aro und = 0)/ 如果周围没雷 ExpandMines();展拓空白区域 else/如果周围有雷 DrawDow nNu m();改变此方块属性 if(victory() / 判断是否胜利 胜利处理; In validate。;/ 发出重绘消息; (2) .右键点击 void CLulia ngView:O nRButto nDow n(UINT nFl
10、ags, CPoi nt poi nt) /游戏处于进行状态是响应右键的条件,右键只能在雷区起作用 if(GameState = GS_RUN & poi nt.y 80) _ NewMi ne = GetMi ne(poi nt.x, poi nt.y);/ 获得点击方块 switch( NewMine-uState)根据方块的属性做不同标记 /正常状态的标记为雷,剩余雷数减1 case STATE_NORMAL: NewMi ne-uState = STATE_FLAG; m_LeftMi neNum-; break; /被标记为雷的改为未知状态,剩余雷数加1 case STATE_FLA
11、G: NewMi ne-uState = STATE_DICEY; m_LeftMi neNum+; break; /被标记为未知状态的改为正常状态 case STATE_DICEY: NewMi ne-uState = STATE_NORMAL; break; default: break;/ 其他状态的方格,右键均不处理 if(Victory()/ 判断是否胜利 胜利处理 In validate();/ 发出重绘消息; (3) .重新设置游戏,即改变雷数和雷区大小 SetMineArea sizedlg; /建立对话框对象 sizedlg.DoModal(); / 弹出对话框 XMineNum = sizedlg.m_x_mine_num;获得雷区宽YMineNum = sizedlg.m_y_mine_num;获得雷区高Min eNum = sizedlg.m_Mi neNum / 获得雷的个数; SizeWindow(); / 改变窗口大小