MFC扫雷 课程设计报告

上传人:痛*** 文档编号:170948612 上传时间:2022-11-23 格式:DOC 页数:19 大小:148.50KB
收藏 版权申诉 举报 下载
MFC扫雷 课程设计报告_第1页
第1页 / 共19页
MFC扫雷 课程设计报告_第2页
第2页 / 共19页
MFC扫雷 课程设计报告_第3页
第3页 / 共19页
资源描述:

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

1、宿 迁 学 院Windows程序设计课程考核报告班 级: 学 号: 姓 名: 得 分: 2013年12月20日 目录 1.设计目的及要求-11.1设计目的及问题描述-11.2设计要求-11.3软件、硬件环境- 12. 课程设计步骤- 13. 课程设计内容- 13.1 概要设计- 2 3.1.1 程序总体框架描述- 23.1.2程序常用类声明- 3 3.2主要技术- 4 3.3系统设计结果 (界面截图、操作流程)-13 4.设计总结- 16 4.1遇到的问题及如何解决- 16题目:扫雷游戏1. 设计目的及要求 1.1设计目的及问题描述 系统地学习面向对象编程思想,了解MFC架构,逐步熟悉可视化编

2、程环境Visual C+并在此环境下设计并实现一个简单扫雷游戏,该扫雷游戏应能实现如下功能:(1) 雷区上部左侧显示总雷数减被标明有雷区域的数目。(2)雷区上部中间位置显示一按钮用于开局和显示鼠标动作的结果。(3)雷区上部右侧显示扫雷的时间。1.2设计要求(1)能独立搭建可视化程序编程环境,掌握V is ua l C+ + 6 .0 的安装、运行和使用。(2)总体要求:用面向对象编程的思想与方法,实现一个扫雷游戏的分析与设计阶段的开发工作,开发工具使用Visual C+6。(3)编写设计方案,设计过程,源程序文件结构,分析实验方案,并对实验做出总结。1.3软件、硬件环境 开发工具:Micros

3、oft Visual C+ 6.0软件和Windows 2000/XP操作系统2. 课程设计内容 扫雷小游戏的开发与实现3. 课程设计步骤 步骤大致上可以分为三个部分,分别为:画面初始、游戏者按下第一个方块和为非地雷方块时展开。 画面初始时,以游戏者最后一次设定的地雷区大小为范围画出地雷区,但此时并未产生地雷。当游戏者按下第一个方块时产生地雷资料并启动定时器,为何在游戏者按下第一个方块才产生地雷资料呢?其主要的用意在于不要让游戏者第一次就踩到地雷,这样在某种程度上可以提高游戏者游玩的气氛。接着就是如何判断按下的方块是非地雷时的处理,这也是整个游戏的技术核心,我们可以通过递归的观念来检查周边的方

4、块是否含有地雷及是否继续往外翻开。3.1 概要设计 相信大多数使用Windows操作系统的使用者,对这款游戏都不陌生。这款游戏不止操作简单,规则也不难,再加上游戏速度的控制机制得宜,让整个游戏在操作过程中充满了快乐与紧张的气氛。除了游乐当中能带给使用者快乐之外,游戏的设计内容无形中也不断训练使用者的逻辑思考能力,对于依靠高度脑力工作的现代人,都可以通过这个游戏,不时的检验一下自己,所以我们不难发现,在各种可携带的电子产品上都有这款游戏的踪影。 当按下的方块不是地雷,且周边八个方块也都没有地雷时,方块会以被翻开方块的八个方向将空白方块翻开。3.1.1 程序总体框架描述 扫雷游戏的开发主要包括两大

5、部分:一个部分是布雷,该部分主要将雷随机布置在游戏区域内,以避免出现相同的雷区布置地图。另一部分是扫雷,该部分包括判断鼠标左键点击某区域该区域是否是雷,如果是雷该如何操作,如果不是雷该如何操作,鼠标右键点击某区域时如果判断该区域是雷则加以标记,如果不是雷也加以标记,以及当鼠标双击某区域时,判断与该区域相邻的其它8个区域是否是雷并做一个标记。 扫雷游戏窗体类模块窗体加载构造函数鼠标左键鼠标右键画图函数鼠标点击函数开始函数递归函数图1 系统功能图3.1.2程序常用类声明首先定义一个雷类: class Lei243 /定义一个雷类public: int weitu; /显示哪一个位图 int shu

