贪吃蛇实训报告.docx
- 文档编号:8711169
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:26
- 大小:344.93KB
贪吃蛇实训报告.docx
《贪吃蛇实训报告.docx》由会员分享,可在线阅读,更多相关《贪吃蛇实训报告.docx(26页珍藏版)》请在冰豆网上搜索。
贪吃蛇实训报告
贪吃蛇实训报告
郑州轻工业学院
实训报告
实训名称:
贪吃蛇
指导教师:
姓名:
学号:
班级:
提交日期:
并以蛇节点的颜色绘制这个节点,然后把头指针所指的节点出队,并以游戏框架内部背景色重绘出队的节点,这样就可以达到移动的效果。
而在吃到食物的时候,则只需把食物入队即可。
实现贪吃蛇的基本的蛇身移动、吃到食物身体增长、和碰到墙壁或自身死亡,能够暂停和开始。
玩家可以根据自己的水平选择不同的级别进行游戏挑战。
贪吃蛇游戏中定义如下:
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; publicList 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+Block.HEIGHT>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=random.Next(0,_lawnWidth-1)/Block.WIDTH*Block.WIDTH; inty=random.Next(0,_lawnHeight-1)/Block.HEIGHT*Block.HEIGHT; Directiondirection=(Direction)random.Next(1,4); snake=newSnake(Color.Red,direction); bean=newBean(Color.Red); isSnakeAlive=false; lawnWidth=_lawnWidth; lawnHeight=_lawnHeight; } publicvoidBegin(Graphicsg,ColorbackGroundColor,intlawnWidth,intlawnHeight) { isSnakeAlive=true; snake.Clear(g,backGroundColor); snake.Creat(g,backGroundColor,lawnWidth,lawnHeight); bean.Creat(g,backGroundColor,lawnWidth,lawnHeight,snake); 游戏中石块的填充,可以根据自己制定的坐标来固定石
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃 蛇实训 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)