MFC扫雷课程设计报告_第1页
MFC扫雷课程设计报告_第2页
MFC扫雷课程设计报告_第3页
MFC扫雷课程设计报告_第4页
MFC扫雷课程设计报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、宿迁学院windows程序设计课程考核报告班级:学号:姓名:得分:2013 年 12 月 20 日目录1. 设计目的及要求 -1 1.1 设计目的及问题描述 -1 1.2 设计要求 -1 1.3 软件、硬件环境 - 1 2. 课程设计步骤 - 1 3. 课程设计内容 - 1 3.1 概要设计 - 2 3.1.1 程序总体框架描述 - 2 3.1.2程序常用类声明 - 3 3.2 主要技术 - 4 3.3 系统设计结果(界面截图、操作流程)-13 4. 设计总结 - 16 4.1 遇到的问题及如何解决 - 16 - 1 - / 18- 1 - / 18 题目:扫雷游戏1. 设计目的及要求1.1

2、设计目的及问题描述系统地学习面向对象编程思想,了解mfc架构,逐步熟悉可视化编程环境visual c+并在此环境下设计并实现一个简单扫雷游戏,该扫雷游戏应能实现如下功能:(1)雷区上部左侧显示总雷数减被标明有雷区域的数目。(2)雷区上部中间位置显示一按钮用于开局和显示鼠标动作的结果。(3)雷区上部右侧显示扫雷的时间。1.2 设计要求( 1)能独立搭建可视化程序编程环境,掌握vis ual c +6.0的安装、运行和使用。(2)总 体 要 求 :用 面 向 对 象 编 程 的 思 想 和 方 法 ,实 现 一 个 扫 雷 游 戏 的 分析 和 设 计 阶 段的开发工作,开发工具使用v isu a

3、l c + +6 。(3)编写设计方案,设计过程,源程序文件结构,分析实验方案,并对实验做出总结。1.3 软件、硬件环境开发工具: microsoft visual c+ 6.0软件和 windows 2000/xp 操作系统2. 课程设计内容扫雷小游戏的开发和实现3. 课程设计步骤步骤大致上可以分为三个部分,分别为:画面初始、游戏者按下第一个方块和为非地雷方块时展开。画面初始时,以游戏者最后一次设定的地雷区大小为范围画出地雷区,但此时并未产生地雷。 当游戏者按下第一个方块时产生地雷资料并启动定时器,为何在游戏者按下第一个方块才产生地雷资料呢?其主要的用意在于不要让游戏者第一次就踩到地雷,这样

4、在某种程度上可以提高游戏者游玩的气氛。接着就是如何判断按下的方块是非地雷时的处理,这也是整个游戏的技术核心, 我们可以通过递归的观念来检查周边的方块是否含有地雷及是否继续往外翻开。- 2 - / 18- 2 - / 18 3.1 概要设计相信大多数使用windows操作系统的使用者,对这款游戏都不陌生。这款游戏不止操作简单, 规则也不难, 再加上游戏速度的控制机制得宜,让整个游戏在操作过程中充满了快乐和紧张的气氛。 除了游乐当中能带给使用者快乐之外,游戏的设计内容无形中也不断训练使用者的逻辑思考能力,对于依靠高度脑力工作的现代人,都可以通过这个游戏,不时的检验一下自己,所以我们不难发现,在各种

5、可携带的电子产品上都有这款游戏的踪影。当按下的方块不是地雷,且周边八个方块也都没有地雷时,方块会以被翻开方块的八个方向将空白方块翻开。3.1.1 程序总体框架描述扫雷游戏的开发主要包括两大部分:一个部分是布雷,该部分主要将雷随机布置在游戏区域内, 以避免出现相同的雷区布置地图。另一部分是扫雷,该部分包括判断鼠标左键点击某区域该区域是否是雷,如果是雷该如何操作,如果不是雷该如何操作,鼠标右键点击某区域时如果判断该区域是雷则加以标记,如果不是雷也加以标记,以及当鼠标双击某区域时,判断和该区域相邻的其它8 个区域是否是雷并做一个标记。扫雷游戏窗体类模块窗体加载构造函数鼠标左键鼠标右键画图函数鼠标点击

6、函数开始函数递归函数图 1 系统功能图- 3 - / 18- 3 - / 18 3.1.2 程序常用类声明首先定义一个雷类:class lei243 /定义一个雷类 public: int weitu; / 显示哪一个位图int shumu;/ 这个位置相应的值;接着是在 view 类添加变量和函数:int leftnum; /剩下雷数int leinum;/雷数int jieshu;/结束short second; /计时int secondstart; /开始计时cbitmap m_bitmap12;/位图数组cbitmap m_anniu4;/按扭位图数组int m_rowcount;/