6、mu;/这个位置相应的值; 接着是在View类添加变量和函数:int leftnum; /剩下雷数int leinum;/雷数int jieshu;/结束short second; /计时int secondstart; /开始计时CBitmap m_Bitmap12;/位图数组CBitmap m_anniu4;/按扭位图数组int m_RowCount;/雷区行数 int m_ColCount; /雷区列数 Lei243 lei5050; /最大雷区void leizero(); /这个位置周围雷数为0afx_msg int OnCreate(LPCREATESTRUCT lpCreateS

7、truct);afx_msg void OnLButtonDown(UINT nFlags, CPoint point);/鼠标按下左键afx_msg void OnLButtonUp(UINT nFlags, CPoint point);/鼠标左键抬起afx_msg void OnRButtonDown(UINT nFlags, CPoint point);/鼠标按下右键afx_msg void OnTimer(UINT nIDEvent);/计时器函数afx_msg void OnStart();/开始函数3.2主要技术 构造函数:由于构造函数是程序运行时就执行的,所以,除了对变量赋值之外

8、,我们还可以把游戏的核心结构即内部数组赋值:先是把全部格子的位图和雷数赋值为0,然后调用随机函数按指定雷数赋值为-1,最后把不是雷的格子的雷数赋值为相应的值。CMy243ztyslView:CMy243ztyslView()/ TODO: add construction code here for(int ii=0;ii16;ii+)m_Bitmapii.LoadBitmap(IDB_BITMAP14+ii); for(int jj=0;jj4;jj+)m_anniujj.LoadBitmap(IDB_ANNIU1+jj); second=0; /计时 secondstart=0; /1时开

9、始计时 m_RowCount=25; /行数 m_ColCount=16; /列数 leinum=80; /雷数 leftnum=leinum; /剩余雷数 jieshu=0; /jieshu=1时停止 int aa=0; for(int i=0;im_RowCount;i+)/初始化为0for(int j=0;jm_ColCount;j+)leiij.shumu=0;leiij.weitu=0;CTime time=GetCurrentTime();/获取当前时间int s;s=time.GetSecond();/获取秒数do/设置40个雷int k=(rand()*s)%m_RowCoun

