贪吃蛇游戏测试计划Word格式文档下载.docx
《贪吃蛇游戏测试计划Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《贪吃蛇游戏测试计划Word格式文档下载.docx(28页珍藏版)》请在冰点文库上搜索。
![贪吃蛇游戏测试计划Word格式文档下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/12/0aaf112d-6535-4a3c-94f2-122d899a3ceb/0aaf112d-6535-4a3c-94f2-122d899a3ceb1.gif)
2.2实验要求
1)对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;
可以加以其他功能或修饰,使程序更加完善、合理;
2)系统设计要实用,采用模块化程序设计方法,编程简练、可用,功能全面;
3)说明书、流程图要清楚;
4)记录设计情况(备查,也为编写设计说明书作好准备);
2.3实验环境
Windows7操作系统,VS.NET2005开发环境。
三、设计方案
3.1程序功能
1)游戏选项:
主要实现游戏的开始、暂停、退出,分别可以使用快捷键F2、空格键、F4。
2)设置:
a)游戏难度等级设置:
初级、中级、高级三个难度等级,每个难度等级又实现了三级加速,主要包括一级加速、二级加速、三级加速;
b)蛇体颜色设置:
绿色、红色、蓝色、黑色四种颜色可以选择;
c)蛇体宽度设置:
初始大小、放大两倍、放大三倍三种选择;
d)食物颜色设置:
橙色、黄色、紫色三种颜色可以选择。
3)帮助:
游戏操作说明,可以使用快捷键F3打开,主要介绍游戏的操作方法、以及版本信息、制作时间。
3.2设计思想
1)贪吃蛇的游戏规则:
蛇头不能反向移动,若反向则保持原来的运动方向不变;
不能碰到场地四周和自身,若碰到到四周墙壁或者自身,则游戏结束;
当吃到食物后,应在随机生成一个新的坐标产生食物,并且食物不能再蛇身内生成;
选择相应的游戏难度等级,当分数累加到一定程度以后,速度增加,每个等级有分为三个加速阶段。
2)游戏场地的绘制:
将panel控件设计为游戏的背景,场地、贪吃蛇以及食物都是在panel控件中完成绘制。
3)蛇身和食物的绘制:
本实验主要使用Graphics类在panel控件中绘制游戏的场地以及贪吃蛇、食物,食物模块、蛇身各模块的绘制是在单元格中进行绘制的,这样蛇身移动和食物生成过程中不需要重新绘制背景;
根据蛇身模块宽度,可以改变蛇体的大小和场地坐标图方格的大小;
根据食物类和蛇类各自的颜色变量,再通过菜单来改变其相应的颜色。
4)游戏的动态刷新控制:
使用Timer组件来实现贪吃蛇的移动,通过设置该组件的Interval属性大小来控制移动的速度。
5)蛇身移动的实现:
蛇身的移动主要是用ArrList类来实现的,该类的主要功能是使用大小可以根据需要动态增加数组,即建立动态数组来存储蛇身,本实验主要使用ArrList类的Insert方法和RemoveAt方法实现蛇模块的增加、蛇体移动的清除移动尾部。
3.3设计总体流程图
程序结构图:
程序流程图
3.4、设计的具体实现
1)游戏界面设计:
主要是使用panel1控件设计为游戏的背景,添加菜单项目,积分显示Label2,用于聚焦的TextBox1控件,菜单控件meuStrip1控件和Timer1控件,如下图所示:
2)创建一个Snake类:
a)在Snake类中定义全局变量
//设置蛇体模块大小
publicstaticintSnakeBone=10;
//设置方向
publicstaticintDirect=0;
//设置蛇体各模块的位置
publicstaticPoint[]Place={newPoint(-1,-1),newPoint(-1,-1),newPoint(-1,-1),newPoint(-1,-1),newPoint(-1,-1)};
//是否有食物,有食物为true
publicstaticboolhasFood=false;
//游戏是否结束,游戏结束为true
publicstaticboolisGame=false;
//场地的宽度、长度
publicstaticintField_with=0;
publicstaticintField_length=0;
//记录绘制贪吃蛇的控件
publicstaticControlcontrol;
//记录Time组件
publicstaticTimertimer;
//设置贪吃蛇身体颜色
publicstaticSolidBrushSolidSnake=newSolidBrush(Color.Green);
//设置背景颜色
publicstaticSolidBrushSolidBack=newSolidBrush(Color.Green);
//记录label控件
publicstaticLabellabel;
//实例化一个ArrayList数组
publicstaticArrayListList=newArrayList();
Graphicsg;
//实例化Graphics类
//实例化Food类
Foodfood=newFood();
b)定义贪吃蛇的起始位置和游戏场地初始化GamePlaceSet()函数:
主要实现蛇的初始位置,以及游戏场地的初始化。
publicvoidGamePlaceSet(Controlcon,intBone)代码具体实现见附录A的Snake类中
c)蛇的移动方法SnakeMove()函数:
主要实现蛇体的移动,每移动一次需要判定是否反向,如果反向则记录下来,原来移动方向不变,还需要判断是否游戏结束,如果没有结束则重新绘制蛇体,吃东西,绘制食物。
publicvoidSnakeMove(intN,Form1control1)代码具体实现见附录A的Snake类中
d)判断蛇是否反向方法EstimateMove()函数:
用于判断贪吃蛇的移动方向是否向相反的方向移动,如果方向移动则返回false。
publicboolEstimateMove(PointES)代码具体实现见附录A的Snake类中。
e)判断游戏是否结束GameEnd()函数:
主要实现判断蛇体是否和自身、四周墙壁是否相撞,如果相撞则游戏结束。
publicboolGameEnd(PointGE)代码具体实现见附录A的Snake类中。
f)吃东西Eatefood()函数:
主要实现贪吃蛇吃东西,没吃到一个食物,分数加5,当分数达到一定程度时候需要判断是否加速,这里主要实现蛇的三级加速,包括一级加速、二级加速、三级加速。
publicvoidEatefood(Form1control1)代码具体实现见附录A的Snake类中
3)创建一个Food类:
a)定义全局变量
//设置食物颜色
publicstaticSolidBrushSolidFood=newSolidBrush(Color.Orange);
//食物坐标的初始化
publicstaticPointFoodPoint=newPoint(-1,-1);
b)随机生成坐标方法RectPoint()函数:
用Random类随机生成随机的纵坐标和横坐标,用返回Point结构
publicPointRectPoint(Controlpon)代码具体实现见附录A的Food类中。
c)生成食物方法Buildfood()函数:
没有食物的时候需要生成食物,生成食物的位置不能和蛇体重叠,如果重叠则重新获取随机坐标。
publicvoidBuildfood(boolhasFood,Controlcon)代码具体实现见附录A的Food类中。
4)MainForm窗体功能实现
//用于设置贪吃蛇的速度
publicintspeed=350;
//用于游戏是否开始
publicstaticboolifStart=false;
//用于游戏是否暂停,游戏暂停为true
publicstaticboolpause=true;
//实例化Snake类
Snakesnake=newSnake();
Foodfood=newFood();
b)绘制游戏场景单元格的绘制:
主要实现panel1控件中单元格绘制。
publicvoidProtractTable(GraphicsG)代码具体实现见附录A的MainForm窗体的主要代码中。
c)在panel1控件里初始化游戏场地方法panel1_Paint()函数:
主要实现panel1控件中绘制蛇和食物,以及游戏的是否结束的判断。
privatevoidpanel1_Paint(objectsender,PaintEventArgse)代码具体实现见附录A的MainForm窗体的主要代码中。
d)游戏开始、暂停、退出实现:
选择开始,贪吃蛇在游戏场地运行;
暂停选项只在贪吃蛇移动可以使用,其他情况下处于无效状态;
退出选项只用当游戏处于非运行状态起作用,退出游戏并且添加了判断。
//开始
privatevoid开始F2ToolStripMenuItem_Click(objectsender,EventArgse)
//暂停
privatevoid暂停SpaceToolStripMenuItem_Click(objectsender,EventArgse)
//退出
privatevoid退出F4ToolStripMenuItem_Click(objectsender,EventArgse)
//控制游戏的开始、暂停、和退出
publicvoidNoviceControl(intn)
代码具体实现见附录A的MainForm窗体的主要代码中。
e)游戏等级实现:
主要分为初级、中级、高级三个级别,分别设置相应的刷新时间,并且限制只能在游戏结束运行和开始没有开始游戏时可以设置。
//初级
privatevoid初级ToolStripMenuItem_Click_1(objectsender,
EventArgse)
//中级
privatevoid中级ToolStripMenuItem_Click(objectsender,EventArgse)
//高级
privatevoid高级ToolStripMenuItem_Click(objectsender,EventArgse)
f)游戏键盘操作游戏键盘操作:
主要实现游戏的开始、暂停、退出,分别可以使用快捷键F2、空格键、F4,游戏操作说明用F4键打开;
贪吃蛇移动方向操作:
右移按→键或D键,左移按←键或A键,上移按↑键或W键,下移按↓键或S键。
//键盘操作设置
privatevoidForm1_KeyDown(objectsender,KeyEventArgse)代码具体实现见附录A的MainForm窗体的主要代码中。
g)蛇体颜色和食物颜色设置实现:
主要实现蛇的四种颜色设置和食物的三种颜色设置,并且限制只能在游戏结束运行和开始没有开始游戏时可以设置。
//蛇体颜色设置
privatevoid绿色ToolStripMenuItem_Click(objectsender,EventArgse)
privatevoid红色ToolStripMenuItem_Click(objectsender,EventArgse)
privatevoid蓝色ToolStripMenuItem_Click(objectsender,EventArgse)
privatevoid黑色ToolStripMenuItem_Click(objectsender,EventArgse)
//食物颜色设置
privatevoid橙色ToolStripMenuItem_Click(objectsender,EventArgse)
privatevoid黄色ToolStripMenuItem_Click(objectsender,EventArgse)
privatevoid紫色ToolStripMenuItem_Click(objectsender,EventArgse)
h)蛇体宽度放大实现:
主要实现蛇体宽度的大小蛇置,同时相应放大单元格的宽度,并且限制只能在游戏结束运行和开始没有开始游戏时可以设置。
privatevoid初始大小ToolStripMenuItem_Click(objectsender,EventArgse)
privatevoid放大两倍ToolStripMenuItem_Click(objectsender,EventArgse)
privatevoid放大三倍ToolStripMenuItem_Click(objectsender,EventArgse)
i)打开帮助:
主要是想打开游戏操作说明窗体,并且限制只能在游戏结束运行和开始没有开始游戏时可以设置。
privatevoid游戏操作说明F3ToolStripMenuItem_Click_1(objectsender,EventArgse)
j)timer1_Tick的触发事件:
主要实现在一定的时间间隔内调用SnakeMove()函数,实现蛇的动态移动。
privatevoidtimer1_Tick(objectsender,EventArgse)代码具体实现见附录A的MainForm窗体的主要代码中。
参考文献
【1】《C#高级编程(第3版)》清华大学出版社
【2】《VisualC#开发典型模块大全》人民邮电出版社出版社
附录
附录A:
主要源程序
1)创建一个Snake类的代码
classSnake
{//在snake类中第一全局变量
publicstaticintSnakeBone=10;
publicstaticPoint[]Place={newPoint(-1,-1),newPoint(-1,-1),newPoint(-1,-1),newPoint(-1,-1),newPoint(-1,-1)};
publicstaticboolhasFood=false;
//是否有食物,有食物为true
publicstaticintField_with=0;
//场地的宽度
publicstaticintField_length=0;
//场地的长度
publicstaticControlcontrol;
publicstaticTimertimer;
//记录Time组件
publicstaticSolidBrushSolidSnake=newSolidBrush(Color.Green);
publicstaticSolidBrushSolidBack=newSolidBrush(Color.Green);
publicstaticLabellabel;
publicstaticArrayListList=newArrayList();
//实例化一个ArrayList数组
//定义一个函数用于绘制贪吃蛇的起始位置,以及对游戏场地进行初始化设置
publicvoidGamePlaceSet(Controlcon,intBone)
{Field_with=con.Width;
//获取场地的宽度
Field_length=con.Height;
//获取场地的长度
SnakeBone=Bone;
//记录蛇体模块大小
control=con;
//记录背景控件
g=control.CreateGraphics();
//创建背景控件的Graphics类
SolidBack=newSolidBrush(con.BackColor);
//设置画刷颜色
for(inti=0;
i<
Place.Length;
i++)
{//设置蛇初始位置的横坐标
Place[i].X=(Place.Length-i-1)*SnakeBone;
//设置蛇初始位置的纵坐标//temp.Y
Place[i].Y=(Field_length/2)-SnakeBone;
g.FillRectangle(SolidSnake,Place[i].X+1,Place[i].Y+1,SnakeBone-1,SnakeBone-1);
//绘制蛇体
}
List=newArrayList(Place);
//记录每一个模块的位置
isGame=false;
//停止游戏
Direct=0;
//设置方向向右
//定义一个SnakeMove函数用于蛇体移动,根据蛇的位置,判断是否吃到食物,如果吃到食物,重新生成食物
publicvoidSnakeMove(intN,Form1control1)
{Pointtem_point=newPoint(-1,-1);
//定义坐标结构
switch(N)
{case0:
{tem_point.X=((Point)List[0]).X+SnakeBone;
//蛇头右移动
tem_point.Y=((Point)List[0]).Y;
break;
case1:
{tem_point.X=((Point)List[0]).X-SnakeBone;
//蛇头左移动
case2:
{tem_point.X=((Point)List[0]).X;
tem_point.Y=((Point)List[0]).Y-SnakeBone;
//蛇头上移动
case3:
tem_point.Y=((Point)List[0]).Y+SnakeBone;
//蛇头下移动
if(!
EstimateMove(tem_point))//如果没有向相反的方向移动
{Direct=N;
//改变贪吃蛇的方向
GameEnd(tem_point))//如果游戏没有结束
{ProtractSnake(tem_point);
//重新绘制蛇体
Eatefood(control1);
//吃食物
//绘制食物
g.FillRectangle(Food.SolidFood,Food.FoodPoint.X+1,Food.FoodPoint.Y+1,SnakeBone-1,SnakeBone-1);
//吃东西
publicvoidEatefood(Form1control1)
{intm,n;
//记录分数和速度
if(((Point)List[0])==Food.FoodPoint)//如果蛇头吃到了食物
{List.Add(List[List.Count-1]);
//在蛇的尾部添加蛇身
hasFood=false;
//没有食物
food.Buildfood(hasFood,control);
//生成食物
m=Convert.ToInt32(label.Text);
if(m==10)//积分为10时加速
{n=control1.speed-50;
timer.Interval=n;
label.Text=Convert.ToString(m+5);
//显示当前分数
g.DrawString("
一级加速中"
newFont("
宋体"
15,FontStyle.Bold),newSolidBrush(Color.Green),newPointF(180,30));
elseif(m==20)//积分为20时加速
{g.FillRectangle(Snake.SolidBack,0,0,control.Width,control.Height);
control1.ProtractTable(g);
二级加速中"
15,FontStyle.Bold),newSolidBrush(Color.Blue),newPointF(180,30));
n=control1.speed-100;
tim