7、雷区行数int m_colcount; /雷区列数 lei243 lei5050; /最大雷区void leizero(); /这个位置周围雷数为0 afx_msg int oncreate(lpcreatestruct 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

8、);/鼠标按下右键afx_msg void ontimer(uint nidevent);/计时器函数afx_msg void onstart();/开始函数- 4 - / 18- 4 - / 18 3.2 主要技术构造函数:由于构造函数是程序运行时就执行的,所以, 除了对变量赋值之外,我们还可以把游戏的核心结构即内部数组赋值:先是把全部格子的位图和雷数赋值为0,然后调用随机函数按指定雷数赋值为-1, 最后把不是雷的格子的雷数赋值为相应的值。cmy243ztyslview:cmy243ztyslview() / todo: add construction code here for(int

9、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时开始计时 m_rowcount=25; /行数 m_colcount=16; /列数 leinum=80; /雷数 leftnum=leinum; /剩余雷数 jieshu=0; /jieshu=1时停止 int aa=0; for(int i=0;im_rowcount;i+) / 初始化为0 for(i

10、nt j=0;jm_colcount;j+) leiij.shumu=0; leiij.weitu=0; ctime time=getcurrenttime(); / 获取当前时间int s; - 5 - / 18- 5 - / 18 s=time.getsecond(); /获取秒数do / 设置 40 个雷 int k=(rand()*s)%m_rowcount; / 以当前秒数为产生随机算法int l=(rand()*s)%m_colcount; if(leikl.shumu!=-1) /为了避免一个位置同时算两个雷 /只允许当前位置不是雷时赋值为雷 leikl.shumu=-1; aa

11、+; 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 mybrush; /画黑框mybrush.createsolidbrush(rgb(0,0,0); crect myrect(20,10,70,40); pdc-fillrect(myrect,&a

12、mp;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-lineto(70,40); pdc-lineto(70,10); - 7 - / 18- 7 - / 18 pdc-moveto(325,40); pdc-li

13、neto(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; mypen2.createpen(ps_solid,1,rgb(0,0,0); myoldpen2=pd

14、c-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) afxmessagebox(cant create dc); dc.selectobject(m_a

15、nniu0); /显示按钮 pdc-bitblt(180,10,160,160,&dc,0,0,srccopy); for(int a=0;am_rowcount;a+)/判断显示什么位图 /weitu=1已按下的- 8 - / 18- 8 - / 18 数字区 /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+10,b*15+50,

16、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,1

17、0,160,160,&dc,0,0,srccopy); int nolddc=pdc-savedc();/显示黑框里的数字pdc-settextcolor(rgb(255,0,0); pdc-setbkcolor(rgb(0,0,0); cfont font; - 9 - / 18- 9 - / 18 if(0=font.createpointfont(160,comic sans ms) afxmessagebox(cant create font); pdc-selectobject(&font); cstring str; if(leftnumtextout(25,10,

18、str); if(second10) str.format(00%d,second); else if(secondtextout(330,10,str); pdc-restoredc(nolddc); - 10 - / 18- 10 - / 18 计时器函数:ontimer(uint nidevent)函 数 , 同 时 也 可 以 实 现 计 时 显 示 。 添 加oncreate(lpcreatestruct lpcreatestruct)和 ontimer(uint nidevent):int cmy243view:oncreate(lpcreatestruct lpcreatestr

19、uct) if (cview:oncreate(lpcreatestruct) = -1) return -1; / todo: add your 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 default if(jieshu=1) return; / 显示个数为0 的方格leizero();/结束,返回if(seco

20、ndstart0)/计时secondstart+; if(secondstart=20)/二十次为一秒 secondstart=1; second+; crect rect3; rect3.left=325; rect3.right=375; rect3.top=10; rect3.bottom=40; invalidaterect(&rect3); /重画时间 cview:ontimer(nidevent); - 11 - / 18- 11 - / 18 开始函数:点击笑脸图标和开始键都可以重新开始。void cmy243ztyslview:onstart() settimer(1,

21、50,null); / todo: add your command handler code here second=0;/计时secondstart=0;/1时开始计时 leftnum=leinum;/剩余雷数jieshu=0;/jieshu=1时停止int aa=0; for(int i=0;im_rowcount;i+)/初始化 0 for(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(leik

22、l.shumu!=-1) leikl.shumu=-1; aa+; while(aa!=leinum); for(int a=0;am_rowcount;a+) - 12 - / 18- 12 - / 18 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&dm_colcount) if(leicd.shumu=-1) leiab.shumu+; /给方格赋值invalidate(); - 13 - / 18- 13 - / 18 3.3 系统设计结果(界面截图、操作流程)1)游戏开始界面。图 2 游戏初始界面2)我们可以点击开始游戏。图 3 点击开始游戏- 14 - / 18- 14 - / 18 3

温馨提示

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

评论

0/150

提交评论