贪吃蛇游戏程序设计实验报告Word下载.doc
《贪吃蛇游戏程序设计实验报告Word下载.doc》由会员分享,可在线阅读,更多相关《贪吃蛇游戏程序设计实验报告Word下载.doc(11页珍藏版)》请在冰豆网上搜索。
3.3.3游戏暂停
3.3.4游戏退出
3.3.5游戏总界面
3.3.6游戏区域与背景
3.3.7关于SNAKE
3.4玩法规则设计
3.5核心设计
四、功能测试
五、总结
六、参考文献
一、题目介绍:
编写一个基于MFC的小游戏。
基本要求:
1、实现一个小游戏
2、实现基本游戏控制功能
3、具有游戏数据保存功能
4、界面布局合理、美观;
二、设计目的:
通过使用vc++6.0实现一个小游戏的课程设计,进一步掌握MFC的高级使用方法和锻炼自己动手写程序的能力。
了解游戏设计的整个过程,通过熟练使用MFC来设计游戏。
程序主要包括:
游戏界面设计,游戏菜单栏设计,游戏初始化,游戏控制等。
培养和锻炼开发游戏的能力。
三、详细设计
3.1贪吃蛇的本体设计
贪吃蛇的头部拥有一个坐标(x,y),蛇体有一个长度len,蛇有一个运动方向direct,故定义一个结构体如下:
structSnake
{
intx,y;
intlen;
intdirect;
}Snake[50];
贪吃蛇的食物有一个坐标(x,y),此食物有一个标志isfood,当isfood为0时,表示食物还没被吃,为1时,表示被吃。
structFood
intx;
inty;
intisfood;
}Food;
游戏初始蛇体长度为3,颜色为灰色,食物标志为1,因为此时没有显示出食物,需要随机生成后,才置为0;
voidCSNAKEView:
:
OnInitialUpdate()
CView:
OnInitialUpdate();
Snake[0].x=10;
Snake[0].y=10;
Snake[1].x=11;
Snake[1].y=10;
Snake[2].x=12;
Snake[2].y=10;
Snake[0].direct=3;
Snake[0].len=3;
Food.isfood=1;
//初始化贪吃蛇起初有3个节点,长度为3,起始坐标;
食物默认为1无0有
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
}
oninit()
CDC*pDC=GetDC();
CBrushDrawBrush=(RGB(100,100,100));
CBrush*Drawbrush=pDC->
SelectObject(&
DrawBrush);
for(inti=0;
i<
=Snake[0].len-1;
i++)
pDC->
Rectangle(Snake[i].x*20,Snake[i].y*20,(Snake[i].x+1)*20,(Snake[i].y+1)*20);
SelectObject(DrawBrush);
点击游戏开始菜单后,出现一个对话框,提示一秒后,将开始游戏。
OnStart()
Addyourcommandhandlercodehere
SetTimer(1,1000,NULL);
AfxMessageBox("
1秒后开始游戏!
"
);
点击游戏暂停菜单后,出现显示“已暂停游戏”的对话框。
OnPause()
KillTimer
(1);
已暂停游戏"
点击游戏退出菜单,显示“退出游戏”的对话框,随后关闭游戏界面。
OnExit()
退出游戏..."
exit(0);
3.3.5游戏总界面大小设计
使用CMainFrame的PreCreateWindow函数对总界面进行初始化。
BOOLCMainFrame:
PreCreateWindow(CREATESTRUCT&
cs)
if(!
CFrameWnd:
PreCreateWindow(cs))
returnFALSE;
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
cs.style&
=~WS_OVERLAPPED;
cs.cy=615;
cs.cx=530;
returnTRUE;
3.3.6操作游戏界面大小及背景色设计
将背景色设置为黑色,并将游戏区域显示出来。
OnDraw(CDC*pDC)
CSNAKEDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
adddrawcodefornativedatahere
CBrushbackBrush(RGB(0,0,0));
//设置画刷为希望的背景色
CBrush*pOldBrush=pDC->
backBrush);
//保存旧画刷
CRectrect;
GetClipBox(&
rect);
//擦除需要的区域
PatBlt(rect.left,rect.top,rect.Width(),rect.Height(),PATCOPY);
//用创建的画刷绘制背景区域
SelectObject(pOldBrush);
Rectangle(19,19,501,501);
//设置需要区域的起始坐标和长宽。
oninit();
3.3.7版权所有
点击帮助中的关于SNAKE,或者点击,会显示对话框---版权归刘坤炜所有。
当按键盘上的“上”“下”“左”“右”键时,蛇体方向的改变。
按“上”时,如果蛇的方向不是朝下的,就将direct方向置为1,使其向上运动,当然如果本身就是向上运动的,那么蛇的运动方向没有变化;
如果蛇的方向朝下,按上,则不能改变它的方向。
其他按法与上类似。
OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
Addyourmessagehandlercodehereand/orcalldefault
switch(nChar)
{
caseVK_UP:
if(Snake[0].direct!
=2)Snake[0].direct=1;
break;
//按上时,只要不是朝下,都将方向置为上
(1)
caseVK_DOWN:
=1)Snake[0].direct=2;
caseVK_LEFT:
=4)Snake[0].direct=3;
caseVK_RIGHT:
=3)Snake[0].direct=4;
}
OnKeyDown(nChar,nRepCnt,nFlags);
3.5游戏核心设计
当碰到白色区域的任何一边或者自己撞到自己的身体时,游戏结束,并输出自己所得分数。
根据蛇的运动方向来改变蛇的一个个身体部分坐标。
根据蛇头的坐标来判断是否吃到了食物,若吃到,将蛇的长度加1,食物的标志置为1,表示被吃,并且当食物标志为1时,随机生成下一个食物的坐标,此坐标必须要在游戏区域内,不在就循环生成,直到满足条件,并将标志置为0。
OnTimer(UINTnIDEvent)
CStringsoure;
if(Snake[0].len==2)SetTimer(1,370,NULL);
if(Snake[0].len==3)SetTimer(1,270,NULL);
if(Snake[0].len==6)SetTimer(1,200,NULL);
if(Snake[0].len==9)SetTimer(1,100,NULL);
soure.Format("
得分:
%d!
(Snake[0].len-3)*10);
//撞界判断
if(Snake[0].x*20<
=37||Snake[0].y*20<
=37||Snake[0].x*20>
=462||Snake[0].y*20>
=462)
AfxMessageBox(soure);
//s=0;
//蛇身相撞判断
if(Snake[0].len>
3)
for(intsn=Snake[0].len-1;
sn>
0;
sn--)
if(Snake[0].x*20==Snake[sn].x*20&
&
Snake[0].y*20==Snake[sn].y*20)
///////////////////////////////////////////////////////////////////////////
SelectStockObject(WHITE_PEN);
Rectangle(Snake[Snake[0].len-1].x*20,Snake[Snake[0].len-1].y*20,(Snake[Snake[0].len-1].x+1)*20,(Snake[Snake[0].len-1].y+1)*20);
for(inti=Snake[0].len-1;
i>
i--)
Snake[i].x=Snake[i-1].x;
Snake[i].y=Snake[i-1].y;
//运动方向判断
if(Snake[0].direct==1)Snake[0].y--;
if(Snake[0].direct==2)Snake[0].y++;
if(Snake[0].direct==3)Snake[0].x--;
if(Snake[0].direct==4)