VC++实现贪吃蛇的实验报告.docx
- 文档编号:514069
- 上传时间:2022-10-10
- 格式:DOCX
- 页数:17
- 大小:106.14KB
VC++实现贪吃蛇的实验报告.docx
《VC++实现贪吃蛇的实验报告.docx》由会员分享,可在线阅读,更多相关《VC++实现贪吃蛇的实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
VC++实现贪吃蛇的实验报告
VC++实现贪吃蛇的实验报告
题目:
利用VC++实现贪吃蛇小游戏
一、题目:
利用VC++实现贪吃蛇小游戏
利用VC++实现的贪吃蛇小游戏更加注重可视化。
一条蛇在封闭的围墙内,在围墙内会随机出现一个食物,通过键盘上的WSAD四个键控制它向上,下,左,右四个方向移动。
当蛇头撞到食物时表示将食物吃掉,这时蛇身增长一节,得分加一。
接着随机生成食物,等待被蛇吃掉。
如果在移动过程中撞到墙壁或者自己的身体,则游戏结束。
游戏过程中,可以在菜单中选择暂停或者结束游戏,对游戏进行暂停或者退出。
是
移动蛇(初始化向右运动)
定时器启动
根据键盘控制蛇移动方向
判断蛇是否吃到食物
否
是否
游戏结束
判断蛇头坐标和自身或者墙是否重合
随机生成下一个食物,并记录得分
是
(2)主要功能程序代码:
typedefstructSnakeNode//定义蛇结点
{
intx;//蛇每个节点的横纵坐标
inty;
}SnakeNode;
typedefstructSnake//定义蛇的身体
{
SnakeNodedata[100];//用数组来表示蛇身体的每一节
intcurr;//移动指向蛇的每一节并统计蛇的长度
}Snake;
typedefstructfood//定义食物结构体
{
intx;//食物的横坐标
inty;//食物的纵坐标
}SnakeFood;
Snakesnake;
SnakeFoodfood;
intx,y;//定义横纵坐标
intdirect;//定义方向变量
intnGameState;//定义游戏的状态
intscore;//定义分数变量
intspeed;//定义速度变量
intd;//该变量用于控制蛇身不能后退
voidInitSnake(Snake*snake);//初始化蛇
voidMoveSnake(Snake*snake);//蛇的移动
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_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CSnakeDlgmessagehandlers
voidCSnakeDlg:
:
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
}
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);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 实现 贪吃 实验 报告