




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上 题目:利用VC+实现贪吃蛇小游戏1、 题目:利用VC+实现贪吃蛇小游戏 利用VC+实现的贪吃蛇小游戏更加注重可视化。一条蛇在封闭的围墙内,在围墙内会随机出现一个食物,通过键盘上的W S A D四个键控制它向上,下,左,右四个方向移动。当蛇头撞到食物时表示将食物吃掉,这时蛇身增长一节,得分加一。接着随机生成食物,等待被蛇吃掉。如果在移动过程中撞到墙壁或者自己的身体,则游戏结束。游戏过程中,可以在菜单中选择暂停或者结束游戏,对游戏进行暂停或者退出。2、 编程要点(或基本思路、算法分析与说明):本次游戏设计包含两大模块,一个模块是贪吃蛇游戏本身算法的设计,完成了贪吃蛇的食
2、物产生,获取食物,蛇的移动等功能。另一个模块是利用MFC完成贪吃蛇的可视化显示,产生了一个对话框,在对话框可以控制游戏及游戏的显示。 1.贪吃蛇游戏算法设计包括:果实出现的设计思路: (1)采用随机数生成果实出现坐标 (2)判断当前生成的果实是否在贪吃蛇身体范围内。 (3)如果在,重新生成直到不在为止。如果不在,则把坐标位置返回给调用对象。贪吃蛇更新的算法设计 (1)接收玩家按下的方向键消息,并保存到方向变量中。 (2)定义一个时间定时器,用来控制蛇运动的速度。 (3)当每次时间间隔到达时,则根据方向变量来更新贪吃蛇curr(即贪吃蛇身体)向量。 (4)判断curr向量的第一个元素中的坐标数据
3、是否碰到边界或者蛇身,如果有,则游戏结束。否则,进行下一步。 (5)判断curr向量的第一个元素中的坐标数据是否与当前果实重合,如果有,表示贪吃蛇已经吃到果实。这时就向贪吃蛇curr向量添加一个元素,并重新生成一个果实。 (6)吃到食物后,得分会同步增加。2. 利用MFC完成贪吃蛇的可视化显示: 首先初始对话框,完成游戏的整体框架的显示。然后游戏玩家在菜单栏里选择开始,暂停,结束等,控制游戏状态。游戏开始后,玩家通过键盘上的消息控制蛇的运动。在函数DrawSnake(CDC *pDC,Snake snake),和DrawFood(CDC *pDC,SnakeFood f)完成对蛇和食物的重绘,
4、从而显示出蛇的运动和对食物的获取。在OnPaint()函数中完成得分和游戏操作提示的显示。本次游戏设计的主要功能函数如下:OnGameStart()(游戏开始函数), OnGamePauseStart()(游戏暂停函数)OnGameExit()(游戏退出函数),OnPaint()(游戏界面的显示函数),AddSnake(Snake *snake)(增加蛇身长度函数),DrawFood(CDC *pDC, SnakeFood f)(画食物函数),DrawSnake(CDC *pDC,Snake snake)(画蛇函数),MoveSnake(Snake *snake)(蛇的移动函数),InitSn
5、ake(Snake *snake)(初始化蛇函数),UnDrawSnake(Snake snake)(更新蛇函数),GameOver()(游戏结束函数)三、实现过程:(1) 流程图载入游戏并初始化 否判断游戏是否开始 是移动蛇(初始化向右运动) 定时器启动根据键盘控制蛇移动方向判断蛇是否吃到食物否 是否游戏结束判断蛇头坐标和自身或者墙是否重合随机生成下一个食物,并记录得分 是 (2) 主要功能程序代码:typedef struct SnakeNode /定义蛇结点 int x; /蛇每个节点的横纵坐标 int y;SnakeNode; typedef struct Snake /定义蛇的身体S
6、nakeNode data100; /用数组来表示蛇身体的每一节int curr; /移动指向蛇的每一节并统计蛇的长度Snake;typedef struct food /定义食物结构体int x; /食物的横坐标int y; /食物的纵坐标SnakeFood;Snake snake;SnakeFood food;int x, y; /定义横纵坐标int direct; /定义方向变量int nGameState; /定义游戏的状态int score; /定义分数变量int speed; /定义速度变量int d; /该变量用于控制蛇身不能后退void InitSnake(Snake *sna
7、ke); /初始化蛇void MoveSnake(Snake *snake); /蛇的移动void AddSnake(Snake *snake); /增加蛇的身体长度void DrawSnake(CDC *pDC , Snake snake); /绘制蛇void UnDrawSnake(Snake snake); /绘制蛇的显示框void DrawFood(CDC *pDC, SnakeFood f); /绘制食物 int GameOver(); /游戏结束/完成与对话框的数据交互 void CSnakeDlg:DoDataExchange(CDataExchange* pDX) CDialo
8、g:DoDataExchange(pDX);/AFX_DATA_MAP(CSnakeDlg)/ NOTE: the ClassWizard will add DDX and DDV calls here/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CSnakeDlg, CDialog)/AFX_MSG_MAP(CSnakeDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_COMMAND(IDM_HELP_ABOUT, OnHelpAbout)ON_WM_TIMER()ON_COMMAND(IDM_GAME_ST
9、ART, OnGameStart)ON_WM_KEYDOWN()ON_COMMAND(IDM_GAME_PAUSE_START, OnGamePauseStart)ON_COMMAND(IDM_GAME_EXIT, OnGameExit)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CSnakeDlg message handlersvoid CSnakeDlg:OnGameStart() /游戏开始函数/ TODO: Add your command handler code hereSetTimer(1,speed,NULL); /SetTimer一种API函数,定时器In
10、itSnake(&snake);nGameState=1; /游戏开始时为1void CSnakeDlg:OnGamePauseStart() /游戏暂停函数/ TODO: Add your command handler code hereCDC *pDC =GetDC();if(nGameState=0)if(!GameOver()SetTimer(1,speed,NULL);nGameState=1;elseif(!GameOver()KillTimer(1);nGameState=0; pDC-TextOut(70,130,Pause!);void CSnakeDlg:OnGameEx
11、it() /游戏退出函数/ TODO: Add your command handler code hereAfxGetMainWnd()-SendMessage(WM_CLOSE);/处理键盘按键消息void CSnakeDlg:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call defaultswitch(nChar) case D:if(direct!=2&d!=2) direct=0;break;case S: if(direct!
12、=3&d!=3)direct=1;break;case A:if(direct!=0&d!=0)direct=2;break;case W:if(direct!=1&d!=1)direct=3;break;if(nChar=VK_SPACE)if(nGameState=0)if(!GameOver()SetTimer(1,speed,NULL);nGameState=1;elseif(!GameOver()KillTimer(1);nGameState=0;CDialog:OnKeyDown(nChar, nRepCnt, nFlags);void CSnakeDlg:OnPaint() /游
13、戏界面的显示函数if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON); /获取系统分辨率 int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect); /获取窗口客户区的大小i
14、nt x = (rect.Width() - cxIcon + 1)/2 ;int y = (rect.Height() - cyIcon + 1)/2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();CDC *pDC = GetDC();pDC-SetBkColor(RGB(50,230,100); /设置游戏提示字体背景颜色pDC-TextOut(220,30,得分:0);pDC-TextOut(260,80,上:W);pDC-TextOut(300,110,下:S);pDC-TextOut(340,140,左
15、:A);pDC-TextOut(380,170,右:D);pDC-TextOut(420,210,空格暂停);/pDC-Rectangle(10,10,210,320);UnDrawSnake(pDC,snake);DrawSnake(pDC,snake);void AddSnake(Snake *snake) /增加蛇身长度函数(在MoveSnake()函数中调用)int t=1,tx,ty,xx,yy;if(snake-currcurr+; /控制长度蛇身长度小于100xx=snake-data0.x; /xx,yy记录蛇头坐标yy=snake-data0.y;dotx=snake-dat
16、at.x; /tx,ty记录蛇身第一节坐标ty=snake-datat.y;snake-datat.x=xx; /蛇头坐标赋给蛇身第一节snake-datat.y=yy;xx=tx; /将蛇身第一节坐标赋给新的蛇头yy=ty;t+; /蛇增加一节while(tcurr);void DrawFood(CDC *pDC, SnakeFood f) /绘制食物函数CString ss;pDC-SetBkColor(RGB(50,230,100);ss.Format(得分:%d,score);pDC-TextOut(220,30,ss);pDC-Rectangle(f.x*10+11,f.y*10+1
17、1,f.x*10+18,f.y*10+18);void DrawSnake(CDC *pDC,Snake snake) /绘制蛇函数int t;t=snake.curr-1;pDC-SelectStockObject(BLACK_BRUSH);pDC-SelectStockObject(BLACK_PEN);pDC-Rectangle(snake.datat.x*10+11,snake.datat.y*10+11,snake.datat.x*10+18,snake.datat.y*10+18);t-;pDC-SelectStockObject(HOLLOW_BRUSH);while(t=0)p
18、DC-Rectangle(snake.datat.x*10+11,snake.datat.y*10+11,snake.datat.x*10+18,snake.datat.y*10+18);t-;int GameOver() /游戏结束函数int t;if(x19|y30)return 1;t = snake.curr-2;while(t)if(snake.datat.x=x&snake.datat.y=y)return 1;t-;return 0; void InitSnake(Snake *snake) /初始化蛇函数int t;direct=0; /初始方向置为0nGameState=0;
19、 /初始化时状态变为0score=0; speed=200;/刷新运动的时间间隔(数值越大,移动速度越慢,数值越小,移动速度越快)d=0; /控制蛇身不能后退snake-curr=2; /初始蛇深长度(2节) x=4; /蛇的横坐标(初始值)y=4; /蛇的纵坐标snake-data0.x=x; /蛇头横坐标snake-data0.y=y; /蛇头纵坐标food.x=rand()%20; /随机产生食物food.y=rand()%30;switch(direct)case 0: x+=1;break; /右case 1: y+=1;break; /上case 2: x-=1;break; /左
20、case 3: y-=1;break; /下snake-data1.x=x; /蛇身第一节坐标(上一步中x坐标加1了)snake-data1.y=y; /蛇身第一节坐标(上一步中y坐标不变)t=snake-curr-1; /此时t=1while(t) /当蛇身长度不为0时 if(snake-datat.x=food.x&snake-datat.y=food.y) food.x=rand()%20;food.y=rand()%31;t-; /从最后一节依次往前判断蛇身食物的关系 void MoveSnake(Snake *snake) /移动蛇函数int t, xx, yy;int tx, ty
21、;switch(direct)case 0: x+=1;break; /右case 1: y+=1;break;case 2: x-=1;break;case 3: y-=1;break;if(GameOver()return;xx=x;yy=y;if(xx=food.x&yy=food.y)t=snake-curr-1;food.y=rand()%31; /随机生成数函数随机产生函数food.x=rand()%20;while(t)if(snake-datat.x=food.x&snake-datat.y=food.y)food.y=rand()%31;food.x=rand()%20;t=snake-curr-1;t-;score+=1;if(score%10)=0)speed-=20;AddSnake(snake);t=snake-curr-1;dotx=snake-datat.x;ty=snake-datat.y;snake-datat.x=xx;snake-datat.y=yy;xx=tx;yy=ty;t-;while(t=0);void UnDrawSnake(CDC *pDC, Snake sn
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年矿山无人作业技术在矿山环境监测中的应用与发展研究报告
- 乡村医生录用管理办法
- 企业科研预言管理办法
- 产品追溯标识管理办法
- 乡村规划建设管理办法
- 云南诊所备案管理办法
- 临朐农贸市场管理办法
- 人员教育培训管理办法
- 企业上市咨询管理办法
- 公司产品条码管理办法
- 环境科学与工程专业英语翻译第三版钟理
- JJF 1015-2014计量器具型式评价通用规范
- GB/T 8332-2008泡沫塑料燃烧性能试验方法水平燃烧法
- GB/T 20330-2006攻丝前钻孔用麻花钻直径
- GB/T 18033-2017无缝铜水管和铜气管
- 输血反应的发生及防治
- 湖北省仙桃市各县区乡镇行政村村庄村名居民村民委员会明细
- 中粮集团朝阳大悦城招商手册
- 钢板仓施工方案
- pcba检验标准最完整版
- 北京福赛尔V6891、V6851控制器(联动型)的调试
评论
0/150
提交评论