版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
年4月19日C语言程序设计课程设计扫雷文档仅供参考,不当之处,请联系改正。辽宁工业大学《C++语言程序设计》课程设计(论文)题目:扫雷课程设计(论文)任务及评语院(系):软件学院教研室:软件教研室学号学生姓名专业班级软件工程166班课程设计(论文)题目扫雷课程设计(论文)任务程序设计的任务与要求:掌握面向对象程序设计语言C++的基本语法掌握C++面向对象设计的思想掌握VC++6.0与DEVC++开发工具的使用(4).运用标准C++规范设计应用程序设计过程中,要严格遵守设计的时间安排,听从指导教师的指导。正确地完成上述内容,规范完整地撰写出设计报告。指导教师评语及成绩成绩:指导教师签字:年月日目录第1章课程设计目的与要求 11.1设计目的 11.2实验环境 11.3预备知识 11.4设计要求 1第2章课程设计内容 22.1课题描述 22.2系统设计 22.2.1功能分析 22.2.2面向对象设计 32.2.2类成员描述 52.3程序实现 92.3.1源码分析 92.3.2运行结果 13第3章课程设计总结 14参考文献 15第1章课程设计目的与要求1.1设计目的将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。经过课程设计,学生在下述各方面的能力应该得到锻炼:(1)进一步巩固、加深学生所学专业课程《C++语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。(3)利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。(5)掌握面向对象程序设计的方法。(6)熟练掌握C++语言的基本语法,灵活运用各种数据类型。(7)进一步掌握在集成环境下如何调试程序和修改程序。1.2实验环境硬件要求能运行Windows操作系统的微机系统。C++语言应用程序开发软件使用:VC++系统,或其它C++语言应用程序开发软件。1.3预备知识熟悉C++语言程序设计的基本知识及VC++编辑器的使用方法。1.4设计要求1.仔细分析设计题目,画出程序流程图,编写程序源代码。2.积极上机调试源程序,增强编程技巧与调程能力。3.认真书写课程设计预习报告,课程设计说明书。4.遵守课程设计要求和机房管理制度,服从指导教师的安排,确保课程设计的顺利完成课程设计内容。第2章课程设计内容2.1课题描述扫雷最原始的版本能够追溯到1973年一款名为“方块”的游戏。不久之后,“方块”被改写成了游戏Rlogic。在Rlogic里,玩家的任务是作为美国海军陆战队队员,为指挥中心探出一条没有地雷的安全路线,如果路全被地雷堵死就算输。两年后,汤姆·安德森在Rlogic的基础上又编写出了游戏地雷,由此奠定了现代扫雷游戏的雏形。1981年,微软公司的罗伯特和卡特两位工程师在Windows3.1系统上加载了该游戏,扫雷游戏才正式在全世界推广开来。本课程设计实现类似于Windows操作系统自带的扫雷游戏。在课程设计中,系统开发平台为WindowsXP,程序设计语言采用VisualC++,程序运行平台为Windows/XP。在程序设计中,把整个雷区看成一个二维数组,把雷方块定义为具有所在雷区二维数组的行和列、当前状态、方块属性、历史状态的结构体。整个游戏程序包括了布雷、扫雷过程和结果三个阶段,在处理鼠标响应事件中伴随着GDI绘图。程序经过调试运行,实现了设计目标,能够同时满足扫雷游戏初学者和高手的需要。2.2系统设计2.2.1功能分析本章的课程设计使用C++语言编写一个与其类似的扫雷游戏。具体要求如下:(1)选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。(2)用户要揭开某个方块,可单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。(3)如果用户认为某个方块下埋着雷,单击右键能够在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。(4)扫雷胜利后,显示游戏胜利,失败后显示再来一局。(5)用户能够改变游戏界面的颜色外观。(6)游戏中用户能够经过菜单重新开始新游戏。2.2.2面向对象设计类的设计本程序设计了CMineWnd类、CDlgCustom类、bomb类、cview类、CDlgHero类、CDlgNewRecord类等。CMineWnd类作用:用于扫雷开始运行等操作。cbombview类作用:扫雷工作补充。bomb类作用:封装每颗雷的相关属性。cview类作用:完成扫雷的大部分工作。CDlgHero类作用:等级英雄榜。CDlgNewRecord类作用:重新开始新的游戏。基类为CMineWnd类、bomb类、cview类。派生类CDlgHero类由CDialog应用程序类继承,cbombview类由cview类继承。(1)定义类bomb,封装每颗雷的相关属性。classbomb{public:intisbomb;//决定初始时是否是雷boolissel;//判断区域是否被处理过且周围有雷boolisdone;//判断递归时是否被处理过intnum;//周围雷数boolfindbomb;//排雷者认为是雷时置一(可是不一定真是雷)};重载cmainframe中precreatewindow,并设置相应属性,使其窗体大小固定,这样就固定了显示区域的大小为初始10乘10个雷和外加雷区上部的控制区域,部分代码如下cs.style=ws_overlapped|ws_sysmenu|ws_border|ws_minimizebox;cs.cy=10*15+6;cs.cx=10*15+60;//6和60分别是横纵的附加值,用于边框、菜单、标题条、控制区域。重载cbombview中oncreate函数创立位图按钮,该位图按钮的两幅位图对应了正常、雷正确两种状态,当要显示被炸死的状态时应动态销毁该按钮,并重新创立一位图对应正常和被炸死两种状态,将该位图按钮的id号定为id_game_begin,这样一来当点击按钮时便可重新开始游戏,部分代码如下。crectrcclient;
getclientrect(&rcclient);
crectrect(rcclient.cx/2-8,10,rcclient.cx/2+8,20);
m_button.create("new",bs_defpushbutton|ws_visible|
bs_ownerdraw,rect,this,id_game_begin);
m_button.loadbitmaps(idb_face1,idb_face2);2.UML类图CMineWnd-CMineApp:int-CMineWnd:int-ExitInstance:int-InitInstance:BOOL+CMineWnd():virtual+ResetRecord():void+SetCustom():void+LookUp(CData&data):int+InitGame():void+LoadBitmap():void+FreeMines():void+LayMines(UINTrow,UINTcol):voidbombCDlgHero-isbomb:int-issel:bool-isdone:bool-findbomb:bool-num:intint+DrawShell(CPaintDC&dc):void+DrawButton(CPaintDC&dc):void+SetBHolder(CStringholder)+SetBRecord(UINTrecord):void+SetIHolder(CStringholder)图2.1扫雷游戏程序的UML类图3.系统总体流程图结束开始开始结束开始开始依照使用者初始设定等待按键左键键右键第一次按下方块显示方块布置地雷启动计时器按下方块是否为地雷显示分数是否再玩玩结束延按下方块周围展开非地雷方块计时器时间到否否是是否否是是否图2.2系统总体流程图2.2.2类成员描述1.程序编程中用到的类函数简单介绍:CchildView:其中定义了Drawboard——对扫雷棋盘进行了绘制Drawbutton——将资源类中存有的脸的图片进行裁减选择加入到规定位置。Drawcell——绘制雷区(即在资源类的cell的15个图片中根据需要选择标志,雷图标,以及数字标实经过裁减放到规定的坐标处)DrawLCD——绘制记时器,调用资源类中的num数字图片用于记时Expand——当鼠标点击处周围无雷时扩大范围Gameover——游戏结束时的定义Inbound——对游戏鼠标点击区域的限制OnCreate——建立游戏OnGameCustomize——游戏自定义设置OnGameNew——游戏级别的初始化OnGameRecord——扫雷英雄榜的判断记录OnLButtonDown——左键按下时触发的动作和计算机所做的判断OnLButtonUp——左键弹起时触发的动作和计算机所做的判断OnRButtonDown——右键按下时触发的动作和计算机所做的判断OnRButtonUp——右键弹起时触发的动作和计算机所做的判断OnTimer——记时器设置OnUpdateGameLevel——修改游戏等级OnUpdateGameMark——修改游戏标志wm_lbuttomdown消息响应函数onlbuttomdown是处理用户输入的主要执行者,函数首先判断点中位置是否是雷,是则关闭定时器,销毁原位图按钮,创立一对应正常和被炸死两种状态的新位图按钮,并调用setstate将其设置为pushdown(小人哭的状态),将m_bgameover,置为true标志游戏结束,否则先调用setstate设置位图按钮为pushdown(小人笑的状态),并在onlbuttomup中设置位图按钮为正常状态,然后调用caculate函数记下周围雷的数目,最后调用invalidate使客户区无效,迫使ondraw函数重绘客户区域,在调用invalidate时不应重画背景,避免闪烁,这样就完成了在雷区按下左键的响应动作。wm_rbuttomdown消息响应函数onlbuttomdown将被认为有雷位置的m_ibombnum.findbomb置一,减少左上角的雷记数,然后判断是否真正全部排完了雷,是则结束游戏弹出input对话框,让扫雷的人输入姓名,在响应idok通知码时将其写入注册表,没有全部排完则使客户区无效,迫使ondraw函数重绘客户区域完成在雷区按下右键的动作。
ondraw函数在每次点击左键或右键时都会被调用重雷区和控制区域,因为点击情况的复杂性和雷属性的多元化导致ondraw函数需要精心设计。
函数caculate计算某个雷周围的雷数,根据前面的分析知道,计算某个雷周围的雷数本身就是一个递归过程,在编制时应注意递归的边界条件,稍不注意会陷入无穷递归而耗尽了系统的资源。2.系统结构图如图2.3所示。类模块扫雷游戏扫雷类模块扫雷游戏扫雷窗体类模块背景音乐英雄榜级别选择鼠标开始窗体加载鼠标函数递归函数重开函数画图函数音乐函数图2.3系统结构图雷区设计函数流程图如图2.4所示。图2.4雷区设计函数流程图4.布雷函数流程图随即获取一个状态为非雷的点,将它的属性标志为雷,重复这样的工作,直到布下足够的雷为止,其函数流程图如图2.5所示。生成随机的雷方块的坐标(x,y)开始开始生成随机的雷方块的坐标(x,y)开始开始生成随机的雷方块的坐标(x,y)判断(x,y)区域是否已经布下雷在(x,y)区域布雷,修改状态数据据。。。。。。。。。。。。。。。。。。。。。。。。。。。。。判断是否布下所有雷结束否是是否图2.5布雷函数流程图在CMineWnd类中添加游戏的布雷模块的处理函数,该函数的实现如下。voidCMineWnd::LayMines(UINTrow,UINTcol){//埋下随机种子srand((unsigned)time(NULL));UINTi,j; for(UINTindex=0;index<m_uMineNum;){ //取随即数i=rand()%m_uYNum;j=rand()%m_uXNum;if(i==row&&j==col)continue;if(m_pMines[i][j].uAttrib!=ATTRIB_MINE){m_pMines[i][j].uAttrib=ATTRIB_MINE;//修改属性为雷index++;}} }2.3程序实现2.3.1源码分析程序源码分析:1.//程序名:扫雷游戏;程序作者:孙庆贺;程序版本:1.0;完成时间:.12;//头文件Mine.h:定义类Mine的接口,完成初始化:#if!defined#define#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000#ifndef__AFXWIN_H__#errorinclude'stdafx.h'beforeincludingthisfileforPCH#endif#include"resource.h"#include"MineWnd.h"classCMineApp:publicCWinApp{public:CMineApp();CMineWnd*m_pMineWnd;//{{AFX_VIRTUAL(CMineApp)public:virtualBOOLInitInstance();virtualintExitInstance();DECLARE_MESSAGE_MAP()private:UINTm_uXMineNum; UINTm_uYMineNum; };#endif2.//源文件Mine.cpp,类Mine.cpp的实现文件:#include"stdafx.h"#include"Mine.h"#include"MineDefs.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endifBEGIN_MESSAGE_MAP(CMineApp,CWinApp)END_MESSAGE_MAP()CMineApp::CMineApp(){}CMineApptheApp;constCStringclassName=_T("MineClass");BOOLCMineApp::InitInstance(){SetRegistryKey("CSER_513_2");m_uXMineNum=GetProfileInt(GAME_SETTING,CUSTOM_XNUM,PRIMARY_XNUM);m_uYMineNum=GetProfileInt(GAME_SETTING,CUSTOM_YNUM,PRIMARY_YNUM);//定义并注册MineWnd窗口m_pMineWnd=newCMineWnd();WNDCLASSwc;ZeroMemory(&wc,sizeof(wc));wc.hInstance=AfxGetInstanceHandle();wc.lpfnWndProc=::DefWindowProc;wc.hbrBackground=NULL;wc.hCursor=LoadCursor(IDC_ARROW);wc.hIcon=LoadIcon(IDR_MAINFRAME);wc.lpszClassName=className;wc.lpszMenuName=MAKEINTRESOURCE(IDR_MENU);//注册窗口if(!AfxRegisterClass(&wc)){AfxMessageBox("注册类失败!");returnFALSE;}UINTuWidth=DEFAULT_FRAME_X+m_uXMineNum*MINE_WIDTH+LINE_WIDTH_0*3+SIDE_WIDTH_0+SIDE_WIDTH_1;UINTuHeight=DEFAULT_FRAME_Y+m_uYMineNum*MINE_HEIGHT+LINE_WIDTH_0*3+SIDE_WIDTH_0*2+SIDE_WIDTH_1+SHELL_S_H;UINTuXPos=GetSystemMetrics(SM_CXSCREEN)/2-uWidth/2;UINTuYPos=GetSystemMetrics(SM_CYSCREEN)/2-uHeight/2;//创立窗口if(!m_pMineWnd->CreateEx(NULL,className,_T("扫雷"),WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX,uXPos,uYPos,uWidth,uHeight,NULL,NULL)){AfxMessageBox("创立主窗口失败!");returnFALSE;}//绑定该窗口为主窗口m_pMainWnd=m_pMineWnd;//显示窗口m_pMineWnd->ShowWindow(SW_NORMAL);returnTRUE;}intCMineApp::ExitInstance(){deletem_pMineWnd;returnCWinApp::ExitInstance();}}3.//鼠标左键点击事件的关键代码如下所示。voidCMineWnd::OnLButtonUp(UINTnFlags,CPointpoint){//笑脸图按钮所在的区域CRectrcBtn(m_uBtnRect[1],15,m_uBtnRect[2],39);//雷区所在的区域CRectrcMineArea(MINE_AREA_LEFT,MINE_AREA_TOP,MINE_AREA_LEFT+m_uXNum*MINE_WIDTH,MINE_AREA_TOP+m_uYNum*MINE_HEIGHT); if(rcBtn.PtInRect(point)){//点击笑脸图Invalidate();InitGame();}elseif(rcMineArea.PtInRect(point)){//点击雷区域CStringvalue;UINTaround=0;//根据不同的游戏状态作处理switch(m_uGameState){//游戏进行状态m_pOldMine=GetMine(point.x,point.y);if(!m_pOldMine){ReleaseCapture();return;}//检测判断当前状态是否为左右鼠标同时按下if(m_bLRBtnDown){m_bLRBtnDown=FALSE;OnLRBtnUp(m_pOldMine->uRow,m_pOldMine->uCol);if(m_uGameState==GS_WAIT){m_uBtnState=BUTTON_NORMAL;Invalidate();ReleaseCapture();return;}//假若周围已经标识的雷=周围真正的雷数,拓展if(m_pOldMine->uState!=STATE_FLAG){OpenAround(m_pOldMine->uRow,m_pOldMine->uCol);if(ErrorAroundFlag(m_pOldMine->uRow,m_pOldMine->uCol)) {Dead(m_pOldMine->uRow,m_pOldMine->uCol);ReleaseCapture()return;}}else //启动定时器m_uTimer=SetTimer(ID_TIMER_EVENT,1000,NULL);//布雷LayMines(m_pOldMine->uRow,m_pOldMine->uCol);//layalltheminesdown//改变游戏状态为"运行/GS_RUN"m_uGameState=GS_RUN;}if(m_pOldMine->uOldState==STATE_NORMAL){//当该雷区域为正常未作标记才打开//如果该区域为雷,则死亡if(IsMine(m_pOldMine->uRow,m_pOldMine->uCol)){Dead(m_pOldMine->uRow,m_pOldMine->uCol);ReleaseCapture();return;}//thespecialMINEWNDisnotamine//不是雷的时候,获取其周围的雷数目around=GetAroundNum(m_pOldMine->uRow,m_pOldMine->uCol);//标志为“?”问号的时候m_pOldMine->uState=STATE_DICEY;}//图形结束voidCSnakeView::close()2.3.2运行结果程序运行结果图2.6、图2.7。①游戏初始界面:如下图图2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广西贵港市桂平市垌心乡卫生院招聘编外人员1人备考题库附参考答案详解(预热题)
- 2026内蒙古兴安盟事业单位春季专项人才引进145人备考题库含答案详解(典型题)
- 2026广东东莞厚街社区招聘社区网格员2人备考题库及参考答案详解(轻巧夺冠)
- 2026广东深圳市南山区松坪文理幼儿园招聘1人备考题库带答案详解(综合卷)
- 版高考地理一轮复习真题精练专题三地球上的大气第7练常见天气系统与天气现象课件
- 食品添加剂生产管理准则
- 某物业管理细则
- 2026内蒙古通辽市科尔沁左翼后旗招聘政府专职消防员29人备考题库含答案详解(b卷)
- 2026重庆建筑工程职业学院招聘非事业编制(合同制)人员1人备考题库(第一批)及参考答案详解一套
- 2026新疆得仁水务发展有限公司市场化选聘公司及子公司管理人员6人备考题库附参考答案详解(综合题)
- 2026年苏州市高三语文3月模拟联考试卷附答案解析
- 2026宁波能源集团生物质能发展有限公司招聘1人备考题库及参考答案详解
- 轻工制造业转型升级与高质量发展路径研究
- 2026年及未来5年市场数据中国生活垃圾中转站行业市场调查研究及投资前景预测报告
- 海洋微生物技术
- 2026年《必背60题》车辆工程专业26届考研复试高频面试题包含详细解答
- 2026年及未来5年中国月子中心行业市场竞争格局及发展趋势预测报告
- 缝纫机安全培训教材课件
- (2025版)中国焦虑障碍防治指南
- 2026年心理咨询师亲密关系题库含答案
- 2026年及未来5年市场数据中国缓控释肥行业市场前景预测及投资战略数据分析研究报告
评论
0/150
提交评论