贪吃蛇实训报告.docx
《贪吃蛇实训报告.docx》由会员分享,可在线阅读,更多相关《贪吃蛇实训报告.docx(21页珍藏版)》请在冰豆网上搜索。
贪吃蛇实训报告
郑州轻工业学院
实训报告
实训名称:
贪吃蛇
指导教师:
姓名:
学号:
班级:
提交日期:
一.实验目的
通过开发一款贪吃蛇游戏程序,熟练掌握C#编程语言、和面向对象程序设计方法,独立完成一个游戏程序的开发。
二.实验题目
本次实训的题目为贪吃蛇。
通过使用C#编程语言来实现。
三.功能描述
1.游戏的基本功能描述
1)游戏场地是一片矩形区域的空地构成,蛇可以在这片定义的区域中自由移动。
2)定义一个Block来构成石块,蛇头,蛇身以及豆。
蛇由蛇头和蛇身组成。
3)当游戏开始之后,定义的区域中出现一颗豆和一条蛇,并且蛇不停地移动,蛇移动的方向与蛇头的方向一致。
4)通过space或者暂停键可以使游戏停止,蛇停止移动,分数停止积分。
5)当蛇移动时,玩家可以使用“↑”、“↓”、“←”和“→”四个方向键改变蛇的移动方向。
6)当蛇头与豆的位置重合时,豆被蛇吃掉,同时在草坪中再生成一颗新的豆,蛇身增加一节。
7)当蛇头碰到石块时,蛇死亡,游戏结束。
8)当蛇头咬到蛇身时,则蛇死亡,游戏结束。
9)当蛇头碰到草坪四周时,蛇立即毙命,游戏结束。
10)游戏分为不同的级别,第一关游戏速度为200,当蛇吃五个豆子就可以过关,级别显示为2,速度增加100变为300.第二关为吃够10个豆子,速度增加50,以后以此类推。
11)游戏菜单中设有游戏帮助,玩家可以通过点击帮助了解游戏的玩法。
12)对于不是第一次玩的玩家可以改变蛇的运动速度,来增加难度。
在菜单中设有加速和减速两个键,单击可以改变速度。
13)游戏菜单中还有时间显示。
14)当游戏暂停时,可以通过“继续”键使游戏继续进行。
四.需求分析
本游戏用户可以自己练习和娱乐。
本游戏需要满足以下几点要求:
(1)利用方向键“↑、↓、←、→”来改变蛇的运行方向。
(2)空格键暂停游戏,并在随机的地方产生食物。
(3)吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。
可行性分析:
贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。
贪吃蛇的核心算法是如何实现蛇的移动和吃掉食物后如何变成新的蛇体。
没有碰到食物的时候,把当前运动方向上的下个节点入队,并以蛇节点的颜色绘制这个节点,然后把头指针所指的节点出队,并以游戏框架内部背景色重绘出队的节点,这样就可以达到移动的效果。
而在吃到食物的时候,则只需把食物入队即可。
实现贪吃蛇的基本的蛇身移动、吃到食物身体增长、和碰到墙壁或自身死亡,能够暂停和开始。
玩家可以根据自己的水平选择不同的级别进行游戏挑战。
贪吃蛇游戏中定义如下:
1)空白区域(Lawn):
定义的区域是贪吃蛇游戏的场地。
豆、石头和蛇只能存在于空白区域的范围之内。
根据个人爱好还可以添加背景,改变区域的大小和颜色。
2)蛇(Snake):
在贪吃蛇游戏中,蛇由若干节组成,其中第一节是蛇头,在蛇头上面定义两个点,作为蛇的眼睛,其余是蛇身。
在游戏过程中,有且仅有一条蛇,并且蛇在不停地移动。
如果蛇吃了豆,则蛇生长一节。
如果蛇头碰到蛇身,蛇死亡,游戏结束。
如果蛇头离开所定义的区域,则蛇死亡游戏结束。
当蛇头撞到定义的石块上的时候游戏结束。
在定义蛇的时候可以改变蛇的初始长度,也可以改变蛇的颜色和大小。
3)豆(Bean):
在贪吃蛇游戏中,豆是蛇的食物。
在游戏过程中,有且仅有一颗豆。
如果蛇吃了豆,则重新生成一颗豆。
豆的出现是随机性的。
4)石块(stone):
游戏中石块和豆是同时出现的,不同的是,豆是随机产生的,而石块是固定的,它的坐标在写代码的时候就定义好了,不能够改变。
它的大小和颜色也可以随便的改变。
5)菜单(MenuStrip):
在贪吃蛇游戏中有游戏菜单,里面有开局、暂停、继续、加速、减速、帮助等菜单。
还有Label控件,显示速度、时间、日期和积分的。
五.设计说明
Snake的每一节都有位置和大小等属性。
而Bean和stone也具有这两个属性。
抽象出这三者的共同特征,抽象出一般类Block,用于描述一个块。
Block派生出Bean和SnakeBlock两个类,其中SnakeBlock类用于描述蛇的一节。
为了使游戏的运行更易于控制,定义Game类用于启动、暂停和继续游戏。
根据需求分析可知,Lawn仅包含大小和颜色两个属性。
为了减少类的数量,可将其大小和颜色等属性添加到Game类中。
综上所述,在贪吃蛇游戏中,有Block(块)、Bean(豆)、SankeBlock(节)、Snake(蛇)、Game(游戏)和MainForm(用户接口)六个类。
游戏逻辑构思图如下:
吃到
豆
游戏的设计如下:
六.源代码
usingSystem;
using;
using;
using;
using;
using;
usingWindowsFormsApplication1
{
publicpartialclassMainForm:
Form
{
inta=200;rigion)
break;
}
if(i==
bGetAPosition=true;
}
Display(g);
f++;
}
newpublicvoidDisplay(Graphicsg)
{
SolidBrushbrush=newSolidBrush(color);
(brush,,,WIDTH,HEIGHT);
Penpen=newPen;
(pen,newRectangle,,WIDTH-1,HEIGHT-1));
}
-blocks[-2].;
inty=2*blocks[-1].-blocks[-2].;
(length,newSnakeBlock(x,y,color,false));
length++;
}
publicvoidMove()
{
intx=0;
inty=0;
blocks[0].ChangeHeadToBody();
switch(direction)
{
case:
x=blocks[0].;
y=blocks[0].-;
break;
case:
x=blocks[0].;
y=blocks[0].+;
break;
case:
x=blocks[0].-;
y=blocks[0].;
break;
case:
x=blocks[0].+;
y=blocks[0].;
break;
}
(0,newSnakeBlock(x,y,color,true));
-1);
}
publicvoidDisplay(Graphicsg)
{
for(inti=0;i{
blocks[i].Display(g,direction);
}
}
publicvoidClear(Graphicsg,ColorbackGroundColor)
{
for(inti=0;i{
blocks[i].Clear(g,backGroundColor);
}
}
publicvoidRemoveAfter(Graphicsg,ColorbackGroundColor,intblockNum)
{
for(inti=length-1;i>blockNum-1;i--)
{
blocks[i].Clear(g,backGroundColor);
(i);
length=blockNum;
}
}
石块的定义定义如下,在空白区域中定义一个位置(坐标),使之固定不动,在蛇头撞到这个坐标的时候,参数传到判断蛇生死的函数,时蛇死亡,游戏结束。
publicboolMeetStone(Pointorigion)
{
if((blocks[0].==+40)&&blocks[0].==+40))||(blocks[0].==+300)&&
blocks[0].==+80))||(blocks[0].==+150)&&blocks[0].==+200))||
(blocks[0].==+100)&&blocks[0].==+400)))
returntrue;
else
returnfalse;
}
当蛇碰到一个豆时,使豆成为蛇体的一部分,其颜色和大小跟蛇一样,蛇身增加。
publicboolCanEatBean(Beanbean)
{
if(blocks[0].Origion==
returntrue;
else
returnfalse;
}
publicintCanEatSnake()
{
for(inti=3;i<;i++)
{
if(blocks[0].Origion==blocks[i].Origion)
returni;
}
return0;
}
publicvoidEatBean(Beanbean,Graphicsg,ColorbackGroundColor,intlawnWidth,intlawnHeight)
{
(g,backGroundColor);
Grow();
(g,backGroundColor,lawnWidth,lawnHeight,this);
eatebean=true;
}
publicboolIsAlive(intlawnWidth,intlawnHeight)
{
if(blocks[0].<0)
returnfalse;
if(blocks[0].<0)
returnfalse;
if(blocks[0].+>lawnWidth)
returnfalse;
if(blocks[0].+>lawnHeight)
returnfalse;
else
returntrue;
}
}
Game控制游戏的运行,负责在游戏开始时生成Bean、Stone和Snake,以及负责在游戏运行中Snake的移动、Snake的生长、Bean的重生和石块的生产。
并随时检测Snake的生死状态。
Game类的参考代码如下:
classGame
{
Pointorigion;
publicSnakesnake;
publicBeanbean;
publicboolisSnakeAlive;
publicintlawnWidth;
publicintlawnHeight;
publicGame(int_lawnWidth,int_lawnHeight)
{
Randomrandom=newRandom();
intx=(0,_lawnWidth-1)/*;
inty=(0,_lawnHeight-1)/*;
Directiondirection=(Direction)(1,4);
snake=newSnake,direction);
bean=newBean;
isSnakeAlive=false;
lawnWidth=_lawnWidth;
lawnHeight=_lawnHeight;
}
publicvoidBegin(Graphicsg,ColorbackGroundColor,intlawnWidth,intlawnHeight)
{
isSnakeAlive=true;
(g,backGroundColor);
(g,backGroundColor,lawnWidth,lawnHeight);
(g,backGroundColor,lawnWidth,lawnHeight,snake);
游戏中石块的填充,可以根据自己制定的坐标来固定石块,可以改变其颜色。
SolidBrushbrush=newSolidBrush;
Penpen=newPen;
(brush,+40,+40,10,10);
(pen,newRectangle+40,+40,10,10));
(brush,+300,+80,10,10);
(pen,newRectangle+300,+80,10,10));
(brush,+150,+200,10,10);
(pen,newRectangle+150,+200,10,10));
(brush,+100,+400,10,10);
(pen,newRectangle+100,+400,10,10));
}
publicvoidOnTime(Graphicsg,ColorbackGroundColor,intlawnWidth,intlawnHeight)
{
if(isSnakeAlive)
{
(g,backGroundColor);
();
(g);
(g);
if(bean))
{
(g,backGroundColor);
(bean,g,backGroundColor,lawnWidth,lawnHeight);
(g);
}
intblockNum=();
if(blockNum>0)
{
(g,backGroundColor,blockNum);
isSnakeAlive=false;
("就算再饿也不能咬自己啊,死了吧!
");
}
if(!
(lawnWidth,lawnHeight)||(origion))
isSnakeAlive=false;
}
}
}
Timer组件用于在用户定义的时间间隔引发事件。
在游戏的运行过程中,通过时间函数可以判断蛇的生死,蛇吃豆子的多少。
还有日期的显示,时间的显示。
统计蛇吃豆子的多少。
当吃够规定的豆的时候,级别增加,游戏的速度增加,蛇运动速度增加。
privatevoidtimer1_Tick(objectsender,EventArgse)
{
===*10).ToString();
if==5)
{
=(1++1)%5).ToString();
=true;
=100;
=(a+100).ToString();
}
if==10)
{
=(2++1)%10).ToString();
=true;
=80;
=(a+150).ToString();
}
if==20)
{
=(3++1)%20).ToString();
=true;
=70;
=(a+200).ToString();
}
if==30)
{
=(3++1)%30).ToString();
=true;
=60;
=(a+250).ToString();
}
if==40)
{
=(3++1)%40).ToString();
=true;
=50;
=(a+300).ToString();
}
if==50)
{
("闯关成功!
");
}
判断蛇的生死
if
{
Graphicsg;
g=();
(g,,,;
if(!
{
("死翘翘!
");
=();
}
}
}
游戏的开始按钮,游戏开始,对的数据都初始化,其中有timer函数,以及级别,分数都初始化,蛇的运行速度也初始到原来的速度。
豆的统计清零。
privatevoidToolStripMenuItemStart_Click(objectsender,EventArgse)
{
Graphicsg;
g=();
(g,,,;
=true;
=true;
=false;
=0;
=200;
=();
c=;
}
privatevoidToolStripMenuItemPause_Click(objectsender,EventArgse)
{
=false;
=false;
=true;
}
privatevoidToolStripMenuItemContinue_Click(objectsender,EventArgse)
{
=true;
=true;
=false;
}
KeyDown事件。
在贪吃蛇游戏中,使用“↑”、“↓”、“←”和“→”四个方向键改变蛇的移动方向。
KeyDown事件用于在用户按键时,提供改变蛇移动方向的功能。
privatevoidMainForm_KeyDown(objectsender,KeyEventArgse)
{
if==
||==
{
switch
{
case:
=;
break;
case:
=;
break;
}
}
else
{
switch
{
case:
=;
break;
case:
=;
break;
}
}
快捷键功能,在游戏过程中,可以通过Space键使游戏暂停。
if==
{
=false;
=false;
=true;
}
}
游戏帮助按钮,当单击“帮助”时,系统会弹出一个窗口,显示游戏的玩法。
privatevoidToolStripMenuItemHelp_Click(objectsender,EventArgse)
{
=false;
=false;
=true;
("上下左右键控制蛇移动的方向,引导蛇头去吃豆子,吃一个豆子可以增加蛇的长度,\n当蛇头撞到墙壁上时,或者蛇头咬到蛇尾时,游戏结束。
");
}
游戏的减速,单击时,游戏的Interval会增加20,显示的速度会随之减少50,蛇运动速度减慢。
privatevoidToolStripMenuItemLow_Click(objectsender,EventArgse)
{
=true;
+=20;
=-50).ToString();
=false;
=true;
}
游戏的加速,单击时,游戏的Interval会减少20,显示的速度会随之增加50,蛇运动的速度加快
privatevoidToolStripMenuItemQuick_Click(objectsender,EventArgse)
{
=true;
-=20;
=+50).ToString();
=false;
=true;
七.测试报告
1)测试用例
2)测试过程
①、拟定测试计划。
根据游戏的总体情况,仔细分析游戏各个步骤的运行可能出现的状况,对各种情况进行汇总,然后拟定出一份具体测试步骤。
②、初步测试。
根据拟定好的计划进行游戏调试,出现意外情况时及时记录。
测试完后对所记录的意外情况进行分析,然后提出改进的方案,再进行修改。
③、深度测试。
对游戏进行最后的修改确认没有漏洞后再进行测试,从各个方面进行一次整体的排查,知道不再出现意料之外的情况。
3)测试结果
程序能够正常运行。
八.心得体会
通过这次课程设计,我对游戏编程有了初步认识,对游戏算法有了一定了解。
从游戏的需求分析,系统设计,再到游戏代码实现每一步都对自己是一个挑战,虽然参考了网上的一些资料,但是真的感受到游戏编程的快乐,也学习到不少东西。
不知不觉中C#已经伴我们走了半年的时间了,虽然在学习的过程中感到非常的难学,都有放弃的念头了,但是在这次的实验中我成功的完成了实验,感到有些自豪感。
也增加了我对C#的好感,我们的课本并没有学完,在大二还要继续学习,在今后的学习中,一定要努力学习这个课程。
它可以编写一个小游戏,等学的多了,一些新的游戏自己照样可以编出来,一想到自己可以编程写游戏了,就感到很自豪,所以我对未来充满了希望。