基于mfc的贪吃蛇程序设计(课程设计报告)_第1页
基于mfc的贪吃蛇程序设计(课程设计报告)_第2页
基于mfc的贪吃蛇程序设计(课程设计报告)_第3页
基于mfc的贪吃蛇程序设计(课程设计报告)_第4页
基于mfc的贪吃蛇程序设计(课程设计报告)_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、 西南交通大学本科毕业设计(论文) 第21页mfc应用程序设计课程设计报告题目: 学院: 专 业: 班 级: 姓名: 学 号: 指导教师: 评阅成绩:二0 年 月 日目录概述 31. 设计目的32. 功能描述33. 大体思想34. 程序框图45. 主要知识点56. 重要的mfc 57. 数据结构68. 主要函数79. 代码实现710. 运行界面1811. 总结1912. 参考文献20概述此次课程设计我利用mfc制作了一个贪吃蛇游戏,运行程序时窗口会自动最大化,游戏会根据贪吃蛇身体的长度自动增加难度,而且单机右键可以出现坐标。我还添加了bmp格式的图片作为游戏背景。1设计目的1 通过实践进一步领

2、会程序设计的特点和应用,提高运用c+ 以及面向对象知识解决实际问题的能力,初步掌握mfc变成的基本功能。2 通过实践加强对程序设计语言课程知识点的理解和掌握,培养对课程知识综合运用能力、实际分析问题能力及编程能力,养成良好的编程习惯。3 通过实践掌握用c+ 编写面向对象的实用程序的设计方法,对面向对象方法和思想增加感性的认识;学会利用c+程序设计语言编写出一些短小、可靠的windows实用程序,切实提高面向对象的程序设计能力,为后续的相关课程的学习打下基础。2功能描述1 运行程序,窗口会自动最大化,出现bmp格式图片的背景。2 点击“游戏-游戏开始”,出现围墙界面,一条蛇在密闭的围墙内,在围墙

3、内随机出现一个食物,游戏开始。3 游戏开始后,界面右下角会出现游戏规则。4 游戏开始后,界面右下角会同步游戏得分。5 通过四个方向键控制蛇的运动方向,吃掉随机出现的豆子,若不小心碰到墙壁或者与自身相交,则该轮游戏结束。6 点击“游戏-游戏暂停”,暂停游戏。7 点击“游戏-游戏继续”,继续游戏。8 游戏会根据蛇身的长度自动调节难易程度。9 点击“游戏-游戏退出”,退出游戏。10 在界面中右键单击鼠标可以显示光标的当前坐标。11 单击帮助-游戏规则查看游戏规则。3 大体思想1 定义蛇类和食物类,初始化贪吃蛇各项成员变量,包括图像的出现在屏幕的初始位置,长度,以及蛇的行走方向。食物类的定义包括出现的

4、初始位置,以及食物是否被吃掉的判断。2 用数组初始化长度为3的贪吃蛇,并且默认食物未出现3 在cview类上运用mfc提供的windows消息中wm_timer消息,运用ontimer()函数让系统提供一个时钟节拍,更新游戏4 具体游戏实现,包括蛇撞到自己和围墙都将使游戏结束,判断吃豆等,其中还包括根据蛇的长度来进行游戏难度的改变。5 具体键盘游戏操作运用到windows消息响应中的wm_keydown,用onkeydown()来响应玩家的实际操作。6 界面会自动最大化7 而且单击右键可以出现坐标8 添加了bmp格式的图片作为游戏背景。4程序框图4.1整体框架图显示文字,得分增加难度运行程序出

