C++扫雷课程设计报告

上传人:ren****ao 文档编号:127358914 上传时间:2022-07-30 格式:DOC 页数:16 大小:344.01KB
收藏 版权申诉 举报 下载
C++扫雷课程设计报告_第1页
第1页 / 共16页
C++扫雷课程设计报告_第2页
第2页 / 共16页
C++扫雷课程设计报告_第3页
第3页 / 共16页
资源描述:

《C++扫雷课程设计报告》由会员分享,可在线阅读,更多相关《C++扫雷课程设计报告(16页珍藏版)》请在装配图网上搜索。

1、青岛理工大学C+面向对象课程设计报告院(系): 专业: 学生姓名: 学号: 班级: 题目: 起迄日期: 设计地点: 指 导 教 师: 完成日期: 2013 年7月 5 日目录一、题目概述1二、设计内容2三、调试分析5四、设计总结12五、参考文献13六、附录13一、题目概述(一):选课题目: 题目:游戏 扫雷 设计内容:扫雷程序将要实现类似windows系统自带的扫雷程序功能即可以显示附近雷区雷的个数,同时在游戏成功和失败的时候能跳出新的对话框,并配有相对应的表情,还可以记录玩家玩耍的时间和剩余雷区雷的个数等基本功能。(二):选做次项目的意义: 意义:随着科学技术突飞猛进,知识经济初见端倪,特别

2、是信息技术和网络技术的迅速发展和广泛应用,对社会的政治、经济、军事、科技和文化等领域产生越来越深刻的影响,也正在改变这人们的工作、生活、学习和文化交流方式。尤其在游戏方面更是影响甚大,各种网络游戏随处可见。尤其可以借助C+实现很多简单游戏的制作,其中扫雷就是一款适合单机玩耍的游戏。扫雷最原始的版本可以追溯到1973年一款名为“方块”的游戏。 不久之后,“方块”被改写成了游戏“Rlogic”。在“Rlogic”里,玩家的任务是作为美国海军陆战队队员,为指挥中心探出一条没有地雷的安全路线,如果路全被地雷堵死就算输。两年后,汤姆安德森在“Rlogic”的基础上又编写出了游戏“地雷”,由此奠定了现代扫

3、雷游戏的雏形。 1981年, 微软公司的 罗伯特杜尔 和 卡特约翰逊 两位工程师在Windows 3.1系统上加载了该游戏,扫雷游戏才正式在全世界推广开来。 这款游戏的玩法是在一个9*9(初级),16*16(中级),16*30(高级),或自定义大小的方块矩阵中随机布置一定量的地雷(初级为10个,中级为40个,高级为99个)。由玩家逐个翻开方块,以找出所有地雷为最终游戏目标。如果玩家翻开的方块有地雷,则游戏结束。本课程设计实现类似于Windows操作系统自带的扫雷游戏。在课程设计中,系统开发平台为Windows XP/windows 7,程序设计语言采用Visual C+,程序运行平台为Wind

4、ows XP/windows 7。在程序设计中,把整个雷区看成一个二维数组,把雷方块定义为具有所在雷区二维数组的行和列、当前状态、方块属性、历史状态的结构体。整个游戏程序包括了布雷、扫雷过程和结果三个阶段,在处理鼠标响应事件中伴随着GDI绘图。程序通过调试运行,实现了设计目标,能够同时满足扫雷游戏初学者和高手的需要。(三):程序所实现的功能: 本系统是使用Visual C+在C+的基础上创建的,并用MFC实现程序可视化,程序功能不是太多,但基本功能都可以实现,主要功能包括:(1)选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。(2)用户要揭开某个方块

5、,可单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。(3)如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。(4)扫雷胜利后,显示游戏胜利,失败后显示再来一局。(5)用户可以改变游戏界面的颜色外观。(6)游戏中用户可以通过菜单重新开始新游戏。(四):本程序所使用的开发运行环境主要包括:开发工具: VC+6.0运行环境: Windows win7、windows xp(五):本程序设计要达到的

6、最终目的:将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。通过课程设计,学生在下述各方面的能力应该得到锻炼:(1)进一步巩固、加深学生所学专业课程C+语言教程的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。(3)利用所学知识,开发小型应用系统,掌握运用C+语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。(4)对于给定的设计题目,如何进行分析,理清思路,并给出

