C# 制作贪吃蛇小游戏
目录
- 画蛇
- 实现蛇的上下左右移动
- 随机生成目标物
- 开始游戏
- 计分
- 重新开始
- 增加难度
- 死亡判定
1.1 画蛇的一节
Class Element()
Graphics g;
public void SnakeElement(Form form,float x,float y)
{
g= form.CreateGraphics();
Pen mypen = new Pen(Color.Black,2);
g.DrawEllipse(mypen, x, y, 10, 10);
g.FillEllipse(new SolidBrush(Color.Black),x,y,10,10);
g.SmoothingMode = SmoothingMode.HighQuality; //图片柔顺模式选择
g.InterpolationMode = InterpolationMode.HighQualityBicubic;//高质量
g.CompositingQuality = CompositingQuality.HighQuality;//再加一点
g.Dispose();
mypen.Dispose();
GC.Collect();
}
1.2 画整条蛇
Element element = new Element();
public void Drawsnake(Form form,List<Point> points)
{
for (int i = 0; i < points.Count; i++)
{
element.SnakeElement(form, points[i].X, points[i].Y);
}
}
原理是算得到整条蛇的坐标,然后根据坐标绘制对应数量的节
2.1 实现蛇的上下左右移动(此处利用timer来重绘)
void drawsnake()
{
//将旧蛇删除
element = new Element();
element.ClearSnake(this);
//判断方向
switch (Directionindex)
{
case 1:
position.Y -= offset;
break;
case 2:
position.Y += offset;
break;
case 3:
position.X -= offset;
break;
case 4:
position.X += offset;
break;
}
//length是蛇的长度
if (positions.Count < length)
positions.Add(position);
else
{
positions.RemoveAt(0);
positions.Add(position);
}
snake.Drawsnake(this, positions);
}
2.2 方向键开控制蛇的上下左右
原理是定义一个全局变量,当键盘按下对应的键时,赋不同的值
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Up:
if (Directionindex == 1 || Directionindex == 2)
return;
else
Directionindex = 1;
break;
case Keys.Down:
if (Directionindex == 2 || Directionindex == 1)
return;
else
Directionindex = 2;
break;
case Keys.Left:
if (Directionindex == 3 || Directionindex == 4)
return;
else
Directionindex = 3;
break;
case Keys.Right:
if (Directionindex == 4 || Directionindex == 3)
return;
else
Directionindex = 4;
break;
}
}
//没有这段程序无法识别方向键
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Up || keyData == Keys.Down ||
keyData == Keys.Left || keyData == Keys.Right)
return false;
else
return base.ProcessDialogKey(keyData);
}
3.1 随机画目标物
原理是生成两个随机数,构成食物的坐标,然后绘制
public class Food
{
Graphics g;
public void DrawFood(Form form,int x,int y)
{
g = form.CreateGraphics();
Pen mypen = new Pen(Color.Black, 2);
g.DrawEllipse(mypen, x, y, 10, 10);
g.FillEllipse(new SolidBrush(Color.Red), x, y, 10, 10);
g.Dispose();
mypen.Dispose();
GC.Collect();
}
}
void drawfood(Point point)
{
food.DrawFood(this, point.X, point.Y);
}
void changefood()
{
Random random = new Random();
int x = random.Next(0, 30);
int y = random.Next(0, 30);
x = x * 10;
y = y * 10;
foodposition = new Point(x, y);
}
4 开始游戏
/// <summary>
/// 记录分数
/// </summary>
int score = 0;
/// <summary>
/// 蛇的长度
/// </summary>
int length = 10;
private void Form1_Load(object sender, EventArgs e)
{
timer1.Interval = 400;
label2.Text = score.ToString();
}
设置一个button来开始游戏,并且将蛇的初始位置设置为(0,0)
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "开始游戏")
{
IsStart = true;
timer1.Enabled = true;
position = new Point(0, 0);
}
else
return;
}
5 、计分
当蛇头的位置与食物的位置重叠时,得分,并且重绘食物
void checkFood()
{
if (positions[positions.Count - 1] == foodposition)
{
changefood();
length += 1;
score += 1;
label2.Text = score.ToString();
}
else
return;
}
6 、重新开始
void restart()
{
positions.Clear();
position = new Point(0, 0);
Directionindex = 4;
timer1.Enabled = true;
timer1.Interval = 400;
length = 10;
score = 0;
label2.Text = score.ToString() ;
}
7 、增加难度
这个其实很简单,就是增加timer的刷新率,但是也存在很严重的闪烁问题
private void button3_Click(object sender, EventArgs e)
{
if (timer1.Interval > 50)
timer1.Interval -= 50;
else
return;
}
8、死亡判定
有两种方式结束游戏,第一,蛇碰到了自己的尾巴,第二,撞墙
代码如下
void checkAlive()
{
if (positions.Count > 3)
{
for (int i = 0; i < positions.Count - 1; i++)
{
if (positions[positions.Count - 1] == positions[i])
{
timer1.Enabled = false;
if (MessageBox.Show("你死了,是:退出游戏,否:重新开始", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
this.Close();
}
else
{
if (score > Convert.ToInt32(label4.Text))
label4.Text = score.ToString();
restart();
}
}
}
if (positions[positions.Count - 1].X < 0 || positions[positions.Count - 1].X > this.Width
|| positions[positions.Count - 1].Y < 0 || positions[positions.Count - 1].Y > this.Height)
{
timer1.Enabled = false;
if (MessageBox.Show("你死了,是:退出游戏,否:重新开始", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
this.Close();
}
else
{
//记录最高分
if (score > Convert.ToInt32(label4.Text))
label4.Text = score.ToString();
restart();
}
}
else
return;
}
}
总结:好了,到这里贪食蛇1.0已经可以成功运行了,小伙伴们可以去试一试,这应该是全网最简单的贪吃蛇吧,哈哈,如果有bug或者更好的实现方式,欢迎留言,周末写代码不容易,一键三连,谢谢
PS:还有些玩法可以加入,比如长按方向键可以加速等
- 目前已知的bug,如果玩家快速按下做个方向键,会存在有些动作无法执行