5、现围墙出现蛇、食物出现图片背景开始游戏单击右键显示坐标游戏控制模块退出游戏4.2游戏控制模块框架图开始游戏暂停游戏退出游戏继续游戏游戏控制模块5主要知识点1 cview类中的消息响应2 控件的消息响应3 基于cview类内的具体游戏实现4 数组5 游戏图形的实现用cdc类实现6 sdi界面窗口样式的设计7 文本的显示6重要的mfc1 cwnd:窗口,它是大多数“看得见的东西”的父类(windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图cview、框架窗口cframewnd、工具条ctoolbar、对话框cdialog、按钮cbutton,etc;一个例外是菜单(c

6、menu)不是从窗口派生的。该类很大,一开始也不必学,知道就行了。 2 cdocument文档,负责内存数据与磁盘的交互。最重要的是onopendocument(读入),onsavedocument(写盘),serialize(读写) 3 cview视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是ondraw(重画窗口),通常用cwnd:invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。你自己的许多功能都要加在里面,你打交道最多的就是它。 4 cdc设备文本。无论是显示器还是打印机,都是画图给用

7、户看。这图就抽象为cdc。cdc与其他gdi(图形设备接口)一起,完成文字和图形、图像的显示工作。把cdc想象成一张纸,每个窗口都有一个cdc相联系,负责画窗口。cdc有个常用子类cclientdc(窗口客户区),画图通常通过cclientdc完成。 5 cdialog对话框 6 cwinapp应用程序类。似于c中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。最常用函数initinstance():初始化。 7 cgdiobject及子类,用于向设备文本画图。它们都需要在使用前选进dc 8 cpen笔,画线 9 cbrush刷子,填充 10 cfont字

8、体,控制文字输出的字体 11 cbitmap位图 12 cpalette调色板 13 crgn区域,指定一块区域可以用于做特殊处理。 14 cfile文件。最重要的不外是open(打开),read(读入),write15 cstring字符串。封装了c中的字符数组,非常实用。 16 cpoint点,就是(x,y)crect矩形,就是(left,top,right,bottom) 7数据结构7.1蛇的全局变量struct snakeint x,y;int len;int direct;snake50;7.2食物的全局变量struct foodint x;int y;int isfood;food

9、;8主要函数1 void cmfcexp8_4view:ondraw(cdc* pdc)/显示背景图片2 void cmfcexp8_4view:onkeydown(uint nchar, uint nrepcnt, uint nflags)/按照用户的按键来控制蛇的移动3 void cmfcexp8_4view:onrbuttondown(uint nflags, cpoint point)/用鼠标右键屏幕,就会马上显示当前位置的坐标信息4 void cmfcexp8_4view:ontimer(uint nidevent)/根据蛇的长度来进行settimer()函数的定义,可以根据长度来进

10、行游戏难度的设定。/撞界判断/蛇身相撞判断/抹掉蛇行走的痕迹/判断吃豆的条件,撞到就吃/如果食物被吃了 就生成5 void cmfcexp8_4view:oninit()/进行贪吃蛇外观的初始化6 void cmfcexp8_4view:onstart()/开始游戏7 void cmfcexp8_4view:onpause()/游戏暂停8 void cmfcexp8_4view:oncontinue()/继续游戏9 void cmfcexp8_4view:onexit()/退出游戏10 void cmfcexp8_4view:oninitialupdate()/初始化蛇的位置11 void c

11、mfcexp8_4view:ondrawnew()/第二层白色正方形背景以及右下角的文字9代码实现9.1添加windows信息在已有工程下的“classview”中右键cview类添加以下windows信息3 wm_keydown3 wm_rbuttondown3 wm_timer右键cview类选择 “add virtual funciton”选oninitialupdate(),再者还要添加一个成员函数oninit()进行贪吃蛇外观的初始化9.2控件的设计 我们可以点击“工作空间”的“resourceview”进行控件的具体设计,设计游戏的一些控件来控制“游戏开始” “游戏结束” 和“游戏

12、暂停”。 右键其中的标题栏,点击属性,会得到一个菜单栏标题,我们建立“游戏”菜单栏标题。 点击并且在已有控件中的列表中点击属性,进行“菜单项目属性”的设置。分别建立的属性“标明”与对应的id有游戏开始idm_start游戏暂停idm_pause游戏继续idm_continue游戏退出idm_exit 成功设置id之后,分别单击右键各项属性进行消息响应处理函数的生成,具体方法操作例子如下:右键“游戏开始”点击“类向导建立”在message maps页面,在要进行消息响应的控件id列表object ids中上选择对应的id, 这里我们选择idm_start,具体实现的环境是cview类,所以我们必

13、须把“class name”的默认“cmainframe”改为“cview类”,并且在“messages”类型设置中,用“command”设置为其为命令消息。其余各项也按照同理进行设置。9.3具体实现游戏9.3.1在文件开头处分别定义蛇和食物 的全局变量/定义蛇的全局变量struct snakeint x,y;int len;int direct;snake50;/定义食物的全局变量struct foodint x;int y;int isfood;food;9.3.2初始化蛇的位置void cmfcexp8_4view:oninitialupdate() cview:oninitialupd

14、ate();snake0.x=10;/初始化起点坐标snake0.y=10;snake1.x=11;snake1.y=10;snake2.x=12;snake2.y=10;snake0.direct=3;/初始化贪吃蛇起初有3个节点,长度为3snake0.len=3;food.isfood=1;/食物默认为1无0有oninitialupdate()的功能如下:视图窗口完全建立后第一个被框架调用的函数。框架在第一次调用ondraw前会调用oninitialupdate,因此oninitialupdate是设置滚动视图的逻辑尺寸和映射模式的最合适的地方。时间上,两者先后顺序不同,构造函数生成本类的

15、对象,但没有产生窗口,oncreate后窗口产生,然后才是视图的oninitialupdate,一般在这里对视图的显示做初始化。简单点,就是oncreate只是产生view的基本结构和变量而在oninitialupdate()中,主要初始化视图中控件等。对各个变量进行初始化操作,所以我们要用这个函数来进行贪吃蛇的初始化工作。9.3.3对onkeydown()具体添加代码void cmfcexp8_4view:onkeydown(uint nchar, uint nrepcnt, uint nflags) switch(nchar)/snake0代表的是蛇头,对蛇头的方向snake0.direc

16、t进行判断case vk_up:if(snake0.direct!=2)snake0.direct=1;break;/蛇头不等于“下”的时候,才能做出“上”的操作动作,否则则忽略用户“向上”的操作按键效果case vk_down:if(snake0.direct!=1)snake0.direct=2;break;/蛇头不等于“上”的时候,才能做出“下”的操作动作,否则则忽略用户“向下”的操作按键效果case vk_left:if(snake0.direct!=4)snake0.direct=3;break;/蛇头不等于“右”的时候,才能做出“左”的操作动作,否则则忽略用户“向左”的操作按键效果

17、case vk_right:if(snake0.direct!=3)snake0.direct=4;break; /蛇头不等于“左”的时候,才能做出“右”的操作动作,否则则忽略用户“向右”的操作按键效果cview:onkeydown(nchar, nrepcnt, nflags);9.3.4对onrbuttondown()具体添加代码void cmfcexp8_4view:onrbuttondown(uint nflags, cpoint point) /这个函数功能是:用鼠标右键屏幕,就会马上显示当前位置的坐标信息cstring str;str.format(%d,%d,point.x,po

18、int.y);afxmessagebox(str);cview:onrbuttondown(nflags, point);代码说明:这个函数并不是本游戏中必要添加的函数,只是为了在后面游戏页面的设计的时候可以用鼠标右键屏幕了解大概的屏幕坐标信息,才特地做的。这个设备坐标系以用户区窗口左上角为(0 , 0)原点,x坐标向右为正,y坐标向下为正。9.3.5对oninit()具体添加代码/画一个矩形,用当前的画笔画矩形轮廓,用当前画刷进行填充cdc *pdc=getdc();cbrush drawbrush=(rgb(100,100,100);cbrush *drawbrush=pdc-select

19、object(&drawbrush);for(int i=0;irectangle(snakei.x*20,snakei.y*20,(snakei.x+1)*20,(snakei.y+1)*20);pdc-selectobject(drawbrush);代码说明:利用windows给我们提供的cdc类来进行画图,我们首先用一个指向cdc类的指针去接受与该窗口相关联的dc句柄,然后用定义画刷一个drawbrush对象,并且用rgb(100,100,100)来给画刷初始化颜色。并且用selectobject(&drawbrush);函数把对象画刷选入到设备描述表中,用for循环依次把贪吃蛇的3个节

20、点画出来。void cmfcexp8_4view:oninit()9.3.6对控件添加具体代码void cmfcexp8_4view:onstart() cmfcexp8_4view:ondrawnew();settimer(1,3000,null);/定时器。3000是3000毫秒,即3秒afxmessagebox(3秒后开始游戏!);void cmfcexp8_4view:onpause() killtimer(1);afxmessagebox(暂停游戏.);void cmfcexp8_4view:oncontinue() settimer(1,10,null);void cmfcexp8

21、_4view:onexit() afxmessagebox(退出游戏.);exit(0);代码说明:由于之前我们设定了wm_timer消息,我们能运用计时器功能。用wm_timer来设置定时器,settimer(m_hwnd,1,1000,null)是一个1秒触发一次的定时器,在mfc程序中settimer被封装在cwnd类中,调用就不用指定窗口句柄了,所以我们这里可以只去后3个参数写成settimer(1,10,null);其中1000为1秒。9.3.7对ondraw()添加具体代码,实现出现背景图片 在“resource.h”中添加“#define idb_my_bitmap 130” 在

22、“res”中添加“qiche.bmp” 在“mfcexp84.cpp”中添加“idb_my_bitmap bitmap discardable resqiche.bmp”添加以下代码:void cmfcexp8_4view:ondraw(cdc* pdc)/以res文件夹中的bmp格式图片为背景cmfcexp8_4doc* pdoc = getdocument();assert_valid(pdoc);cdc memdc;memdc.createcompatibledc(null);memdc.selectobject(pdoc-m_bitmap);pdc-bitblt(0,0,pdoc-m_

23、nwidth,pdoc-m_nheight,&memdc,0,0,srccopy);9.3.8对ondrawnew()添加具体代码 在添加代码之前,在“mfcexp8_4view.h”中添加:class cmfcexp8_4view : public cviewprotected: / create from serialization onlycmfcexp8_4view();declare_dyncreate(cmfcexp8_4view)/ attributespublic:cmfcexp8_4doc* getdocument();cclientdc* mydc;cclientdc* m

24、y2dc;/ operations 对“cclientdc* mydc”和“cclientdc* my2dc”建立类向导int cmfcexp8_4view:oncreate(lpcreatestruct lpcreatestruct) if (cview:oncreate(lpcreatestruct) = -1)return -1;/ todo: add your specialized creation code heremydc =new cclientdc(this);my2dc =new cclientdc(this);return 0; void cmfcexp8_4view:o

25、ndrawnew()rect rect;rect.left=rect.top=20;rect.right=rect.bottom =500;cbrush brush(rgb(255,255,255);mydc-fillrect (&rect,&brush);/画出第二层背景,一个白色正方形my2dc-setbkcolor(rgb(0,0,0);my2dc-settextcolor(rgb(255,255,255);my2dc-textout(750,400,单击“游戏”,选择“开始游戏”);my2dc-settextcolor(rgb(255,0,255);my2dc-textout(800,

26、430,请不要咬到自己或撞到围墙!);/在界面右下角分别出现三行背景色为黑色的彩色文本9.3.9对ontimer(uint nidevent)添加具体代码void cmfcexp8_4view:ontimer(uint nidevent) cdc *pdc=getdc();cstring soure;if(snake0.len=2)settimer(1,370,null);if(snake0.len=3)settimer(1,270,null);if(snake0.len=6)settimer(1,200,null);if(snake0.len=9)settimer(1,100,null);/

27、这段代码的作用是根据蛇的长度来进行settimer()函数的定义,可以根据长度来进行游戏难度的设定/如上代码分别370ms 270ms 200ms 100ms进行一次新的移动。soure.format(当前得分:%d!,(snake0.len-3)*10); my2dc-settextcolor(rgb(0,255,0);my2dc-textout(800,460,soure);/撞界判断if(snake0.x*20=37|snake0.y*20=462|snake0.y*20=462)killtimer(1);afxmessagebox(soure);cmfcexp8_4view:onexi

28、t();/蛇身相撞判断if(snake0.len3)for(int sn=snake0.len-1;sn0;sn-)/根据蛇长sn,进行sn次for sn-1次循环,判断蛇自己是否咬到了自己if(snake0.x*20=snakesn.x*20&snake0.y*20=snakesn.y*20)killtimer(1);/止计时器,和之前的settimer()对应afxmessagebox(soure);cmfcexp8_4view:onexit(); /pdc-selectstockobject(white_pen);/把白色的“pen”选入设备进行画图pdc-rectangle(snake

29、snake0.len-1.x*20,snakesnake0.len-1.y*20,(snakesnake0.len-1.x+1)*20,(snakesnake0.len-1.y+1)*20);/让它去画最后一个节点for(int i=snake0.len-1;i0;i-)/贪吃蛇的蛇身移动snakei.x=snakei-1.x;snakei.y=snakei-1.y;/行走方向判断if(snake0.direct=1)snake0.y-;if(snake0.direct=2)snake0.y+;if(snake0.direct=3)snake0.x-;if(snake0.direct=4)sn

30、ake0.x+;/“1234”本别代表“上下左右” x+,y+进行移动/然后用选定画刷画出一个新节点的矩形作为头结点pdc-selectstockobject(black_pen);cbrush drawbrush=(rgb(255,0,0);/控制蛇和食物的颜色cbrush *drawbrush=pdc-selectobject(&drawbrush);pdc-rectangle(snake0.x*20,snake0.y*20,(snake0.x+1)*20,(snake0.y+1)*20);pdc-selectobject(drawbrush);/判断吃豆的条件,撞到就吃if(snake0

31、.x*20=food.x*20&snake0.y*20=food.y*20)snake0.len+;food.isfood=1;snakesnake0.len-1.x=snakesnake0.len-2.x;snakesnake0.len-1.y=snakesnake0.len-2.y;/如果食物被吃了 就生成if(food.isfood=1)srand(unsigned)time(null);/当食物被吃了,指定食物在小于70 和大于430的矩形区域内出现dofor(int isfo=snake0.len-1;isfo=0;isfo-)if(snake0.x*20=snakeisfo.x*2

32、0&snake0.y*20=snakeisfo.y*20)food.x=rand()%25;food.y=rand()%25;while(food.x*2070|food.y*20430|food.y*20430);pdc-rectangle(food.x*20,food.y*20,(food.x+1)*20,(food.y+1)*20);food.isfood=0;/把食物的属性更改为“存在”cview:ontimer(nidevent);10运行界面1 运行程序后开始游戏时11总结这次课程设计,我选择用编写一个贪食蛇的程序。在编写程序之前,我只有很少的关于的程序设计知识,因此,在刚开始,我

33、遇到了很多困难。为此,我查阅了许多关于贪食蛇的资料,也在网上看了许多关于贪食蛇的算法。做好了准备之后,才开始写我的贪食蛇,并且加了很多附加功能。这次课程设计锻炼了我的动手能力。通过完成贪食蛇游戏的程序设计,累积了我的实际编程经验,也提高了我独立解决问题的能力。12参考文献1. 欧阳志宏,mfc程序设计轻松入门,人民邮电出版社,北京,2009-4-12. 姚领田,mfc窗口程序设计,水利水电出版社,北京,2007-5-13. 侯俊杰,深入浅出mfc(第2版), 华中科技大学出版社,武汉,2001-1-24.邹筝、康晓林、袁建州,visual c+6.0实用教程,电子工业出版社,北京,2008-1

34、-1 5. 任哲,mfc windows 应用程序设计,清华大学出版社,北京,2007-9-1 大 学毕业设计(论文)(页面设置:论文版心大小为155mm245mm,页边距:上2.6cm,下2.6cm,左2.5cm,右2cm,行间距20磅,装订线位置左,装订线1cm,)此处为论文题目,黑体2号字(以下各项居中列,黑体小四号)年 级: 学 号: 姓 名: 专 业: 指导老师: (填写时间要用中文)二零零八年六月 西南交通大学本科毕业设计(论文) 第v页 大学本科毕业设计(论文)院 系 专 业 年 级 姓 名 题 目 指导教师评 语 指导教师 (签章)评 阅 人评 语 评 阅 人 (签章)成 绩

35、答辩委员会主任 (签章) 年 月 日 毕 业 设 计 任 务 书班 级 学生姓名 学 号 专 业 发题日期: 年 月 日 完成日期: 年 月 日题 目 题目类型:工程设计 技术专题研究 理论研究 软硬件产品开发一、 设计任务及要求 二、 应完成的硬件或软件实验 三、 应交出的设计文件及实物(包括设计论文、程序清单或磁盘、实验装置或产品等) 四、 指导教师提供的设计资料 五、 要求学生搜集的技术资料(指出搜集资料的技术领域) 六、 设计进度安排第一部分 (4 周)第二部分 (6 周)第三部分 (2 周) 评阅及答辩 (1 周) 指导教师: 年 月 日系主任审查意见:审 批 人: 年 月 日注:设

36、计任务书审查合格后,发到学生手上。 大学学院 20xx年制摘 要正文略关键词:关键词; 关键词; 关键词; 关键词(关键词之间分号隔开,并加一个空格)abstract正文略keywords: keyword; keyword; keyword; keyword目 录摘 要ivabstractv第1章 绪 论11.1 本论文的背景和意义11.2 本论文的主要方法和研究进展11.3 本论文的主要内容11.4 本论文的结构安排1第2章 各章题序及标题小2号黑体22.1 各节点一级题序及标题小3号黑体22.1.1 各节的二级题序及标题4号黑体22.2 页眉、页脚说明22.3 段落、字体说明22.4 公

37、式、插图和插表说明2结 论5致 谢6参考文献7附 录 1 标题8附 录 2 标题9第10页 共39页大学本科毕业设计(论文) 第1章 绪 论1.1 本论文的背景和意义引用文献标示应置于所引内容最末句的右上角,用小五号字体1。当提及的参考文献为文中直接说明时,其序号应该用4号字与正文排齐,如“由文献8,1014可知”1.2 本论文的主要方法和研究进展1.3 本论文的主要内容1.4 本论文的结构安排第2章 各章题序及标题小2号黑体2.1 各节点一级题序及标题小3号黑体正文另起一段,数字与标题之间空一格2.1.1 各节的二级题序及标题4号黑体正文另起一段,数字与标题之间空一格2.1.1.1 各节的三级题序及标题小4号黑体正文另起一段,数字与标题之间空一格1. 款标题 正文接排。本行缩进2字符,标题与正文空一格(1)项标题 正文接排,本行缩进1字符,标题与正文空一格。(2)项标题 2. 款标题2.2 页眉、页脚说明在版心上边线隔一行加粗线,宽0.8mm(约2.27磅),其上居中打印页眉。页眉内容一律用“西南交通大学本科毕业设计(论文)”,字号用小四号黑体。页码置于页眉右端,采用形

温馨提示

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

评论

0/150

提交评论