ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:922.68KB ,
资源ID:5883937      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5883937.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MFC写的贪吃蛇代码.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MFC写的贪吃蛇代码.docx

1、MFC写的贪吃蛇代码手把手教“MFC版贪吃蛇教程”写在前面的话本次贪吃蛇教程主要知识点包括以下几个方面1 CView类中的消息响应2 控件的消息响应3 基于CView类内的具体游戏实现4 数组5 游戏图形的实现用CDC类实现。本版游戏的具体实现是在CViewl类中实现,所以其他类不用添加任何代码。由于此次贪吃蛇需要MFC的开发环境,所以打开VisualC+新建一个MFC AppWizard单文档工程,随意取名一个工程名称。本次贪吃蛇基本流程与大体思想1 定义蛇类和食物类,初始化贪吃蛇各项成员变量,包括图像的出现在屏幕的初始位置,长度,以及蛇的行走方向。食物类的定义包括出现的初始位置,以及食物是

2、否被吃掉的判断。2 用数组初始化长度为3的贪吃蛇,并且默认食物未出现3 在CView类上运用MFC提供的Windows消息中WM_TIMER消息,运用OnTimer()函数让系统提供一个时钟节拍,更新游戏4 具体游戏实现,包括蛇撞到自己和围墙都将使游戏结束,判断吃豆等,其中还包括根据蛇的长度来进行游戏难度的改变。5 具体键盘游戏操作运用到Windows消息响应中的WM_KEYDOWN,用OnKeyDown()来响应玩家的实际操作。=10;Snake0.y=10;Snake1.x=11;Snake1.y=10;Snake2.x=12;Snake2.y=10;Snake0.direct=3;Sna

3、ke0.len=3;=1;irect!=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; case VK_RIGHT:if(Snake0.direct!=3)Snake0.direct=4;break; CView:OnKeyDown(nChar, nRepCnt, nFlags);CView:OnKeyDown(nChar, nRepCnt, nFlags);OnKeyDo

4、wn函数的第一个参数 UINT nChar 是接收用户键入的信息,然后我们用switch进行选择判断代码说明:Snake0代表的是蛇头,我们对蛇头的方向Snake0.direct进行判断。case VK_UP:if(Snake0.direct!=2)Snake0.direct=1;break; 意思就是当Snake0.direct的方向此时并不等于“下”的时候,才能做出“上”的操作动作,否则则忽略用户“向上”的操作按键效果Step 3 对OnRButtonDown()具体添加代码void CSNAKEView:OnRButtonDown(UINT nFlags, CPoint point)-1

5、;i+)pDC-Rectangle(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个节点画出来。void far rectangle(

6、int left, int top, int right, int bottom);这个函数的的功能根据函数功能:该函数画一个矩形,用当前的画笔画矩形轮廓,用当前画刷进行填充.Step 5 控件添加代码void CSNAKEView:OnStart().);void CSNAKEView:OnExit().);exit 0;void CSNAKEView:OnContinue()图类的输出基本上都是在视图类的OnDraw函数中处理的,系统会准备好入参,然后调用OnDraw函数本人也没有过多的去研究过次函数,仅知道一些皮毛。不过这里有个知识点那便是OnPaint()与OnDraw()的区别,On

7、Paint()派生于CWnd类,响应WM_PAINT消息。OnDraw是CView类的成员函数,并且没有消息响应功能,这就是为什么视图类没有只有OnDraw()而没有OnPaint()的原因。OnDraw()维护视图客户区(例如通过试表在视图中画图),而OnPaint()维护窗口的客户区void CSNAKEView:OnDraw(CDC* pDC)CSNAKEDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);en=2)SetTimer(1,370,NULL);if(Snake0.len=3)SetTimer(1,270,NULL);if(Snake0.

8、len=6)SetTimer(1,200,NULL);if(Snake0.len=9)SetTimer(1,100,NULL);(得分:%d!,(Snake0.len-3)*10); *20=37|Snake0.y*20=462|Snake0.y*20=462)KillTimer(1);AfxMessageBox(soure);en3)for(int sn=Snake0.len-1;sn0;sn-)if(Snake0.x*20=Snakesn.x*20&Snake0.y*20=Snakesn.y*20)KillTimer(1);AfxMessageBox(soure);en-1.x*20,Sn

9、akeSnake0.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;irect=1)Snake0.y-;if(Snake0.direct=2)Snake0.y+;if(Snake0.direct=3)Snake0.x-;if(Snake0.direct=4)Snake0.x+;pDC-SelectStockObject(BLACK_PEN);CBrush DrawBrush=

10、(RGB(100,100,100);CBrush *Drawbrush=pDC-SelectObject(&DrawBrush);pDC-Rectangle(Snake0.x*20,Snake0.y*20,(Snake0.x+1)*20,(Snake0.y+1)*20);pDC-SelectObject(DrawBrush);*20=*20&Snake0.y*20=*20)Snake0.len+;=1;SnakeSnake0.len-1.x=SnakeSnake0.len-2.x;SnakeSnake0.len-1.y=SnakeSnake0.len-2.y;en-1;isfo=0;isfo-

