C#编程贪吃蛇小游戏.docx
《C#编程贪吃蛇小游戏.docx》由会员分享,可在线阅读,更多相关《C#编程贪吃蛇小游戏.docx(14页珍藏版)》请在冰豆网上搜索。
C#编程贪吃蛇小游戏
C#编程[“贪吃蛇”小游戏]
一、项目内容及要求
编程实现一个贪吃蛇”小游戏,具体要求如下:
1)程序启动后,蛇身默认向右移动,直到用户按下方向键改变运动方向。
2)玩家通过键盘上的上、下、左、右四个方向键控制蛇在地图上寻找豆,蛇吃下豆后,蛇身加长一节。
3)界面上任意时刻同时会有三个豆,豆的位置随机生成,定时刷新。
4)在游戏过程中,若蛇头碰到场地边界或自己的身体,则游戏失败。
二、算法分析
一、控件设计
1)主菜单控件MenuStrip
2)面板控件Panel:
背景色为黄色
3)标签控件Labell、Label2
二、类设计
1)Game类,入口主窗体、游戏界面类。
Game类的主要功能包括控制游戏的开始与暂停、选择游戏关卡、声明并创建蛇的行为及豆的行为线程,启动线程。
2)Block类:
代表蛇和豆一个节点的块类,游戏中需要绘制的块分为以下三种情况:
(1)蛇头:
红色椭圆
(2)蛇身:
红色矩形(3)豆:
绿色椭圆
添加类的属性:
块的颜色、是否蛇头、是否豆,横坐标X、纵坐标丫
添加类的行为:
绘制块draw()方法,构造函数(判断是否豆),重载构造函数
3)Snake类:
定义游戏中的蛇。
其属性包括蛇移动的方向以及蛇身的集合
(泛型集合List<>);其行为成员包括蛇吃豆、吃过豆之后蛇身增长、蛇身移动以及判断蛇是否死亡等。
4)Beans类:
定义游戏中的豆。
其属性包括3个豆组成的列表(List<>);其行为成员包括定时刷新豆的集合以及移除某个豆。
、界面及运行过程
四、关键代码
(代码要求注释完整,例如:
变量的作用,语句的作用,方法的功能等都要
加注释说明)
namespace项目5
{
publicpartialclassForml:
Form
{
Foodfood=newFood();
Snakesnake=newSnake();
privateintscore;
publicForm1()
{
InitializeComponent();
timer1.Enabled=false;//timer是否可用
timer1.Interval=snake.Speed;//蛇初始速度
score=0;
Point[]body=newPoint[1000];//蛇最大长度
privatevoid操作ToolStripMenultem_Click(objectsender,
Direction.down)Direction.up;
Direction.up)Direction.down;
Direction.right)Direction.left;
Direction」eft)Direction.right;
EventArgse){
protectedoverrideboolProcessDialogKey(KeyskeyData)
switch(keyData)
caseKeys.Up:
if(snake.Direction!
={
snake.Direction=
}
break;
caseKeys.Down:
if(snake.Direction!
=
{
snake.Direction=
}
break;
caseKeys.Left:
if(snake.Direction!
={
snake.Direction=
}
break;
caseKeys.Right:
if(snake.Direction!
={
snake.Direction=
}
break;
returnbase.ProcessDialogKey(keyData);
}
privatevoidmenuStrip1」temClicked(objectsender,
ToolStripItemClickedEventArgse)
{
privatevoid开始游戏ToolStripMenultem_Click(objectsender,
EventArgse)
{label2.Text="0";
score=0;timerl.Enabled=true;
if(snake.Live==false)
{
snake=newSnake();
snake.resetSnake();label2.Text="0";
score=0;
timer1.Enabled=true;
}
privatevoid关卡设定ToolStripMenultem_Click(objectsender,EventArgse)
{
}
privatevoid暂停游戏ToolStripMenultem_Click(objectsender,EventArgse)
{
if(暂停游戏ToolStripMenuItem.Text=="暂停游戏")
{
timer1.Enabled=false;
暂停游戏ToolStripMenuItem.Text="继续";
}
else
{
timer1.Enabled=true;
暂停游戏ToolStripMenuItem.Text="暂停游戏";
}
}
privatevoid退出游戏ToolStripMenultem_Click(objectsender,EventArgse)
{
this.Close();
privatevoid第一关ToolStripMenultem_Click(objectsender,
EventArgse)
{
timerl.lnterval=200;
}
privatevoid第二关ToolStripMenultem_Click(objectsender,EventArgse)
{
timer1.Interval=150;
}
privatevoid第三关ToolStripMenultem_Click(objectsender,EventArgse)
{
timer1.Interval=100;
}
privatevoid第四关ToolStripMenultem_Click(objectsender,EventArgse)
{
timer1」nterval=50;
}
objectsender,
privatevoid第五关ToolStripMenultem_Click(
EventArgse)
{
timer1.lnterval=30;
}
privatevoidtimer1_Tick(objectsender,EventArgse)
{_
snake.Move();
panel1.lnvalidate();//蛇运动后,把picturebox1当前界面设为
无效,并引发paint事件,重新绘制界面
privatevoidpanel1_Paint(objectsender,PaintEventArgse)
{_
Graphicsg=e.Graphics;
snake.Draw(g);//画蛇
if(snake」ive==false)
&&snake.Body[0].Y==
{
snake.Eat(food);
food.Exist=
false;
score+=10;
}
label2.Text=score.ToString();
{
if(food.Exist)
}
food.Draw(g);
{
else
food.Position=food.createdFood();
food.Exist=
true;
}
}
}
}
food.Draw(g);
if(snake.Body[0].X==food.Position.Xfood.Position.Y)
//重新创造绘制食物
usingSystem;
usingSystem.Collections.Generic;
usingSystem丄inq;
usingSystem.Text;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Windows.Forms;
usingSystem.Media;
usingSystem.10;
namespace项目5
{
classBlock
{
publicenumDirection{
up,down,left,right,
}
classSnake
{
publicintscore;
publicconstintside=10;//蛇身每个节点长度
Point[]body=newPoint[600];//蛇身最大长度Directiondirection;//蛇初始移动方向
publicboollive;//蛇存活状态
intnumber;//蛇身节点个数
intspeed=120;//蛇的初始速度
publicintSpeed//Speed属性
{
get
{
returnspeed;
}
set
{
speed=value;
}
}
publicDirectionDirection//Direction的属性
{
get
{
returndirection;
}
set
{
direction=value;
}
}
publicboolLive//Live的属性
{
get
{
returnlive;
set
live=value;
}
publicPoint[]Body//Body属性
{
get
{
returnbody;
}
}
publicSnake()//蛇类的构造器初始值
{
Pointnode1=newPoint(100,50);
Pointnode2=newPoint(90,50);
body[0]=node1;
body[1]=node2;
number=2;
direction=Direction.right;
live=true;
}
publicvoidMove()//蛇的移动
{
for(inti=this.number-1;i>0;i--)//蛇移动的方式
{
body[i]=body[i-1];
}
switch(this.direction)//蛇移动的方向
{
caseDirection.up:
body[0].Y-=side;
break;
caseDirection.down:
body[0].Y+=side;
break;
caseDirection.left:
body[0].X-=side;
break;
caseDirection.right:
body[0].X+=side;
break;
}
if(body[0].X<10||body[0].X>537||body[0].Y<10||body[0].Y>346)//蛇撞四壁挂
this.1ive=false;
for(inti=1;i<=number-1;i++)
{
if(body[0].X==body[i].X&&body[0].Y==body[i].Y)
{
this」ive=false;
}
}
}
publicvoidEat(Foodfood)//蛇吃食物
{
Labellabel2=newLabel();
body[number]=food.Position;
this.numbe叶+;//长度加
score+=2;
label2.Text=Convert.ToString(score);
}
publicvoidDraw(Graphicsg)//绘制蛇
{
SolidBrushRedBrush=newSolidBrush(Color.Red);g.DrawEllipse(Pens.Red,body[0].X,body[0].Y,side,side);
g.FillEllipse(RedBrush,body[0].X,body[0].Y,side,side);
for(inti=1;i<=number-1;i++)
{
g.DrawRectangle(Pens.Red,body[i].X,body[i].Y,side,
side);
g.FillRectangle(RedBrush,body[i].X,body[i].Y,side,
side);
}
if(this」ive==false)
{
g.DrawString("GameOver!
",newFont("宋体”,36,
FontStyle.Bold),RedBrush,newPoint(100,150));
}
}
publicvoidresetSnake()//重新设置蛇
{
Pointnode1=newPoint(100,320);
Pointnode2=newPoint(90,320);
body[1]=node1;
body[0]=node2;
number=2;
direction=Direction.right;
live=true;
}
}
classFood
{
Pointposition;//食物位置
Booleanexist;//判断失误是否存在publicFood()
{
position=this.createdFood();
exist=true;
}
publicPointPosition//Position的属性
{
get
{
returnposition;
}
set
{
position=value;
}
}
publicBooleanExist//Exist属性
{
get
{
returnexist;
}
set
{
exist=value;
}
}
publicPointcreatedFood()//随机产生食物{
Pointposition=newPoint();
Randomran=newRandon();
position.X=ran.Next(1,30)*10;
position.Y=ran.Next(1,30)*10;
returnposition;
}publicvoidDraw(Graphicsg)//绘制食物
{
SolidBrushgreenBrush=newSolidBrush(Color.Green);
g.FillEllipse(greenBrush,position.X,position.Y,10,10);
}
}
}