贪吃蛇游戏实验报告.docx
- 文档编号:17741296
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:20
- 大小:50.94KB
贪吃蛇游戏实验报告.docx
《贪吃蛇游戏实验报告.docx》由会员分享,可在线阅读,更多相关《贪吃蛇游戏实验报告.docx(20页珍藏版)》请在冰点文库上搜索。
贪吃蛇游戏实验报告
*****************
实验报告
实验名称:
!
网络编程基础实训教程(贪吃蛇)
指导教师:
姓名:
;
学号:
班级:
提交日期:
@
1.实验目的
通过开发一款贪吃蛇游戏程序,熟练掌握C#编程语言、和面向对象程序设计方法,独立完成一个游戏程序的开发。
"
2.实验题目
使用C#编程语言,开发一款贪吃蛇游戏,如下图所示。
3.
4.功能描述
a)游戏场地是一片矩形区域的草坪。
b)一条蛇由蛇头和蛇身组成。
c)当游戏开始之后,草坪中出现一颗豆和一条蛇,并且蛇不停地移动,蛇移动方向与蛇头一致。
d)当游戏暂停之后,蛇停止移动。
e){
f)当蛇移动时,玩家使用“↑”、“↓”、“←”和“→”四个键控制蛇的移动方向。
g)当蛇头与豆的位置重合时,豆被蛇吃掉,同时在草坪中再生成一颗新的豆,蛇身增加一节。
h)当蛇头碰到蛇身时,则咬断蛇身,后半部分的蛇身消失。
i)当蛇头碰到草坪四周时,蛇立即毙命,游戏结束。
5.¥
6.需求分析
根据功能描述可知,贪吃蛇游戏的系统结构图如下所示。
定义数据字典如下:
1)|
2)草坪(Lawn):
草坪是贪吃蛇游戏的场地。
豆和蛇只能存在于草坪范围之内。
草坪具有大小和颜色等属性。
3)蛇(Snake):
在贪吃蛇游戏中,蛇由若干节组成,其中第一节是蛇头,其余是蛇身。
在游戏过程中,有且仅有一条蛇,并且蛇在不停地移动。
如果蛇吃了豆,则蛇生长一节。
如果蛇头碰到蛇身,则咬断蛇身,后半部分的蛇身消失。
如果蛇头离开草坪,则蛇死亡游戏结束。
蛇具有长度、颜色、运动方向、每一节的位置等属性。
4)豆(Bean):
在贪吃蛇游戏中,豆是蛇的食物。
在游戏过程中,有且仅有一颗豆。
如果蛇吃了豆,则重新生成一颗豆。
豆具有位置、大小和颜色等属性。
7.设计说明
:
根据需求分析可知,Snake的每一节都有位置和大小等属性。
而Bean也具有这两个属性。
抽象出二者的共同特征,抽象出一般类Block,用于描述一个块。
Block派生出Bean和SnakeBlock两个类,其中SnakeBlock类用于描述蛇的一节。
为了使游戏的运行更易于控制,定义Game类用于启动、暂停和继续游戏。
根据需求分析可知,Lawn仅包含大小和颜色两个属性。
为了减少类的数量,可将其大小和颜色等属性添加到Game类中。
综上所述,在贪吃蛇游戏中,有Block(块)、Bean(豆)、SankeBlock(节)、Snake(蛇)、Game(游戏)和MainForm(用户接口)六个类。
贪吃蛇游戏的逻辑模型如下图所示。
8.源代码
1)Block(块)类的编码
Block是用来构成Bean(豆)和Snake(蛇)的最基本的单位,是Bean和SnakeBlock的基类。
Block类的参考代码如下。
usingSystem;
—
using;
using;
namespaceWindowsFormsApplication1
{
classBlock
、
{
protectedPointorigion;rigion)
break;
}
if(i==
#
bGetAPosition=true;
}
Display(g);
}
}
>
}
3)SnakeBlock(节)类编码
SnakeBlock表示蛇的一节,是由Block派生而来的。
SnakeBlock类的参考代码如下:
usingSystem;
using;
¥
using;
namespaceWindowsFormsApplication1
{classSnakeBlock:
Block
{
·
privateboolisHead;
publicboolIsHead
{
get
{
。
returnisHead;
}
}
publicSnakeBlock(intx,inty,Color_color,bool_isHead)
{
—
origion=newPoint(x,y);
color=_color;
isHead=_isHead;
}
publicvoidChangeHeadToBody()
)
{
if(isHead)
isHead=false;
}
publicvoidDisplay(Graphicsg,Directiondirection)
《
{
(g);
if(isHead)
{
-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; } } 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); ) } 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; } } 。 } 5)Game(游戏)类编码 } Game控制游戏的运行,负责在游戏开始时生成Bean和Snake,以及负责在游戏运行中Snake的移动、Snake的生长、Bean的重生,并随时检测Snake的生死状态。 Game类的参考代码如下: usingSystem; using; using; ) namespaceHungrySanke { classGame { [ 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,int lawnHeight) { ' isSnakeAlive=true; (g,backGroundColor); (g,backGroundColor,lawnWidth,lawnHeight); (g,backGroundColor,lawnWidth,lawnHeight,snake); } 》 publicvoidOnTime(Graphicsg,ColorbackGroundColor,intlawnWidth,int lawnHeight) { if(isSnakeAlive) { ~ (g,backGroundColor); (); (g); (g); if(bean)) … { (g,backGroundColor); (bean,g,backGroundColor,lawnWidth, lawnHeight); (g); ) } intblockNum=(); if(blockNum>0) { (g,backGroundColor,blockNum); ; } if(! (lawnWidth,lawnHeight)) isSnakeAlive=false; } } | } } Form1的设计代码 ^ usingSystem; using; using; using; using; ' using; usingHungrySanke { publicpartialclassForm1: Form { { privateGamegame; publicForm1() { InitializeComponent(); game=newGame,; ( } privatevoidForm1_Load(objectsender,EventArgse) { ~ } privatevoidtimer1_Tick(objectsender,EventArgse) { if( — { Graphicsg; g=(); (g,,,; if(! … { ("GameOver"); } 》 } } privatevoidToolStrpMenuItemStart_Click(objectsender,EventArgse) … { Graphicsg; g=(); (g,,,; =true; — =true; =false; } ~ privatevoidToolStripMenuItemPause_Click(objectsender,EventArgse) { =false; =false; $ =true; } privatevoidToolStripMenuItemCONTINUE_Click(objectsender,EventArgse) { ; =true; =true; =false; } privatevoidForm1_KeyDown(objectsender,KeyEventArgse) { if==||== { switch ( { case: =; break; caseKeys.Right: — game.snake.direction=Direction.Right; break; } } else { switch) { caseKeys.Up: game.snake.direction=Direction.Up; break; caseKeys.Down: game.snake.direction=Direction.Down; break; } } } privatevoidlawn_Paint(objectsender,PaintEventArgse) { } privatevoidmenuStrip1_ItemClicked(objectsender,ToolStripItemClickedEventArgse) { } privatevoidToolStripMenuItemStart_Click(objectsender,EventArgse) { Graphicsg; g=(); (g,,,; =true; =true; =false; } privatevoidToolStripMenuItemPause_Click_1(objectsender,EventArgse) { =false; =false; =true; } privatevoidToolStripMenuItemContinue_Click_1(objectsender,EventArgse) { =true; =true; =false; } } } 9.测试报告 测试用例; 1)、Bean的生成、消除与显示 Bean在游戏开始时,能生成一颗豆且能在游戏运行中,正常显示,能在豆被蛇吃掉时,消除原先的豆,并重新生成一颗豆。 Snake的生成、显示、移动、生长与死亡 在游戏开始时,生成一条蛇并能在游戏运行中,正常显示一条蛇的运动。 蛇能在游戏运行中,根据用户的按键情况,改变蛇的移动方向。 能在蛇吃掉豆时,生长一节。 当蛇头碰到蛇尾或者蛇身的时候,后面的部分将被剪断不再显示,而且能在蛇头碰到场地边界时死亡,并结束游戏。 测试结果 当游戏运行时,游戏能正常运行!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃 游戏 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)