7、相应的数学模型。(5)掌握面向对象程序设计的方法。(6)熟练掌握C+语言的基本语法,灵活运用各种数据类型。(7)进一步掌握在集成环境下如何调试程序和修改程序。二、设计内容(一):系统总体流程图: 开始依照使用者初始设定等待按键左键键右键第一次按下方块显示方块1 布置地雷2 启动计时器按下方块是否为地雷显示分数是否再玩玩结束延按下方块周围展开非地雷方块计时器时间到否否是是否否是是否图1.系统整体流程图(二):系统结构图: 扫雷窗体类模块背景音乐英雄榜级别选择鼠标开始窗体加载鼠标函数递归函数重开函数画图函数音乐函数图2. 系统结构图(三):布雷函数流程图开始生成随机的雷方块的坐标(x,y)判断(x

8、,y)区域是否已经布下雷在(x,y)区域布雷,修改状态数据据。判断是否布下所有雷结束否是是否图3. 布雷函数流程图三、调试分析(一):游戏设计过程中所需窗体设计 图4 游戏选择界面设计 图5 帮助界面设计图6 自定义雷区界面设计图7 英雄榜界面设计(二):游戏过程中所出现的重要界面:图8.低级水平时游戏界面图9.中级水平时游戏界面图10.高级水平时游戏界面 图11.破纪录时界面图12.游戏失败时界面(二):关键代码及功能显示: (1)游戏自定义雷区:void CDlgCustom:OnOK() /设置长和宽UpdateData();if (m_uWidth 30) m_uWidth = 30;

9、if (m_uHeight 24) m_uHeight = 24;if (m_uNumber m_uWidth * m_uHeight) m_uNumber = m_uWidth * m_uHeight - 1;CMineWnd *pMine = (CMineWnd*)AfxGetMainWnd();pMine-SetCustom(m_uWidth, m_uHeight, m_uNumber);CDialog:OnOK();void CDlgCustom:InitData(UINT xNum, UINT yNum, UINT mNum)m_uWidth = xNum;m_uHeight = y

10、Num;m_uNumber = mNum;(2)点中雷区时:BOOL CMineWnd:IsInMineArea(UINT row, UINT col)return (row = 0 & row = 0 & col m_uXNum);/ 失败处理/void CMineWnd:Dead(UINT row, UINT col)/按钮所在的区域CRect rcBtn(m_uBtnRect1, 15, m_uBtnRect2, 39);/雷区所在的区域CRect rcMineArea(MINE_AREA_LEFT, MINE_AREA_TOP, MINE_AREA_LEFT + m_uXNum * M

11、INE_WIDTH, MINE_AREA_TOP + m_uYNum * MINE_HEIGHT);UINT i, j;if (m_pMinesrowcol.uAttrib = ATTRIB_MINE) /失败点中雷for (i = 0; i m_uYNum; i+)for (j = 0; j m_uXNum; j+)m_pMinesrowcol.uState = STATE_BLAST;m_pMinesrowcol.uOldState = STATE_BLAST;if (m_pMinesij.uAttrib = ATTRIB_MINE& m_pMinesij.uState != STATE_

12、FLAG) m_pMinesij.uState = STATE_MINE;m_pMinesij.uOldState = STATE_MINE;else /失败错误雷for (i = 0; i m_uYNum; i+)for (j = 0; j m_uXNum; j+) m_pMinesrowcol.uState = STATE_ERROR;m_pMinesrowcol.uOldState = STATE_ERROR;if (m_pMinesij.uAttrib = ATTRIB_MINE& m_pMinesij.uState != STATE_FLAG)m_pMinesij.uState =

13、STATE_MINE;m_pMinesij.uOldState = STATE_MINE;/失败处理InvalidateRect(rcMineArea);m_uBtnState = BUTTON_DEAD;InvalidateRect(rcBtn);m_uGameState = GS_DEAD;if (m_uTimer != 0) /将定时器去激活KillTimer(ID_TIMER_EVENT);m_uTimer = 0;if (m_bSoundful) /失败声音播放sndPlaySound(LPCTSTR)LockResource(m_pSndDead), SND_MEMORY | SN

