(完整版)mfc贪吃蛇_第1页
(完整版)mfc贪吃蛇_第2页
(完整版)mfc贪吃蛇_第3页
(完整版)mfc贪吃蛇_第4页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

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

2、 24- 2 -贪吃蛇1. 设计目的及要求1.1设计目的及问题描述贪吃蛇游戏经典,版本多样,娱乐性高,适合在闲暇时放松心神。并且可在多个平台上实现, 程序简单易懂, 非常适合 MFC初学者学习制作。 玩家通过按键上的上下左右四个键来控制蛇的方向移动,蛇头碰撞到食物则表示食物被蛇吃掉,这时蛇的身长长一节,接着出现食物,等待被蛇吃掉。在吃食物的过程中,蛇的运行速度会越来越快, 从而增加了游戏难度, 具有挑战性。如果蛇在移动过程中,撞到墙壁或者身体交叉蛇头撞到自己的身体游戏结束。在贪吃蛇这款游戏设置和开发中,一方面考察了我们大一时候所学的 C语言编程的算法运用,另一方面更是考察了我们大三这学期所学的

3、在 windows 应用程序中编程的基础知识和 MFC应用程序的基本知识, 同时考察了我们面向对象程序设计的基本思路和方法的掌握情况。1.2 设计要求设计要求使用 MFC基础类库,完成题目任选可以是小游戏、 管理系统、通信软件等。(题目需有一定规模)1 、必须用到所学的控件、对话框、菜单、消息处理、视图框架、图形等大部分知识2、创建的项目名“姓名(拼音的首字母) ”,需严格遵守,否则一定不及格。3、若该程序涉及多个窗口则每个窗口对应的类名必须“姓名(拼音的首字母)”,需严格遵守,否则一定不及格。1.3 软件、硬件环境软件环境: Visual C+ 6.0 、 Microsoft Windows

4、 7 ;硬件环境:笔记本电脑。2. 课程设计步骤1、系统用户需求贪吃蛇游戏以深入人心, 版本多样, 娱乐性高,适合大部分人在闲暇时放松心神。2、需求分析我设计的贪吃蛇游戏是基于单文档设置的, 所以在我创立 ZYT这个工程之后会由软件自动生产五个大类( CAboutDlg、 CMainFrame、 CZYTApp、 CZYTDoc、CZYTView).另外我在这款游戏设置中,我自己添加了如下几个十分重要的类:CBeanzyt: 这个类是用来对贪吃蛇游戏中食物的出现和消失以及再出现进行- 3 -设置;CGezyt:这个类是用来对贪吃蛇这款游戏中界面以及食物和蛇的设置进行编辑;CSnakezyt:

5、这个类是用来对蛇的绘制以及运动进行编辑3、游戏设置功能设计首先绘制所选课题详细的流程图, 根据游戏所要实现的过程把每一个过程的动作进行解析,并将其变成相应的变量;4、游戏功能的实现这个过程是在编程环境下实现的,通过我自己对整个程序的解析,一步一步的将各个过程实现的代码输入编程软件, 通过反复的调试和运行进行程序的检验和最终功能的实现。5、编写实验报告3. 课程设计内容3.1概要设计3.1.1程序总体框架描述开始进入游戏界面选择游戏难度YN游戏结束蛇死了?点击游戏开始按钮蛇运动速度加快一倍蛇开始运动吃豆子NY是否吃到豆Y蛇身变长, 新的豆是否吃到 5Y子?子出现,分数加个豆子100N蛇继续吃豆子

6、3.1.2程序常用类声明和变量的声明- 4 -CBeanzyt 类用来实现有关豆子的所有功能CGezyt 类用来实现游戏界面的设置以及蛇的运动环境CSnakezyt 类用来实现蛇的所有功能类型变量名CStringm_stringCSnakezytsnakeCBeanzytbeanboolm_startboolm_pauseintm_speedintm_marksintsign3.2 主要技术1、对于单文档设置界面大小功能的实现;2、对于单文档中 Menu的菜单删除、添加功能的实现;3、对设置快捷键功能的实现;4、对于 Bitmap 制做功能的实现;5、代码的熟练运用。3.3系统设计结果(界面截

7、图、操作流程)1、打开 VC+6.0,选中 MFCAppWizard(exe),选路径如图:- 5 -然后选择单文档,在高级选项中,将窗口样式厚边框和最大化边框的勾勾去掉。2、在 Menu中设置游戏快捷键, 并在 Accelerator中实现快捷功能, 最后对快捷键建立类向导- 6 -在 OnStart() 和 OnPause()函数中添加如下代码:void CZYTView:OnStart()/ TODO: Add your command handler code here this->m_start=true; SetTimer(1,200/m_speed,NULL);void C

