贪吃蛇.docx
《贪吃蛇.docx》由会员分享,可在线阅读,更多相关《贪吃蛇.docx(9页珍藏版)》请在冰豆网上搜索。
贪吃蛇
计算机实习报告
姓名:
韩大牛
班级:
学号:
小班序号:
指导老师:
题目:
MFC贪吃蛇
邮箱:
MFC贪吃蛇游戏实验报告
一.功能说明
1.1总体功能说明
1、游戏类型:
休闲类、提高反应能力与灵活操作键盘能力。
2、游戏介绍:
MFC编写的小游戏,通过操作键盘上的四个方向键来控制蛇身的移动,当蛇身碰到外围墙壁时或者碰到自己身体时游戏结束,每次蛇头吃一个小食物,蛇身会增加一个小圆圈,并且在左上角会显示蛇身每个部分的坐标。
3、游戏功能说明:
(1)能够实现贪吃蛇自动向前移动:
根据时间间隔,每一次将贪吃蛇的每节身体分别向前移动一格。
移动方向为贪吃蛇当前行走方向。
(2)贪吃蛇操作:
游戏通过键盘的上下左右四个方向控制贪吃蛇当前行走方向,吃掉屏幕上出现的果实。
每吃掉一个果实,蛇身增加一节。
(3)游戏规则:
在游戏中,贪吃蛇碰到墙壁和自己的身体时,宣告游戏结束。
(4)果实的出现:
在游戏中,果实的出现,采用随机方式.当前一个果实被吃掉时,屏幕上随机出现另一个果实.果实不与蛇身重合。
4、游戏功能板块:
主要游戏界面:
体现在类CHungerSnakeView中(由窗口对象CView类继承而来,它是用户的主要操作界面,一个视图对象只关联一个文档对象;一个文档对象可以关联多个视图,每个视图对象以不同形式表示文档数据。
),实现游戏的主要功能。
按照消息序列中的消息及其处理函数,这些功能包括:
A、类的构造函数:
CHungerSnakeView:
:
CHungerSnakeView(),加载图片资源,载入坐标(字母、提示出现的坐标)变量,加载字体。
B、创建函数OnCreate:
CHungerSnakeView:
:
OnCreate,载入游戏界面,背景色改为黑色,创建一个定时器SetTimer(1,100,NULL),设置定时器时间间隔。
intCHungerSnakeView:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CView:
:
OnCreate(lpCreateStruct)==-1)
return-1;
/////////////改变窗口的属性(背景色改为黑色)/////////////////////////////////
:
:
SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));
////////////////////////////////////////////////////////////////////////////
this->SetTimer(1,100,NULL);
srand(time(0));
return0;
}
C、界面重画函数:
OnDraw(),函数对应用程序窗口的客户区进行绘图的所有代码都写在这个函数中。
D、监听键盘的上下左右键函数:
OnKeyDown,判断按键值nChar
voidCHungerSnakeView:
:
OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
{
staticUINTSAVEPRE=0;
if((SAVEPRE==VK_UP&&nChar==VK_DOWN)
||(SAVEPRE==VK_DOWN&&nChar==VK_UP)
||(SAVEPRE==VK_LEFT&&nChar==VK_RIGHT)
||(SAVEPRE==VK_RIGHT&&nChar==VK_LEFT))
{
return;
}
switch(nChar)
{
caseVK_UP:
SPEED=UP;IsKeyDown=true;break;
caseVK_DOWN:
SPEED=DOWN;IsKeyDown=true;break;
caseVK_LEFT:
SPEED=LEFT;IsKeyDown=true;break;
caseVK_RIGHT:
SPEED=RIGHT;IsKeyDown=true;break;
}
SAVEPRE=nChar;
CView:
:
OnKeyDown(nChar,nRepCnt,nFlags);
}
1)若nChar==VK_UP:
,蛇身向上移动,caseUP:
aSnake[0].y=aSnake[0].y-12;break;
2)若nChar==VK_DOWN,蛇身向下移动。
caseDOWN:
aSnake[0].y=aSnake[0].y+12;break;
3)若nChar==VK_LEFT,蛇身向左移动。
caseLEFT:
aSnake[0].x=aSnake[0].x-12;break;
4)若nChar==VK_RIGHT,蛇身向右移动。
caseRIGHT:
aSnake[0].x=aSnake[0].x+12;break;
E、定时器函数OnTimer:
,在设定的时间让蛇头坐标移动。
绘制一个游戏外围的矩形框,
CPen笔,画线CBrush刷子,填充1CFont字体,控制文字输出的字体11CBitmap位图CPalette调色板CRgn区域,指定一块区域可以用于做特殊处理。
14.CFile文件。
最重要的不外是Open(打开),Read(读入),Write(CString字符串。
封装了C中的字符数组,非常实用。
CPoint点,就是(x,y)对CRect矩形,就是(left,top,right,bottom),,创建时钟,以及打印了蛇的每个部分坐标,把蛇头的坐标保存在一个点里面,当蛇身碰到外围墙壁时候判断游戏结束,同时移除定时器voidCHungerSnakeView:
:
OnDestroy()
{
CView:
:
OnDestroy();
this->KillTimer
(1);
}
。
1.2用户界面
1、游戏开始界面:
红框为限制游戏中贪吃蛇运动的“墙”,蛇身只能在红框内运动。
红框外左上角2个纵向排列的绿色数字为游戏未开始时两节蛇身的初始坐标值。
旁边的数字记录游戏开始运行的时间。
2、游戏进行界面:
按下四个方向键中的任意一个后,蛇身开始运动,界面内随机出现果实。
玩家可通过对四个方向键的操作控制蛇头的前进方向。
随着蛇身的运动,坐标不断变化。
每吃到一个果实,蛇身增加一节,并出现其坐标,随机产生下一个果实。
3、游戏结束界面:
蛇头撞到墙壁或蛇身时,游戏结束。
显示“LostGame”。
并自动退出程序。
1.3使用方法
通过操作键盘上的四个方向键来控制蛇身的移动,当蛇身碰到外围墙壁时或者碰到自己身体时游戏结束,每次蛇头吃一个小食物,蛇身会增加一个小圆圈,并且在左上角会显示蛇身每个部分的坐标。
二.程序设计说明
2.1总体设计框架
1、程序框架说明:
2、程序说明:
程序启动后,载入游戏并初始化,同时定时器启动。
按下四个方向键中的任意一个后,蛇身开始运动,界面内随机出现果实。
根据键盘控制蛇的移动。
判断是否吃到果实,如果没吃到果实,就继续随键盘控制而移动;如果吃到一个果实,蛇身增加一节,随机生成下一个果实,并继续随键盘控制而移动。
判断蛇头坐标和自身或者墙坐标是否重合,如果不重合,就继续随键盘控制而移动;如果重合,游戏结束。
2.2关键算法描述
算法1:
游戏使用四个方向键来控制蛇的前进方向,在Onkeydown消息处理函数中,根据不同的方向键设置了成员变量m_nDirect的值。
当程序运行时,启动了定时器,游戏开始。
在定时器消息处理函数中,根据m_nDirect的值判断出蛇的下一个位置。
如果没有超出边界或碰到自身,则蛇可以移动到新位置。
如果吃到了食物,则在CArray中只插入而不删除最后一个元素,蛇身长度增加。
算法2:
当蛇移动一格时,只有蛇头和蛇尾的位置需要重绘,为此专门编写了成员函数ReDisplay来刷新一个小格。
2.3程序设计的难点和关键点
蛇身的游动:
蛇是由若干个相邻的圆圈组成的,将这些圆圈的坐标依蛇头至蛇尾的次序存入到一个数组中便代表了蛇身。
当蛇在游戏区域中“游动”一步时,所对应的数组操作应该是,将新的位置坐标插入到数组头部,同时将数组中最后一个元素删除。
使用CArray来完成这些工作,CArray的成员函数提供了需要的操作,而且比普通数组简单一些。
2.4调试的方法
调试过程中会经常出现一些逻辑错误和语法错误,经过系统提示和仔细的检查后都得到了解决。
2.5程序性能评价
运行的效果与设计相符。
界面简洁美观、运行流畅。
不足之处是没有暂停和关卡设置。
程序设计上我使用了MFC,它提供了很多工具,方便了程序的设计。
MFC还提供了许多常用的框架,减少了工作量。
不足之处是一些代码不是最简洁的。
三.心得体会
这次小学期,我在有限的时间里完成了一个程序,收获了很多。
从开始的对MFC一窍不通,到每天到图书馆借阅相关书籍自学,再到与同学们讨论着编出来第一步,然后慢慢完善自己的程序,这每个阶段我都感觉自己有着很大的进步。
这几个礼拜的小学期锻炼了我的自学与解决问题的能力,促进了我和同学们之间的关系。
在编程过程中,我遇到了很多问题。
每到这个时候我都后悔自己上学期没有打好c++编程的基础。
这些编程中遇到的艰辛,让我意识到熟练掌握知识的重要性,并立志下学期一定认真学习,为将来打好基础。
另外我对编程又有了更深一步的理解,不仅要有耐心和严谨的思维,还要有创新的能力,使自己的代码更简洁、界面更人性化。
这次编的程序中我还有可以改进的地方,比如可以考虑让游戏者有更多的选项,如自定义游戏区域的大小,设定多个目标等。
或者如果一个目标出现一定的时间后未被吃掉,则该目标就会消失并再产生一个新的目标。
也可以考虑在活动区域内再设置一些障碍物等。
这些功能在此基础上都是很容易完成的。
对这次实习的意见就是希望能得到老师的更多指导与资源。
刚开始编程的时候有点盲目,不知道从何下手。
不过这样也锻炼了我自学的能力,受益匪浅。