VC++实现贪吃蛇的实验报告_第1页
VC++实现贪吃蛇的实验报告_第2页
VC++实现贪吃蛇的实验报告_第3页
VC++实现贪吃蛇的实验报告_第4页
VC++实现贪吃蛇的实验报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

题目:利用VC++实现贪吃蛇小游戏题目:利用VC++实现贪吃蛇小游戏利用VC++实现的贪吃蛇小游戏更加注重可视化。一条蛇在封闭的围墙内,在围墙内会随机出现一个食物,通过键盘上的WSAD四个键控制它向上,下,左,右四个方向移动。当蛇头撞到食物时表示将食物吃掉,这时蛇身增长一节,得分加一。接着随机生成食物,等待被蛇吃掉。如果在移动过程中撞到墙壁或者自己的身体,则游戏结束。游戏过程中,可以在菜单中选择暂停或者结束游戏,对游戏进行暂停或者退出。编程要点(或基本思路、算法分析与说明):本次游戏设计包含两大模块,一个模块是贪吃蛇游戏本身算法的设计,完成了贪吃蛇的食物产生,获取食物,蛇的移动等功能。另一个模块是利用MFC完成贪吃蛇的可视化显示,产生了一个对话框,在对话框可以控制游戏及游戏的显示。1.贪吃蛇游戏算法设计包括:<1>果实出现的设计思路:(1)采用随机数生成果实出现坐标(2)判断当前生成的果实是否在贪吃蛇身体范围内。(3)如果在,重新生成直到不在为止。如果不在,则把坐标位置返回给调用对象。<2>贪吃蛇更新的算法设计(1)接收玩家按下的方向键消息,并保存到方向变量中。(2)定义一个时间定时器,用来控制蛇运动的速度。(3)当每次时间间隔到达时,则根据方向变量来更新贪吃蛇curr(即贪吃蛇身体)向量。(4)判断curr向量的第一个元素中的坐标数据是否碰到边界或者蛇身,如果有,则游戏结束。否则,进行下一步。(5)判断curr向量的第一个元素中的坐标数据是否与当前果实重合,如果有,表示贪吃蛇已经吃到果实。这时就向贪吃蛇curr向量添加一个元素,并重新生成一个果实。(6)吃到食物后,得分会同步增加。voidAddSnake(Snake*snake);//增加蛇的身体长度voidDrawSnake(CDC*pDC,Snakesnake);//绘制蛇voidUnDrawSnake(Snakesnake);//绘制蛇的显示框voidDrawFood(CDC*pDC,SnakeFoodf);//绘制食物intGameOver();//游戏结束//完成与对话框的数据交互voidCSnakeDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSnakeDlg) //NOTE:theClassWizardwilladdDDXandDDVcallshere //}}AFX_DATA_MAP}BEGIN_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_START,OnGameStart) ON_WM_KEYDOWN() ON_COMMAND(IDM_GAME_PAUSE_START,OnGamePauseStart) ON_COMMAND(IDM_GAME_EXIT,OnGameExit) //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CSnakeDlgmessagehandlersvoidCSnakeDlg::OnGameStart()//游戏开始函数{ //TODO:Addyourcommandhandlercodehere SetTimer(1,speed,NULL);//SetTimer一种API函数,定时器 InitSnake(&snake); nGameState=1;//游戏开始时为1}voidCSnakeDlg::OnGamePauseStart()//游戏暂停函数{ //TODO:Addyourcommandhandlercodehere CDC*pDC=GetDC(); if(nGameState==0) { if(!GameOver()) { SetTimer(1,speed,NULL); nGameState=1; } } else { if(!GameOver()) { KillTimer(1); nGameState=0; } }pDC->TextOut(70,130,"Pause!!!");}voidCSnakeDlg::OnGameExit()//游戏退出函数{ //TODO:Addyourcommandhandlercodehere AfxGetMainWnd()->SendMessage(WM_CLOSE);}//处理键盘按键消息voidCSnakeDlg::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags){ //TODO:Addyourmessagehandlercodehereand/orcalldefault switch(nChar) { case'D': if(direct!=2&&d!=2) direct=0; break; case'S': if(direct!=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; } } else { if(!GameOver()) { KillTimer(1); nGameState=0; } } } CDialog::OnKeyDown(nChar,nRepCnt,nFlags);}voidCSnakeDlg::OnPaint()//游戏界面的显示函数{ if(IsIconic()) { CPaintDCdc(this);//devicecontextforpainting SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0); //Centericoninclientrectangle intcxIcon=GetSystemMetrics(SM_CXICON);//获取系统分辨率 intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect);//获取窗口客户区的大小 intx=(rect.Width()-cxIcon+1)/2; inty=(rect.Height()-cyIcon+1)/2; //Drawtheicon dc.DrawIcon(x,y,m_hIcon); } else { CDialog::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,"左:A"); pDC->TextOut(380,170,"右:D"); pDC->TextOut(420,210,"空格暂停"); //pDC->Rectangle(10,10,210,320); UnDrawSnake(pDC,snake); DrawSnake(pDC,snake);}voidAddSnake(Snake*snake)//增加蛇身长度函数(在MoveSnake()函数中调用){ intt=1,tx,ty,xx,yy; if(snake->curr<100)snake->curr++;//控制长度蛇身长度小于100 xx=snake->data[0].x;//xx,yy记录蛇头坐标 yy=snake->data[0].y; do { tx=snake->data[t].x;//tx,ty记录蛇身第一节坐标 ty=snake->data[t].y; snake->data[t].x=xx; //蛇头坐标赋给蛇身第一节 snake->data[t].y=yy; xx=tx;//将蛇身第一节坐标赋给新的蛇头 yy=ty; t++;//蛇增加一节 }while(t<snake->curr);}voidDrawFood(CDC*pDC,SnakeFoodf)//绘制食物函数{ CStringss; pDC->SetBkColor(RGB(50,230,100)); ss.Format("得分:%d",score); pDC->TextOut(220,30,ss); pDC->Rectangle(f.x*10+11,f.y*10+11,f.x*10+18,f.y*10+18);}voidDrawSnake(CDC*pDC,Snakesnake)//绘制蛇函数{ intt; t=snake.curr-1; pDC->SelectStockObject(BLACK_BRUSH); pDC->SelectStockObject(BLACK_PEN); pDC->Rectangle(snake.data[t].x*10+11,snake.data[t].y*10+11,snake.data[t].x*10+18,snake.data[t].y*10+18); t--; pDC->SelectStockObject(HOLLOW_BRUSH); while(t>=0) { pDC->Rectangle(snake.data[t].x*10+11,snake.data[t].y*10+11,snake.data[t].x*10+18,snake.data[t].y*10+18); t--; }}intGameOver()//游戏结束函数{ intt; if(x<0||x>19||y<0||y>30)return1; t=snake.curr-2; while(t) { if(snake.data[t].x==x&&snake.data[t].y==y)return1; t--; } return0;}voidInitSnake(Snake*snake)//初始化蛇函数{ intt; direct=0;//初始方向置为0 nGameState=0;//初始化时状态变为0 score=0; speed=200;//刷新运动的时间间隔(数值越大,移动速度越慢,数值越小,移动速度越快) d=0;//控制蛇身不能后退 snake->curr=2;//初始蛇深长度(2节) x=4;//蛇的横坐标(初始值) y=4;//蛇的纵坐标 snake->data[0].x=x;//蛇头横坐标 snake->data[0].y=y;//蛇头纵坐标 food.x=rand()%20;//随机产生食物 food.y=rand()%30; switch(direct) { case0:x+=1;break;//右 case1:y+=1;break;//上 case2:x-=1;break;//左 case3:y-=1;break;//下 } snake->data[1].x=x;//蛇身第一节坐标(上一步中x坐标加1了) snake->data[1].y=y;//蛇身第一节坐标(上一步中y坐标不变) t=snake->curr-1;//此时t=1 while(t)//当蛇身长度不为0时 { if(snake->data[t].x==food.x&&snake->data[t].y==food.y) { food.x=rand()%20; food.y=rand()%31; } t--;//从最后一节依次往前判断蛇身食物的关系 }}voidMoveSnake(Snake*snake)//移动蛇函数{ intt,xx,yy; inttx,ty; switch(direct) { case0:x+=1;break;//右 case1:y+=1;break; case2:x-=1;break; case3: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->data[t].x==food.x&&snake->data[t].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; do { tx=snake->data[t].x; ty=snake->data[t].y; snake->data[t].x=xx; snake->data[t].y=yy; xx=tx; yy=ty; t--; }while(t>=0);}voidU

温馨提示

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

评论

0/150

提交评论