贪吃蛇小游戏实验报告Word文档格式.docx
《贪吃蛇小游戏实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《贪吃蛇小游戏实验报告Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
设计题目:
贪吃蛇
目录
一.需求分析
二.概要设计
三.详细设计
四.心得体会
1.1关于题目
1.1.1题目要求
利用MicrosoftVisualC++制作一个贪吃蛇的小游戏,要求:
(1)应用MFC单文档制作
(2)能够记录游戏成绩
(3)可根据玩家要求设置游戏速度(级别):
初级,中级,高级
(4)可以根据个人喜好更换背景图片,食物图片,障碍物图片,结束图片等
1.1.2选题背景
贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我们,它的制作方法对于以前的我们而言都是很神秘的。
我们希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。
虽然我们的编程能力不是很强,但是我们有信心,在这次学习中我们将从实践和实际的项目中提高自己的编程能力。
因此我们选定了这个题目。
1.2关于编译软件
本程序采用MicrosoftVisualC++6.0的英文版本进行编译。
VisualC++6.0是Microsoft公司推出的基于Windows操作系统的可视化C++编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但由于其良好的界面和可操作性,加上支持标准C/C++规范,但仍有相当多的编程人员使用VisualC++6.0进行应用系统的开发。
1.3关于兼容性
本程序经过调试,可以在XP系统下编译运行,也可以在Vista下运行,界面稍有不同,但不影响运行结果。
2.1软件主要功能设计
2.1.1程序结构
根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、停止游戏,设置游戏级别(速度),设置图片等。
具体的程序结构如下面的图1-1所示。
图2-1贪吃蛇结构图
2.1.2程序流程
根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程。
贪吃蛇的内容主要包括:
游戏开始,随机出现食物。
图2-2贪吃蛇流程图
3.1变量函数及资源的声明
根据程序的结构,将贪吃蛇需要实现的功能细化成为相应的函数。
3.1.1函数声明
主函数:
voidStartGame()//开始游戏
voidGameAreaDraw(HDChdc)//绘制游戏空间,包括空地,水果和毒果等
voidSheelDraw(HDChdc)//绘制墙,白色底平面,绘制分数板,绘制分数打印墙
蛇的函数:
CSnake:
:
CSnake(intx_pos,inty_pos,intlen)//蛇的构造函数
intCSnake:
ChangeDirect(MoveStated)//改变蛇的运动方向
voidCSnake:
Move()//保存蛇身体各部分的形状、根据新旧状态特性取正确的状态
AddBody(intn)//保存位置、保存蛇的状态信息、创建并初始化增长后的蛇的存储数据空间
SetHeadPos(intx,inty)//设置蛇头的位置
Initial()//蛇的初始化(坐标位置、运动状态、位图显示状态
桌面函数:
CTable:
CTable()//桌面的构造函数
voidCTable:
InitialTable(intw,inth)//初始化桌面函数
boolCTable:
AddBlock(intx,inty)//添加障碍物
AddFood(intx,inty)//添加食物
ClearFood(intx,inty)//清除食物
CSnake*CTable:
GetSnake()//获得蛇
intCTable:
GetData(intx,inty)//活得数据
SnakeMove()//蛇的运动
3.2主要功能的实现
3.2.1游戏界面
贪吃蛇游戏的游戏界面包括背景图片、蛇身体的绘制、蛇移动范围的绘制等等。
其中贪吃蛇的身体用什么方法绘制,才可以使得其在游戏过程中可以实现“吃”的功能是很重要的。
因此在游戏界面的初始绘制时就必须考虑到游戏时可能遇到的问题。
导入位图以及菜单工具条后,游戏开始一段时间后(XP系统下)的界面显示如图3-1所示
图3-1游戏初始界面显示
3.2.2初始化食物
确定用点数组存储贪吃蛇以后,贪吃蛇的食物如何达到随机出现,并且能够按照网格式与蛇头无偏差相接就是一个亟待解决的问题。
随机出现应采用rand()函数来实现,而食物与蛇头无偏差相接则利用坐标来解决。
再由食物坐标(X,Y)与蛇头坐标是否相同判断蛇是否“吃”到了食物。
在下面的图3-2中,我们可以看到,蛇的身体是与出现的食物在一条直线上的,完全可以达到相接的目的。
图3-2蛇与食物的相接
3.2.3开始游戏
开始游戏后的重点是如何用键盘来控制蛇的移动并传递到函数中去以及判断蛇是否死亡。
如图3-3所示。
(1)左
(2)下(3)右(4)上
图3-3键盘的上下左右键的效果
其次来解释一下如何判断蛇的死亡,由于蛇的身体是由点坐标数组构成的,因此判断蛇是否死亡其本质就是判断蛇头的坐标是否与游戏边框相同或者蛇头坐标是否与蛇自己的身体相同。
if(table.GetData(table.GetSnake()->
GetPos()[0].x,table.GetSnake()->
GetPos()[0].y)==TB_STATE_SBLOCK)
{
uGameState=GAME_STATE_END;
:
KillTimer(hWnd,0);
}
if(table.GetSnake()->
IsHeadTouchBody(table.GetSnake()->
GetPos()[0].y)&
&
table.GetSnake()->
GetStateArray()[0]!
=M_NONE)
//刚开始设置为首尾在一起,故由此判断,要第二次与身体碰撞才失败
if(table.GetData(table.GetSnake()->
GetPos()[0].y)==TB_STATE_BLOCK)
DrawGame();
}
死亡界面
图3-4贪吃蛇的死亡
3.2.5游戏设置
这里的游戏设置主要是指游戏的等级的控制。
前面在变量声明中已经看到,关于这三个量,我们已经予以了定义,只需要在按下相应键盘或鼠标消息的时候,将变量值进行改变,再利用这些值控制相应功能的运行。
}
其中在构造函数CYuShuoView:
CYuShuoView()中已经将m_yseffectctrl的初值设置为1。
四结果与讨论
4.1程序运行
程序开始运行后会进入游戏界面,但是不会立即进行游戏,单击菜单的“开始”才会开始游戏。
在游戏开始前,玩家可以根据自己的喜好,通过菜单或者工具栏设置游戏等级等。
caseIDM_PRIMARY:
{
if(g_hTimer!
=0)
{
KillTimer(hWnd,0);
}
g_bStart=TRUE;
g_bKey=TRUE;
g_bMove=false;
g_iTime=100;
g_iCount=1;
iScore=0;
g_NoFood=TRUE;
g_hBlock=TRUE;
StartGame();
g_hTimer=SetTimer(hWnd,0,g_iTime,NULL);
}
break;
caseIDM_MIDDLE:
KillTimer(hWnd,0);
g_iTime=50;
caseIDM_HARD:
g_iCount=2;
四.心得体会
错误调试与分析
1.在编写代码的过程中,我们遇到了一个问题,在函数intCSnake:
ChangeDirect(MoveStated)中,开始我们是把此函数写成一个空函数,但是出现了问题,但是改成了Int返回值后,问题不再出现,原因是ChangeDirect在定义是就定义为了一个int型的,所以若在此处用空的返回值,则不匹配。
2.在链接过程中,出现了nonincrementalupdaterequiresall.SBRfiles的错误提示,经上网搜索后,得到的解决方法是:
将debuge文件夹删除后再重新编译链接一次,问题解决。