贪吃蛇实训报告.docx

上传人:b****1 文档编号:3523407 上传时间:2023-05-06 格式:DOCX 页数:30 大小:100.72KB
下载 相关 举报
贪吃蛇实训报告.docx_第1页
第1页 / 共30页
贪吃蛇实训报告.docx_第2页
第2页 / 共30页
贪吃蛇实训报告.docx_第3页
第3页 / 共30页
贪吃蛇实训报告.docx_第4页
第4页 / 共30页
贪吃蛇实训报告.docx_第5页
第5页 / 共30页
贪吃蛇实训报告.docx_第6页
第6页 / 共30页
贪吃蛇实训报告.docx_第7页
第7页 / 共30页
贪吃蛇实训报告.docx_第8页
第8页 / 共30页
贪吃蛇实训报告.docx_第9页
第9页 / 共30页
贪吃蛇实训报告.docx_第10页
第10页 / 共30页
贪吃蛇实训报告.docx_第11页
第11页 / 共30页
贪吃蛇实训报告.docx_第12页
第12页 / 共30页
贪吃蛇实训报告.docx_第13页
第13页 / 共30页
贪吃蛇实训报告.docx_第14页
第14页 / 共30页
贪吃蛇实训报告.docx_第15页
第15页 / 共30页
贪吃蛇实训报告.docx_第16页
第16页 / 共30页
贪吃蛇实训报告.docx_第17页
第17页 / 共30页
贪吃蛇实训报告.docx_第18页
第18页 / 共30页
贪吃蛇实训报告.docx_第19页
第19页 / 共30页
贪吃蛇实训报告.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

贪吃蛇实训报告.docx

《贪吃蛇实训报告.docx》由会员分享,可在线阅读,更多相关《贪吃蛇实训报告.docx(30页珍藏版)》请在冰点文库上搜索。

贪吃蛇实训报告.docx

贪吃蛇实训报告

 

郑州轻工业学院

实训报告

 

实训名称:

贪吃蛇

指导教师:

学号:

班级:

提交日期:

一.实验目的

通过开发一款贪吃蛇游戏程序,熟练掌握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;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Drawing;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Windows.Forms;

namespaceWindowsFormsApplication1