10、t;/以当前秒数为产生随机算法int l=(rand()*s)%m_ColCount; if(leikl.shumu!=-1) /为了避免一个位置同时算两个雷 /只允许当前位置不是雷时赋值为雷leikl.shumu=-1; aa+; while(aa!=leinum); /给方格赋值,计算雷数for(int a=0;am_RowCount;a+)for(int b=0;bm_ColCount;b+)if(leiab.shumu=0)for(int c=a-1;ca+2;c+)for(int d=b-1;d=0&c=0&dFillRect(myrect1,&mybrush1);CBrush my

11、brush; /画黑框 mybrush.CreateSolidBrush(RGB(0,0,0); CRect myrect(20,10,70,40); pDC-FillRect(myrect,&mybrush);CRect myrect2(325,10,375,40); pDC-FillRect(myrect2,&mybrush); CPen mypen;CPen*myoldPen;mypen.CreatePen(PS_SOLID,2,RGB(255,255,255); myoldPen=pDC-SelectObject(&mypen);pDC-MoveTo(20,40);/画黑框的白线pDC

12、-LineTo(70,40);pDC-LineTo(70,10);pDC-MoveTo(325,40);pDC-LineTo(375,40);pDC-LineTo(375,10); for(int i=0;im_RowCount;i+)/画雷区边线 /左上角是白线,右下角是黑线,以显示立体感for(int j=0;jMoveTo(10+i*15,50+j*15+14);pDC-LineTo(10+i*15,50+j*15);pDC-LineTo(10+i*15+14,50+j*15);pDC-SelectObject(myoldPen); CPen mypen2;CPen*myoldPen2;

13、mypen2.CreatePen(PS_SOLID,1,RGB(0,0,0); myoldPen2=pDC-SelectObject(&mypen2); for(int ii=0;iim_RowCount;ii+)for(int jj=0;jjMoveTo(10+ii*15,50+jj*15+14);pDC-LineTo(10+ii*15+14,50+jj*15+14);pDC-LineTo(10+ii*15+14,50+jj*15);pDC-SelectObject(myoldPen2); CDC Dc; if(Dc.CreateCompatibleDC(pDC)=FALSE) AfxMes

14、sageBox(Cant create DC); Dc.SelectObject(m_anniu0); /显示按钮 pDC-BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY); for(int a=0;am_RowCount;a+)/判断显示什么位图 /weitu=1已按下的数字区 /weitu=2显示旗 /weitu=3显示问号 for(int b=0;bBitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);if(leiab.weitu=2)Dc.SelectObject(m_Bitmap9);pDC-BitBlt(a*15

15、+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);if(leiab.weitu=3)Dc.SelectObject(m_Bitmap10);pDC-BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);if(jieshu=1&leiab.shumu=-1)/结束 Dc.SelectObject(m_Bitmap11);pDC-BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);Dc.SelectObject(m_anniu3);pDC-BitBlt(180,10,160,160,&Dc

16、,0,0,SRCCOPY);int nOldDC=pDC-SaveDC();/显示黑框里的数字pDC-SetTextColor(RGB(255,0,0);pDC-SetBkColor(RGB(0,0,0);CFont font; if(0=font.CreatePointFont(160,Comic Sans MS)AfxMessageBox(Cant Create Font);pDC-SelectObject(&font);CString str; if(leftnumTextOut(25,10,str);if(second10)str.Format(00%d,second);else if

17、(secondTextOut(330,10,str);pDC-RestoreDC(nOldDC);计时器函数:OnTimer(UINT nIDEvent)函数,同时也可以实现计时显示。添加OnCreate(LPCREATESTRUCT lpCreateStruct)和 OnTimer(UINT nIDEvent):int CMy243View:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: Add your specialized creation

18、 code here SetTimer(1,50,NULL);/20次为一秒return 0;void CMy243View:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultif(jieshu=1)return;/显示个数为0的方格leizero();/结束,返回if(secondstart0)/计时secondstart+; if(secondstart=20)/二十次为一秒secondstart=1;second+;CRect rect3;rect3.left=325;

19、rect3.right=375;rect3.top=10;rect3.bottom=40;InvalidateRect(&rect3);/重画时间CView:OnTimer(nIDEvent);开始函数: 点击笑脸图标和开始键都可以重新开始。void CMy243ztyslView:OnStart() SetTimer(1,50,NULL);/ TODO: Add your command handler code heresecond=0;/计时secondstart=0;/1时开始计时 leftnum=leinum;/剩余雷数jieshu=0;/jieshu=1时停止int aa=0;fo

20、r(int i=0;im_RowCount;i+)/初始化0for(int j=0;jm_ColCount;j+)leiij.shumu=0;leiij.weitu=0;do /设置40个雷int k=rand()%m_RowCount;int l=rand()%m_ColCount;if(leikl.shumu!=-1)leikl.shumu=-1; aa+; while(aa!=leinum); for(int a=0;am_RowCount;a+)for(int b=0;bm_ColCount;b+)if(leiab.shumu=0)for(int c=a-1;ca+2;c+)for(i

21、nt d=b-1;d=0&c=0&dm_ColCount)if(leicd.shumu=-1)leiab.shumu+; /给方格赋值Invalidate(); 3.3系统设计结果 (界面截图、操作流程)1) 游戏开始界面。 图2 游戏初始界面 2) 我们可以点击开始游戏。 图3 点击开始游戏3)点击小方块游戏开始并计时。 图4 开始扫雷4)可以右击标机雷的位置,这样雷的个数会减少。 图5 标机雷的位置5)当点到雷时,游戏结束停止计时。 图6 踩到地雷6)可以点笑脸或开始重新开始游戏。 图7 新的一局游戏4. 设计总结 随着扫雷游戏的开发完成,本游戏中预期的主要功能也基本实现。本系统以Visu

22、alC+6.0作为前台开发工具,VisualC+6.0以简单、易用等优点成为开发本系统的首选工具。本论文阐述了扫雷游戏的分析与设计的全过程,并在论文中相应的位置插入了图片、流程图以及一些具有技巧性的程序代码,更加清晰的描述了该游戏是如何实现的。 扫雷游戏是一款益智类游戏,该游戏与那些网络游戏和3D游戏相比,它有编写简单容易上手等特点,非常适合人们在完成工作的时候适当的娱乐要求。这些小游戏大都是以益智和娱乐为目的,不仅给紧张工作的人们以放松,还可以让人们的大脑得到开发。由于我学习VisualC+6.0的时间比较短,其中的很多知识还没有了解和掌握,在扫雷游戏中有些功能还不够完善,例如在扫雷游戏中不能实现玩家成绩的排名。希望在以后的工作和学习中不断的充实自己的知识结构,把扫雷游戏的功能进一步完善,使它成为一个更具有实用价值的游戏软件,同时也恳请老师给予批评指正。4.1遇到的问题及如何解决在程序写好后运行游戏时发现以下问题:1. 游戏中显示的位图错乱。2. 在点击笑脸重新开始时出现错误,只显示一个雷。解决方案:1. 重新把位图的ID检查一下,发现ID有错误,改之。2. 在OnStart()函数中初始化雷后,再重新步地雷的代码书写错误,及时改正了过来。

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