当前位置:文档之家› 贪吃蛇小游戏实验报告[

贪吃蛇小游戏实验报告[

软件设计报告设计题目:贪吃蛇学院:专业班级:学生姓名:学生学号:指导教师:提交时间:成绩:- 0 -目录一.需求分析二.概要设计三.详细设计四.心得体会一.需求分析1.1关于题目1.1.1题目要求利用Microsoft Visual C++制作一个贪吃蛇的小游戏,要求:(1)应用MFC单文档制作(2)能够记录游戏成绩(3)可根据玩家要求设置游戏速度(级别):初级,中级,高级(4)可以根据个人喜好更换背景图片,食物图片,障碍物图片,结束图片等1.1.2选题背景贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我们,它的制作方法对于以前的我们而言都是很神秘的。

我们希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。

虽然我们的编程能力不是很强,但是我们有信心,在这次学习中我们将从实践和实际的项目中提高自己的编程能力。

因此我们选定了这个题目。

1.2关于编译软件本程序采用Microsoft Visual C++6.0的英文版本进行编译。

VisualC++6.0是Microsoft公司推出的基于Windows操作系统的可视化C++编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但由于其良好的界面和可操作性,加上支持标准C/C++规范,但仍有相当多的编程人员使用VisualC++6.0进行应用系统的开发。

- 1 -- 2 - 1.3关于兼容性本程序经过调试,可以在XP 系统下编译运行,也可以在Vista 下运行,界面稍有不同,但不影响运行结果。

二. 概要设计2.1软件主要功能设计 2.1.1程序结构根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、停止游戏,设置游戏级别(速度),设置图片等。

具体的程序结构如下面的图1-1所示。

图2-1 贪吃蛇结构图2.1.2程序流程根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程。

贪吃蛇的内容主要包括: 游戏开始,随机出现食物。

贪吃蛇游戏开始 游戏设置 游戏结束开始初级 中级 高级结束- 3 -图2-2 贪吃蛇流程图载入游戏并初始化判断是否开始蛇开始移动根据键盘控制蛇移动方向判断蛇头和食物的坐标是否重合随机生成下一个食物判断蛇头和自身及墙、毒果是否重合游戏结束设置菜单选择游戏级别判断选择级别初级 中级 高级退出否否是是是否三.详细设计3.1变量函数及资源的声明根据程序的结构,将贪吃蛇需要实现的功能细化成为相应的函数。

3.1.1函数声明主函数:void StartGame() //开始游戏void GameAreaDraw(HDC hdc) //绘制游戏空间,包括空地,水果和毒果等void SheelDraw(HDC hdc) //绘制墙,白色底平面,绘制分数板,绘制分数打印墙蛇的函数:CSnake::CSnake(int x_pos,int y_pos,int len) //蛇的构造函数int CSnake::ChangeDirect(MoveState d) //改变蛇的运动方向void CSnake::Move() //保存蛇身体各部分的形状、根据新旧状态特性取正确的状态void CSnake::AddBody(int n) //保存位置、保存蛇的状态信息、创建并初始化增长后的蛇的存储数据空间void CSnake::SetHeadPos(int x,int y) //设置蛇头的位置void CSnake::Initial() //蛇的初始化(坐标位置、运动状态、位图显示状态桌面函数:CTable::CTable() // 桌面的构造函数void CTable::InitialTable(int w,int h) //初始化桌面函数bool CTable::AddBlock(int x,int y) // 添加障碍物bool CTable::AddFood(int x,int y) // 添加食物bool CTable::ClearFood(int x,int y) // 清除食物CSnake *CTable::GetSnake() // 获得蛇int CTable::GetData(int x,int y) // 活得数据void CTable::SnakeMove() // 蛇的运动- 4 -- 5 - 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) ==- 6 -TB_STATE_SBLOCK){uGameState = GAME_STATE_END;::KillTimer(hWnd,0);}if(table.GetSnake()->IsHeadTouchBody(table.GetSnake()->GetPos()[0].x,table.GetSnake()->GetPos() [0].y) &&table.GetSnake()->GetStateArray()[0] != M_NONE){//刚开始设置为首尾在一起,故由此判断,要第二次与身体碰撞才失败uGameState = GAME_STATE_END;::KillTimer(hWnd,0);}if(table.GetData(table.GetSnake()->GetPos()[0].x,table.GetSnake()->GetPos()[0].y) == TB_STATE_BLOCK){uGameState = GAME_STATE_END;::KillTimer(hWnd,0);}DrawGame();}死亡界面- 7 -图3-4 贪吃蛇的死亡3.2.5游戏设置这里的游戏设置主要是指游戏的等级的控制。

前面在变量声明中已经看到,关于这三个量,我们已经予以了定义,只需要在按下相应键盘或鼠标消息的时候,将变量值进行改变,再利用这些值控制相应功能的运行。

}其中在构造函数CYuShuoView::CYuShuoView()中已经将m_yseffectctrl的初值设置为1。

四结果与讨论4.1程序运行程序开始运行后会进入游戏界面,但是不会立即进行游戏,单击菜单的“开始”才会开始游戏。

在游戏开始前,玩家可以根据自己的喜好,通过菜单或者工具栏设置游戏等级等。

case IDM_PRIMARY:- 8 -{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;case IDM_MIDDLE:{if(g_hTimer != 0){KillTimer(hWnd,0);}g_bStart = TRUE;g_bKey = TRUE;g_bMove = false;g_iTime = 50;g_iCount = 1;iScore = 0;g_NoFood = TRUE;g_hBlock = TRUE;StartGame();g_hTimer = SetTimer(hWnd,0,g_iTime,NULL);}break;- 9 -软件设计报告case IDM_HARD:{if(g_hTimer != 0){KillTimer(hWnd,0);}g_bStart = TRUE;g_bKey = TRUE;g_bMove = false;g_iTime = 50;g_iCount = 2;iScore = 0;g_NoFood = TRUE;g_hBlock = TRUE;StartGame();g_hTimer = SetTimer(hWnd,0,g_iTime,NULL);}break;四.心得体会错误调试与分析1.在编写代码的过程中,我们遇到了一个问题,在函数int CSnake::ChangeDirect(MoveState d)中,开始我们是把此函数写成一个空函数,但是出现了问题,但是改成了Int 返回值后,问题不再出现,原因是ChangeDirect在定义是就定义为了一个int型的,所以若在此处用空的返回值,则不匹配。

2.在链接过程中,出现了nonincremental update requires all .SBRfiles的错误提示,经上网搜索后,得到的解决方法是:将debuge文件夹删除后再重新编译链接一次,问题解决。

- 10 -。

相关主题