{

publicpartialclassMainForm:

Form

{

inta=200;//定义初速度为200

privateGamegame;//

DateTimec;

publicMainForm()

{

InitializeComponent();

game=newGame(lawn.Width,lawn.Height);

timer1.Enabled=true;

timer1.Interval=a;

timer1.Enabled=false;

Velocity.Text=a.ToString();

}

Block是用来构成Bean(豆)和Snake(蛇)还有Stone(石块)的最基本的单位,是Bean和SnakeBlock的基类。

Block类的参考代码如下。

classBlock

{

protectedPointorigion;//Block的左上顶点

publicconstintWIDTH=10;//Block的宽度

publicconstintHEIGHT=10;//Block的高度

protectedColorcolor;//Block的颜色

publicBlock()

{

origion=newPoint(0,0);

color=newColor();

}

publicBlock(intx,inty,Color_color)

{

origion=newPoint(x,y);

color=_color;

}

publicPointOrigion

{

get

{

returnorigion;

}

}

publicvoidDisplay(Graphicsg)

{

SolidBrushbrush=newSolidBrush(color);

g.FillRectangle(brush,origion.X,origion.Y,WIDTH,HEIGHT);

Penpen=newPen(Color.Black);

g.DrawRectangle(pen,newRectangle(origion.X,origion.Y,WIDTH-1,HEIGHT-1));

}

publicvoidClear(Graphicsg,ColorbackGroundColor)

{

SolidBrushbrush=newSolidBrush(backGroundColor);

g.FillRectangle(brush,origion.X,origion.Y,WIDTH,HEIGHT);

}

}

这是对豆的定义,是由Block派生而来的,在系统开始时,使豆产生,它的出现位置为随机生成。

其代码如下:

classBean:

Block

{

publicstaticintf=0;//吃到豆子的个数

publicBean(Color_color)

{

origion=newPoint(0,0);

color=_color;

}

publicvoidCreat(Graphicsg,ColorbackGroundColor,intlawnWidth,intlawnHeight,Snakesnake)

{

Clear(g,backGroundColor);

boolbGetAPosition=false;//是否找到生成豆的位置

Randomrandom=newRandom();

while(!

bGetAPosition)

{

origion.X=random.Next(0,lawnWidth-1)/WIDTH*WIDTH;

origion.Y=random.Next(0,lawnHeight-1)/HEIGHT*HEIGHT;

inti;

for(i=0;i

{

if(origion==snake.blocks[i].Origion)

break;

}

if(i==snake.Length)

bGetAPosition=true;

}

Display(g);

f++;

}

newpublicvoidDisplay(Graphicsg)

{

SolidBrushbrush=newSolidBrush(color);

g.FillRectangle(brush,origion.X,origion.Y,WIDTH,HEIGHT);

Penpen=newPen(Color.Black);

g.DrawRectangle(pen,newRectangle(origion.X,origion.Y,WIDTH-1,HEIGHT-1));

}

//Display(g);

}

SnakeBlock表示蛇的一节,是由Block派生而来的。

它组成蛇身,其代码如下所示:

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)

{

base.Display(g);

if(isHead)

{

//绘制蛇眼

SolidBrushbrush=newSolidBrush(Color.Black);

switch(direction)

{

caseDirection.Up:

caseDirection.Down:

g.FillRectangle(brush,origion.X+WIDTH/4,origion.Y+HEIGHT/2,2,2);

g.FillRectangle(brush,origion.X+WIDTH/4*3,origion.Y+HEIGHT/2,2,2);

break;

caseDirection.Left:

caseDirection.Right:

g.FillRectangle(brush,origion.X+WIDTH/2,origion.Y+HEIGHT/4,2,2);

g.FillRectangle(brush,origion.X+WIDTH/2,origion.Y+HEIGHT/4*3,2,2);

break;

}

}

}

}

控制蛇头运动的方向

publicenumDirection

{

Up,

Down,

Left,

Right

};

对蛇的编码也是由Block派生而来的,在这里面可以定义蛇的颜色和长度。

classSnake

{

publicstaticbooleatebean;

privateintlength;

publicDirectiondirection;

privateColorcolor;

publicListblocks;

privateconstintINIT_LENGTH=10;

publicintLength

{

get

{

returnlength;

}

}

publicSnake(Color_color,Direction_direction)

{

direction=_direction;

color=_color;

blocks=newList();

}

publicvoidCreat(Graphicsg,ColorbackGroundColor,intlawnWidth,intlawnHeight)

{

Clear(g,backGroundColor);

blocks.Clear();

length=INIT_LENGTH;

intx;

inty;

Randomrandom=newRandom();

x=random.Next(lawnWidth/4,lawnWidth/4*3)/Block.WIDTH*Block.WIDTH;

y=random.Next(lawnHeight/4-1,lawnHeight/4*3)/Block.HEIGHT*Block.HEIGHT;

blocks.Add(newSnakeBlock(x,y,color,true));

蛇运动的方向控制

switch(direction)

{

caseDirection.Up:

for(inti=1;i

{

blocks.Add(newSnakeBlock(x,y+Block.HEIGHT*i,color,false));

}

break;

caseDirection.Down:

for(inti=1;i

{

blocks.Add(newSnakeBlock(x,y-Block.HEIGHT*i,color,false));

}

break;

caseDirection.Left:

for(inti=1;i

{

blocks.Add(newSnakeBlock(x+Block.WIDTH*i,y,color,false));

}

break;

caseDirection.Right:

for(inti=1;i

{

blocks.Add(newSnakeBlock(x-Block.WIDTH*i,y,color,false));

}

break;

}

Display(g);

}

publicvoidGrow()

{

intx=2*blocks[blocks.Count-1].Origion.X-blocks[blocks.Count-2].Origion.X;

inty=2*blocks[blocks.Count-1].Origion.Y-blocks[blocks.Count-2].Origion.Y;

blocks.Insert(length,newSnakeBlock(x,y,color,false));

length++;

}

publicvoidMove()

{

intx=0;

inty=0;

blocks[0].ChangeHeadToBody();

switch(direction)

{

caseDirection.Up:

x=blocks[0].Origion.X;

y=blocks[0].Origion.Y-Block.HEIGHT;

break;

caseDirection.Down:

x=blocks[0].Origion.X;

y=blocks[0].Origion.Y+Block.HEIGHT;

break;

caseDirection.Left:

x=blocks[0].Origion.X-Block.WIDTH;

y=blocks[0].Origion.Y;

break;

caseDirection.Right:

x=blocks[0].Origion.X+Block.WIDTH;

y=blocks[0].Origion.Y;

break;

}

blocks.Insert(0,newSnakeBlock(x,y,color,true));

blocks.RemoveAt(blocks.Count-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);

blocks.RemoveAt(i);

length=blockNum;

}

}

石块的定义定义如下,在空白区域中定义一个位置(坐标),使之固定不动,在蛇头撞到这个坐标的时候,参数传到判断蛇生死的函数,时蛇死亡,游戏结束。

publicboolMeetStone(Pointorigion)

{

if((blocks[0].Origion.X==(origion.X+40)&&blocks[0].Origion.Y==(origion.Y+40))||(blocks[0].Origion.X==(origion.X+300)&&

blocks[0].Origion.Y==(origion.Y+80))||(blocks[0].Origion.X==(origion.X+150)&&blocks[0].Origion.Y==(origion.Y+200))||

(blocks[0].Origion.X==(origion.X+100)&&blocks[0].Origion.Y==(origion.Y+400)))

returntrue;

else

returnfalse;

}

当蛇碰到一个豆时,使豆成为蛇体的一部分,其颜色和大小跟蛇一样,蛇身增加。

publicboolCanEatBean(Beanbean)

{

if(blocks[0].Origion==bean.Origion)

returntrue;

else

returnfalse;

}

publicintCanEatSnake()

{

for(inti=3;i

{

if(blocks[0].Origion==blocks[i].Origion)

returni;

}

return0;

}

publicvoidEatBean(Beanbean,Graphicsg,ColorbackGroundColor,intlawnWidth,intlawnHeight)

{

bean.Clear(g,backGroundColor);

Grow();

bean.Creat(g,backGroundColor,lawnWidth,lawnHeight,this);

eatebean=true;

}

publicboolIsAlive(intlawnWidth,intlawnHeight)

{

if(blocks[0].Origion.X<0)

returnfalse;

if(blocks[0].Origion.Y<0)

returnfalse;

if(blocks[0].Origion.X+Block.WIDTH>lawnWidth)

returnfalse;

if(blocks[0].Origion.Y+Bloc

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2