MFC扫雷-课程设计报告(共18页).doc

上传人:飞****2 文档编号:16696416 上传时间:2022-05-18 格式:DOC 页数:18 大小:149KB
返回 下载 相关 举报
MFC扫雷-课程设计报告(共18页).doc_第1页
第1页 / 共18页
MFC扫雷-课程设计报告(共18页).doc_第2页
第2页 / 共18页
点击查看更多>>
资源描述

《MFC扫雷-课程设计报告(共18页).doc》由会员分享,可在线阅读,更多相关《MFC扫雷-课程设计报告(共18页).doc(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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设计目的及问题描述 系统地学习面向对象

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

3、.3软件、硬件环境 开发工具:Microsoft 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 we

6、itu; /显示哪一个位图 int shumu;/这个位置相应的值; 接着是在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(LPC

7、REATESTRUCT lpCreateStruct);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; /计

9、时 secondstart=0; /1时开始计时 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

10、=(rand()*s)%m_RowCount;/以当前秒数为产生随机算法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

11、,&mybrush1);CBrush mybrush; /画黑框 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-Mov

12、eTo(20,40);/画黑框的白线pDC-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 m

13、ypen2;CPen*myoldPen2;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.CreateCompatible

14、DC(pDC)=FALSE) AfxMessageBox(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_Bit

15、map9);pDC-BitBlt(a*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-BitB

16、lt(180,10,160,160,&Dc,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

17、(00%d,second);else if(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

18、 specialized creation 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

19、rect3;rect3.left=325;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;/j

20、ieshu=1时停止int aa=0;for(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(in

21、t c=a-1;ca+2;c+)for(int 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. 设计总结 随着扫雷游戏的开发完成,本游戏中

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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