14、D_ASYNC | SND_NODEFAULT);(3)游戏胜利时声音代码:BOOL CMineWnd:Victory()UINT i, j;CRect rcBtn(m_uBtnRect1, 15, m_uBtnRect2, 39);/ 检测是否胜利for (i = 0; i m_uYNum; i+)for (j = 0; j m_uXNum; j+) if (m_pMinesij.uState = STATE_NORMAL) return FALSE;if (m_pMinesij.uState = STATE_DICEY) return FALSE;/胜利则作胜利处理m_uBtnState

15、= BUTTON_VICTORY;m_uGameState = GS_VICTORY;Invalidate();if (m_uTimer != 0) /将定时器去激活KillTimer(ID_TIMER_EVENT);m_uTimer = 0;/胜利声音if (m_bSoundful)sndPlaySound(LPCTSTR)LockResource(m_pSndVictory), SND_MEMORY | SND_ASYNC | SND_NODEFAULT);(4)绘制笑脸和数字图形代码:void CMineWnd:DrawButton(CPaintDC &dc)CDC cdc;cdc.Cr

16、eateCompatibleDC(&dc);cdc.SelectObject(m_bmpButton);dc.StretchBlt(m_uBtnRect0, 16, 24, 24, &cdc, 0, 24 * m_uBtnState, 24, 24, SRCCOPY);dc.Draw3dRect(m_uBtnRect1, 15, 26, 26, m_clrDark, m_clrDark); void CMineWnd:DrawNumber(CPaintDC &dc)CDC dcMemory;dcMemory.CreateCompatibleDC(&dc);dcMemory.SelectObje

17、ct(m_bmpNumber);dc.Draw3dRect(16, 15, 41, 25, m_clrDark, COLOR_WHITE);dc.Draw3dRect(m_uNumRect0, 15, 41, 25, m_clrDark, COLOR_WHITE);int num;/ draw remaining mine numbersnum = (m_nLeaveNum0) ? 11 : m_nLeaveNum/100;dc.StretchBlt(17, 16, 13, 23, &dcMemory, 0, 276-23*(num+1), 13, 23, SRCCOPY);num = (m_

18、nLeaveNum 0) ? -(m_nLeaveNum-num*100)/10 : (m_nLeaveNum-num*100)/10;dc.StretchBlt(30, 16, 13, 23, &dcMemory, 0, 276-23*(num+1), 13, 23, SRCCOPY);num = (m_nLeaveNum0) ? -m_nLeaveNum%10 : m_nLeaveNum%10;dc.StretchBlt(43, 16, 13, 23, &dcMemory, 0, 276-23*(num+1), 13, 23, SRCCOPY);/ draw take secondsnum