11、)if(Snake0.x*20=Snakeisfo.x*20&Snake0.y*20=Snakeisfo.y*20)=rand()%;=rand()%;while*2070|*20430|*20430);pDC-Rectangle*20,*20,+1)*20,+1)*20);=0;CView:OnTimer(nIDEvent);en=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

12、);此段代码的作用是根据蛇的长度来进行SetTimer()函数的定义,可以根据长度来进行游戏难度的设定,如上代码分别370ms 270ms 200ms 100ms进行一次新的移动。*20=37|Snake0.y*20=462|Snake0.y*20=462)KillTimer(1);AfxMessageBox(soure);这里为什么要乘以20呢由于我们初始化的时候是Snake0.x=10;Snake0.y=10;Snake1.x=11;Snake1.y=10;Snake2.x=12;Snake2.y=10;所以只是把贪吃蛇的起始位置“搬移”到20倍的位置 当然可以等价于Snake0.x=10

13、*20;Snake0.y=10*20;Snake1.x=11*20;Snake1.y=10*20;Snake2.x=12*20;Snake2.y=10*20;蛇的一节身体为一个矩形块,这样表示每个矩形块只需起点坐标x 和y身体是不断增长的,所以用数组存放每一节的坐标en3)for(int sn=Snake0.len-1;sn0;sn-)if(Snake0.x*20=Snakesn.x*20&Snake0.y*20=Snakesn.y*20)KillTimer(1);AfxMessageBox(soure);进行比较(之所以进行sn-1次那肯定是不包括蛇头而且蛇的长度也必须大于3才会发生自己咬自

14、己的情况)KillTimer(1);是停止计时器;和之前的SetTime()对应而已AfxMessageBox(soure);这里不深究,总之就是输出一个原样输出内容pDC-SelectStockObject(WHITE_PEN);en-1.x*20,SnakeSnake0.len-1.y*20,(SnakeSnake0.len-1.x+1)*20,(SnakeSnake0.len-1.y+1)*20);en-1;i0;i-)=Snakei-1.x;Snakei.y=Snakei-1.y;这段的知识点要严重的说明一下1 为什么要专门用白笔画最后一个呢因为我们的游戏界面是用白色的,贪吃蛇移动的时

15、候,肯定是蛇头向前走一单位,而尾部肯定要“擦除”掉一个单位,那怎么擦除呢我们只能用和背景色一样的画笔。原来蛇的位置和新蛇的位置差一个单位,所以看起来蛇会多一节身体,所以将蛇的最后一节用背景色覆盖SelectStockObject(WHITE_PEN) 让它起到“消失”最后一个节点的功能让我们以为蛇是向前走了。如 假设现在贪吃蛇有4个单位0123SnakeSnake0.len-1.x*20 SnakeSnake0.4-1.x*20 =Snake3.x*20数组3 恰好是最后一个节点的下标,别忘了数组是从0开始算的请仔细领悟2for(int i=Snake0.len-1;i0;i-)Snakei.

16、x=Snakei-1.x;Snakei.y=Snakei-1.y;进行次数为长度-1次的循环为什么要进行长度-1次呢我这里要说明一下,这里是不包括蛇头的进行的平移,用数组赋值的方法,把前一节点保存在后一个结点,然后头结点向前移动。irect=1)Snake0.y-;if(Snake0.direct=2)Snake0.y+;if(Snake0.direct=3)Snake0.x-;if(Snake0.direct=4)Snake0.x+;pDC-SelectStockObject(BLACK_PEN);CBrush DrawBrush=(RGB(100,100,100);CBrush *Draw

17、brush=pDC-SelectObject(&DrawBrush);pDC-Rectangle(Snake0.x*20,Snake0.y*20,(Snake0.x+1)*20,(Snake0.y+1)*20);pDC-SelectObject(DrawBrush);“1234”本别代表“上下左右” x+,y+进行移动,然后用选定画刷画出一个新节点的矩形作为头结点en-1;isfo=0;isfo-)if(Snake0.x*20=Snakeisfo.x*20&Snake0.y*20=Snakeisfo.y*20)=rand()%;=rand()%;while*2070|*20430|*20430);pDC-Rectangle*20,*20,+1)*20,+1)*20);=1; 这里关于srand(unsigned)time(NULL);rand()的用法 在本博客有研究帖 这里不再赘述。当食物被吃了指定食物的地方出现的地方在小于70 和大于430的矩形区域内并且把食物属性更改为 “存在”/以上就是MFC版步骤已经详细之至了,通过此次贪吃蛇我发现MFC不难,不过花了我整整一个国庆的时间,茶饭不思夜不能寐,CView类的强大我是第一次看到,以后我要多加关注CView类的知识点,写出这个文档的意义我觉得能让我的思路更加清晰,毕竟能和他人解释代码并且让别人能理解那是一件很愉快的事情。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1