8、ZYTView:OnPause()/ TODO: Add your command handler code here static t=1;if(t%2=1)- 7 -this->m_pause=true;elsethis->m_pause=false;t+;3、接下来新建 4个位图 BIPMAP,第一个 IDB_BITMAP_zyt1用来设置游戏背景;第二个 IDB_BITMAP_zyt2用来设置蛇的头;第三个 IDB_BITMAP_zyt3用来设置蛇的身子;第四个 IDB_BITMAP_zyt4用来设置豆。IDB_BITMAP_zyt1IDB_BITMAP_zyt2- 8 -

9、IDB_BITMAP_zyt3IDB_BITMAP_zyt4- 9 -4、OnDraw函数中将背景设置成一个个小方框,代码如下:/画背景CDC dcMemory;dcMemory.CreateCompatibleDC(pDC);CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP_zyt1);dcMemory.SelectObject(&bitmap);int i,j;for(i=0;i<=38;i+)for(j=0;j<=38;j+)pDC->StretchBlt(0+10*i,0+10*j,10,10,&dcMemory,

10、0,0,48,48,SRCCOPY);/边界线bitmap.Detach();CPen pen(PS_SOLID,1,RGB(0,0,0);CPen *pOldPen=pDC->SelectObject(&pen);pDC->MoveTo(0,390);pDC->LineTo(390,390);pDC->SelectObject(pOldPen);调整游戏界面窗口,并改名字cs.style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;cs.cx=400;-10-cs.cy=480;cs.l

11、pszName=" 周玉亭版贪吃蛇。 。一定吃到豆噢!"5、画蛇首先插入一个类CGezytclass CGezytpublic:CGezyt();virtual CGezyt();public:int i;/ 小格所在的行数;int j;/ 小格所在的列数;;6、再插入一个 CSnakezyt 类,其代码如下:class CSnakezytpublic:CSnakezyt();virtual CSnakezyt();public:int n;/ 蛇身长度CGezyt body200;/ 蛇身数组int direction;/ 蛇前进的方向, 1代表向上, 2代表向右, 3代

12、表向下, 4代表向左 public:CGezyt forwardUp();/向上前进CGezyt forwardRight();/ 向右前进-11-CGezyt forwardDown(); / 向下前进CGezyt forwardLeft(); / 向左前进;7、在 CSnakezyt 类 CSnakezyt() 构造函数中写出蛇上下左右四个运动是 body 数组是怎么变化的CGezyt CSnakezyt:forwardUp()CGezyt ret=bodyn-1;for(int i=n-1;i>=1;i-)bodyi.i=bodyi-1.i,bodyi.j=bodyi-1.j;bo

13、dy0.i-;return ret;CGezyt CSnakezyt:forwardRight()CGezyt ret=bodyn-1;for(int i=n-1;i>=1;i-)bodyi.i=bodyi-1.i,bodyi.j=bodyi-1.j;body0.j+;return ret;CGezyt CSnakezyt:forwardDown()CGezyt ret=bodyn-1;for(int i=n-1;i>=1;i-)bodyi.i=bodyi-1.i,bodyi.j=bodyi-1.j;body0.i+;return ret;CGezyt CSnakezyt:forw

14、ardLeft()-12-CGezyt ret=bodyn-1;for(int i=n-1;i>=1;i-)bodyi.i=bodyi-1.i,bodyi.j=bodyi-1.j;body0.j-;return ret;8、在构造函数 CViewZYT中初始化蛇this->m_start=false;this->m_pause=false;snake.n=4,snake.direction=2;snake.body0.i=2,snake.body0.j=5;snake.body1.i=2,snake.body1.j=4;snake.body2.i=2,snake.body2.

15、j=3;snake.body3.i=2,snake.body3.j=2;9、在 OnDraw函数中画蛇头和蛇身/ 画蛇头bitmap.LoadBitmap(IDB_BITMAP_zyt2);dcMemory.SelectObject(&bitmap);pDC->StretchBlt(0+10*snake.body0.j,0+10*snake.body0.i,10,10,&dcMemory,0,0,48,48,SRCCOPY);bitmap.Detach();/画蛇身bitmap.LoadBitmap(IDB_BITMAP_zyt3);dcMemory.SelectObje

16、ct(&bitmap);for(i=1;i<snake.n;i+)pDC->StretchBlt(0+10*snake.bodyi.j,0+10*snake.bodyi.i,10,10,&dcMemory,0,0,48,48,SRCCOPY);bitmap.Detach();10、在Onstart函数中设立一个计时器并在CylcView中添加计时函数OnTimer, 其中的代码如下:if(this->m_start=true && this->m_pause=false)-13-CGezyt tmp;CClientDC dc(this);

17、CDC dcMemory;dcMemory.CreateCompatibleDC(&dc);CBitmap bitmap;switch(snake.direction)case 1:tmp=snake.forwardUp();break;case 2:tmp=snake.forwardRight();break;case 3:tmp=snake.forwardDown();break;case 4:tmp=snake.forwardLeft();break;if( ZytGameLose( )=true)m_marks=0;m_speed=1;m_start=false;Message

18、Box(" 亲,你怎么撞上了呢?! n 要再接再厉哟! "); zytrestart();if( ZytEatBean ()=true)snake.n+;snake.bodysnake.n-1.i=tmp.i;snake.bodysnake.n-1.j=tmp.j;/ 初始化豆子unsigned seed=time(NULL);srand(seed);dobean.i=rand()%24;-14-bean.j=rand()%24;while(ZytBeanInSnake()=true);bitmap.LoadBitmap(IDB_BITMAP_zyt4);dcMemory.

19、SelectObject(&bitmap);dc.StretchBlt(0+10*bean.j,0+10*bean.i,10,10,&dcMemory,0,0,48,48,SRCCOPY);bitmap.Detach();/ 显示的得分COLORREF clr=dc.SetTextColor(dc.GetBkColor();dc.TextOut(100,400,m_string);m_marks+=100;CString m;m.Format("%d",m_marks);m_string=" 亲,您的得分是:"+m;dc.SetTextC

20、olor(clr);dc.TextOut(100,400,m_string);bitmap.LoadBitmap(IDB_BITMAP_zyt1);dcMemory.SelectObject(&bitmap);dc.StretchBlt(0+10*tmp.j,0+10*tmp.i,10,10,&dcMemory,0,0,48,48,SRCCOPY);bitmap.Detach();/画蛇头bitmap.LoadBitmap(IDB_BITMAP_zyt2);dcMemory.SelectObject(&bitmap);dc.StretchBlt(0+10*snake.b

21、ody0.j,0+10*snake.body0.i,10,10,&dcMemory,0,0,48,48,SRCCOPY);bitmap.Detach();/画蛇身bitmap.LoadBitmap(IDB_BITMAP_zyt3);dcMemory.SelectObject(&bitmap);for(int i=1;i<snake.n;i+)dc.StretchBlt(0+10*snake.bodyi.j,0+10*snake.bodyi.i,10,10,&dcMemory,0,0,48,48,SRC-15-COPY);bitmap.Detach();CView:

22、OnTimer(nIDEvent);对上面代码中加粗的添加成员函数:添加 ZytGameLose成员函数,其代码如下(撞上边框或撞上自己本身) :bool CZYTView:ZytGameLose()if(snake.body0.i=-1 | snake.body0.i=39 | snake.body0.j=-1 | snake.body0.j=39 | ZytHeadStrike ()=true)return true;elsereturn false;添加 ZytHeadStrike成员函数,其代码如下 :bool CZYTView:ZytHeadStrike()bool flag=fal

23、se;for(int i=1;i<snake.n;i+)if(snake.body0.i=snake.bodyi.i && snake.body0.j=snake.bodyi.j)flag=true;break;return flag;添加 ZytEatBean 成员函数,其代码如下 :bool CZYTView:ZytEatBean()-16-if(snake.body0.i=bean.i && snake.body0.j=bean.j)/this->m_marks+=100;return true;elsereturn false;11、为了蛇会

24、转弯移动,先添加KEYDOWN函数其代码如下:void CZYTView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)/ TODO: Add your message handler code here and/or call default if(nChar=VK_UP && snake.direction!=3)snake.direction=1;if(nChar=VK_RIGHT && snake.direction!=4)snake.direction=2;-17-if(nChar=VK_DOWN &a

25、mp;& snake.direction!=1)snake.direction=3;if(nChar=VK_LEFT && snake.direction!=2)snake.direction=4;CView:OnKeyDown(nChar, nRepCnt, nFlags);12、下面对豆建立一个类其代码如下:class CBeanzytpublic:CBeanzyt();virtual CBeanzyt();public:int i;/ 豆子所在行int j;/ 豆子所在列;13、在 CylcView 构造函数中初始化豆子/初始化豆子-18-unsigned see

26、d=time(NULL);srand(seed);dobean.i=rand()%24;bean.j=rand()%24;while( ZytBeanInSnake ()=true);对上段代码中 ZytBeanInSnake 构造成员函数,其代码如下:bool CZYTView:ZytBeanInSnake()bool flag=false;for(int i=0;i<snake.n;i+)if(bean.i=snake.bodyi.i && bean.j=snake.bodyi.j)flag=true;break;return flag;14、在 OnDraw函数中/

27、画豆子bitmap.LoadBitmap(IDB_BITMAP_zyt4);dcMemory.SelectObject(&bitmap);pDC->StretchBlt(0+10*bean.j,0+10*bean.i,10,10,&dcMemory,0,0,48,48,SRCCOPY);bitmap.Detach();15、对游戏失败之后的游戏重启zytrestart进行设置 , 代码如下:void CZYTView:zytrestart()/初始化蛇snake.n=4,snake.direction=2;snake.body0.i=2,snake.body0.j=5;s

28、nake.body1.i=2,snake.body1.j=4;snake.body2.i=2,snake.body2.j=3;snake.body3.i=2,snake.body3.j=2;/初始化豆子-19-unsigned seed=time(NULL);srand(seed);dobean.i=rand()%24;bean.j=rand()%24;while(ZytBeanInSnake()=true);Invalidate();16、在界面上显示游戏分数代码如下(吃到一个豆就加100):在 CZYTView()函数中添加如下代码:this->m_start=false;this-

29、>m_pause=false;this->m_speed=1;this->m_marks=0;CString m;m.Format("%d",m_marks);this->m_string=" 亲,您的得分是:"+m;在 OnDraw函数中添加:/显示分数pDC->TextOut(100,400,this->m_string);在 OnTimer 函数中添加:/显示的得分COLORREF clr=dc.SetTextColor(dc.GetBkColor();dc.TextOut(100,400,m_string);m

30、_marks+=100;CString m;m.Format("%d",m_marks);m_string=" 亲,您的得分是:"+m;dc.SetTextColor(clr);dc.TextOut(100,400,m_string);17、当游戏结束时分数变为0,在 zytrestart函数添加如下代码:this->m_marks=0;CString m;m.Format("%d",m_marks);this->m_string=" 您的得分是: "+m;当吃到 5 个豆以后速度加快:-20-在 On

31、Timer 函数中添加如下代码:if(m_marks%500=0 && m_marks!=0)/如果分数是 500的则速度加快m_speed+;KillTimer(1);SetTimer(1,200/m_speed,NULL);18、最后设置一下游戏的模式:在 Menu中添加:-21-建立成员函数:定义一个成员变量sign在 CZYTView()函数中给 sign 赋初值 sign=0;void CZYTView:OnLow()/ TODO: Add your command handler code here sign=1;void CZYTView:OnHigh()-22-/ TODO: Add your command handler code here sign=2;在 OnStart 函数中添加如下代码:if(sign=1)this->m_start=true;SetTimer(1,200/m_speed,NULL);if(sign=2)this->m_start=true;SetTimer(2,100/m_speed,NULL);再将 OnTimer 函数中原来的速度

温馨提示

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

评论

0/150

提交评论