19、 = m_uSpendTime / 100;dc.StretchBlt(m_uNumRect0, 16, 13, 23, &dcMemory, 0, 276-23*(num+1), 13, 23, SRCCOPY);num = (m_uSpendTime-num*100)/10;dc.StretchBlt(m_uNumRect0 + 13, 16, 13, 23, &dcMemory, 0, 276-23*(num+1), 13, 23, SRCCOPY);num = m_uSpendTime%10;dc.StretchBlt(m_uNumRect0+26, 16, 13, 23, &dcMe

20、mory, 0, 276-23*(num+1), 13, 23, SRCCOPY);(5):获取某个小方块区域相邻8个区域的雷个数: UINT CMineWnd:GetAroundNum(UINT row, UINT col)UINT i, j;UINT around = 0;UINT minRow = (row = 0) ? 0 : row - 1;UINT maxRow = row + 2;UINT minCol = (col = 0) ? 0 : col - 1;UINT maxCol = col + 2;for (i = minRow; i maxRow; i+) for (j = m

21、inCol; j maxCol; j+)if (!IsInMineArea(i, j) continue;if (m_pMinesij.uAttrib = ATTRIB_MINE) around+;return around; 四、设计总结短学期的课程设计是一次非常珍贵的机会,这是一次可以让我们所学的理论与实际相结合的机会。我们选择了游戏扫雷这一题目。通过这次比较完整的一个程序的设计,我走出了纯理论的学习,从一种全新的角度去学习。并且在小团队实现的MFC过程中,除去知识的大量更新,我学到了很多东西。其实个人而言,我体会较深的一点是团队互相帮助学习的过程,自己看书学习的经验,以及从网上以及其他各

22、种途径获得信息和知识的经验。理论与实际相结合的设计,锻炼了我综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平。而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,我的各方面经验都得到了极大的丰富。经过一个假期,没有近距离接触C+,因而一开学对进行MFC课程设计这一还算陌生的领域感到有些吃力。在同组的同学有着很强的C+实力,在进行编程的过程中,我向她学到了MFC的很多知识,交流中也总结出比书本上更精髓生动的语言。在自己琢磨MFC各种陌生知识的时候,队友的耐心与任性,对于知识的渴求,对于工作的专注,极大程度上鼓舞了我

23、。我们在交流中,迸发出了很多设计灵感,互相建议改进的过程中,我们分别从各个方面共同改进着,这个已经不能仅仅称作课程设计的作品。从知识获得方面来说,各种已经学习到的C+知识以及各种从网上搜索来的案例,我们都是随着设计的不断深入而不断熟悉的。和老师以及同学的沟通交流更使我对程序整体的规划与设计有了新的认识,也对自己提出了新的要求。 提高是有限的但提高也是全面的。正是这一次设计让我积累了许多实际经验。也必然会让我在未来的工作学习中表现出更高的耐力、理解力、实践力。 顺利如期的完成本次课程设计给了我很大的信心,但是也为我指出很多不足的地方。学习其实就是一个不断完善的过程,正视自己的不足之处。在以后的工

24、作和学习中不断的弥补这些不足之处,在以后的生活中也要保持同样的态度,不断地完善自己。为期二周不到的MFC课程设计就要这样画上一个句号了。从这不长不短的二周中,我获得了知识,学到了研究的坚持与韧性,这四周不仅仅是交出了一份作业,还对自己有了新的认识,实在是难得的机遇与经历。五、参考文献1 C+面向对象程序设计任凤华、李兰.西安电子科技大学出版社2 C+面向对象程序设计实验指导及习题解析任凤华、李兰。西安电子科技大学出版社3.C+程序设计实践教程(第2版).吴乃陵、李海文.高等教育出版社4 VisualC+课程设计与系统开发实例(第4版). 伍俊良 清华大学出版社5 深入浅出MFC(附光盘) .

25、侯俊杰. 华中科技大学出版社 六附录UINTm_uXNum;/ X方向小方块个数UINTm_uYNum;/ Y方向小方块个数UINTm_uMineNum;/ 总的雷个数int m_nLeaveNum;/ 剩余的雷个数UINTm_uSpendTime;/ 游戏开始击到目前所花费的时间UINTm_uGameState;/ 游戏状态UINTm_uTimer;/ 定时器标识UINTm_uNewState;/ 当前选中的小方块的状态UINTm_uLevel;/ 当前游戏等级UINTm_uPrimary;/ 初级记录UINTm_uSecond;/ 中级记录UINTm_uAdvance;/ 高级记录CStr

26、ingm_szPrimary;/ 初级记录保持者CStringm_szSecond;/ 中级记录保持者CStringm_szAdvance;/ 高级记录保持者BOOLm_bLRBtnDown;/ 是否为左右键同时按下BOOLm_bClickBtn;/ 左键按下的时候鼠标是否位于按钮区域内BOOLm_bMarkful;/ 是否能显示标记BOOLm_bColorful;/ 是否彩色显示BOOLm_bSoundful;/ 是否有声音CMenu*m_pSubMenu;/ 子菜单CBitmapm_bmpMine;/ 雷区背景图像CBitmapm_bmpNumber;/ 数字背景图像CBitmapm_bm

27、pButton;/ 笑脸按钮背景图像CBrushm_brsBG;/ 背景画刷对象COLORREFm_clrDark;/ 各按钮的深色调RECTm_rcClient;/ 客户区域UINTm_uBtnRect3;/ 按钮框区域坐标数组UINTm_uBtnState;/ 按钮状态UINTm_uNumRect3;/ 数字框区域坐标数组(包括时间和雷个数)UINTm_uShellRcX2;/ 内框以及边界的坐标X方向UINTm_uShellRcY2;/ 内框以及边界的坐标Y方向MINEWNDm_pMines100100;/ 表示雷区内的所有小方块的二维数组MINEWND*m_pNewMine;/ 当前选中的小方块MINEWND*m_pOldMine;/ 上次选中的小方块void*m_pSndDead;/ 失败提示音void*m_pSndVictory;/ 胜利提示音void*m_pSndClock;/ 时钟提示音

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!