C#编程winform 经典小游戏贪吃蛇V1.0代码实现
小标 2018-08-13 来源 : 阅读 1597 评论 0

摘要:本文主要向大家介绍了C#编程winform 经典小游戏贪吃蛇V1.0代码实现,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

本文主要向大家介绍了C#编程winform  经典小游戏贪吃蛇V1.0代码实现,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

关于V1.0

为什么我给这个版本定义为V1.0嘞,因为在这个版本中仅仅实现了蛇的自动行进,按键对蛇的行进方向的操作和吃掉食物蛇身的增长等操作。

但是任何事情都必须一步一步来,当我们完成这个乞丐版的贪吃蛇,就为我们版本的更新打下了基础。

思路

首先我们生成一个空白的的窗体,然后再放一个timer控件,好了我们的游戏界面就建好了。

直接写后台代码。

没错就是这么简陋,

你可能会问:”蛇喃?“,

别急,别急,

我们的蛇体和食物为在后台生成的label控件,

我们通过控制label控件在界面的显示来表示蛇的移动和生长!

开整

生成成员变量

代码中Key_Name为记录键盘状态的变量,初始为start

label标签的数组Snake_Boby

随机数R

记录位置的两个变量

   

//定义成员变量

/// <summary>

/// 键盘状态,初始为start

/// </summary>

string Key_Name = "start";

/// <summary>

/// 蛇身数组

/// </summary>

Label[] Snake_Boby = new Label[3000];

/// <summary>

/// 随机数,用于生成food

/// </summary>

Random R = new Random();

/// <summary>

/// 记录位置

/// </summary>

int Snake_Boby_content_x = 0, Snake_Boby_content_y = 0;

   

贪吃蛇的初始化

在窗体的初始化事件Form1_Load中添加长度为5个label的蛇身

一个label的初始大小为10*10,并设置其的一些属性。

其中

Timer_Tick为蛇的移动事件,既每隔一次timer.Tick执行一次Timer_Tick

Form1_KeyDown为对键盘的监控

Snake_food()为食物的生成事件

  private void Form1_Load(object sender, EventArgs e)

  {

this.Top = 120;

this.Left = 120;

this.Width = 800;

this.Height = 800;

this.BackColor = Color.Blue;

//初始化一个label蛇体,长度为5个label,一个label height= width = 10

for (int i = 0; i < 8; i++)

{

 //蛇段

 Label Snake_Boby_content = new Label();

 Snake_Boby_content.Height = 10;

 Snake_Boby_content.Width = 10;

 //蛇段的位置

 Snake_Boby_content.Top = 400;

 Snake_Boby_content.Left = 400 - i * 10;

 //背景色

 this.BackColor = Color.White;

 Snake_Boby_content.BackColor = Color.Black;

 Snake_Boby_content.Text = "▉";

 //获取或设置包含有关控件的数据的对象。

 Snake_Boby_content.Tag = i;

 //加入蛇体

 Snake_Boby[i] = Snake_Boby_content;

 this.Controls.Add(Snake_Boby_content);

}

//每隔一段时间发生一次右移

timer.Tick += new EventHandler(Timer_Tick);

//按键时发生的事件监控

this.KeyDown += new KeyEventHandler(Form1_KeyDown);

Snake_food(); //food 生成

timer.Start(); //Timer 开始计时

  }

   

蛇的移动事件

蛇的移动事件为整个程序的关键代码,

下面一大溜都是(_)

肯定有人会说博主又要偷懒了,直接把代码复制粘贴不管事了( )

哼!

把我当成什么人了?
好的那让我们来看下一个事件!食物的生成!

  /// <summary>

  /// 对键盘按键输入的响应

  /// </summary>

  ///<param name="sender">

  ///<param name="e">

  public void Form1_KeyDown(object sender, KeyEventArgs e)

  {

int x, y;

x = Snake_Boby[0].Left;

y = Snake_Boby[0].Top;

//获取键盘代码

Key_Name = e.KeyCode.ToString();

if (Key_Name == "Right")//向右

{

 Snake_Boby[0].Left = x + 10;

 Snake_move(x, y);

}

if (Key_Name == "Up") //向上

{

 Snake_Boby[0].Top = y - 10;

 Snake_move(x, y);

}

if (Key_Name == "Down")  //向下

{

 Snake_Boby[0].Top = y + 10;

 Snake_move(x, y);

}

if (Key_Name == "Left") //向左

{

 Snake_Boby[0].Left = x - 10;

 Snake_move(x, y);

}

//每按一次,判断是否与食物重合

Eat_time();

 

  }

  /// <summary>

  /// snake的自动移动事件

  /// </summary>

  ///<param name="sender">

  ///<param name="e">

  public void Timer_Tick(object sender, EventArgs e)

  {

//用来记录snake的head的xy坐标

int x, y;

x = Snake_Boby[0].Left;

y = Snake_Boby[0].Top;

if (Key_Name == "start")  //键盘状态处于初始状态

{

 Snake_Boby[0].Left = x + 10;//Snake_Boby[0]右移10

 Snake_move(x, y);//调用

}

if (Key_Name == "Right")//键盘状态处于  向右 状态

{

 Snake_Boby[0].Left = x + 10;

 Snake_move(x, y);

}

if (Key_Name == "Up")  //键盘状态处于  向上  状态

{

 Snake_Boby[0].Top = y - 10;

 Snake_move(x, y);

}

if (Key_Name == "Down")//键盘状态处于  向下  状态

{

 Snake_Boby[0].Top = y + 10;

 Snake_move(x, y);

}

if (Key_Name == "Left") //键盘状态处于向左 状态

{

 Snake_Boby[0].Left = x - 10;

 Snake_move(x, y);

}

//  穿墙设置

if (x > 800)

{

 Snake_Boby[0].Left = 0; ;

}

if (x < 0)

{

 Snake_Boby[0].Left = 800;

}

if (y > 600)

{

 Snake_Boby[0].Top = 0;

}

if (y < 0)

{

 Snake_Boby[0].Top = 600;

}

//每动一次,判断是否与食物重合

Eat_time();

 

  }

  /// <summary>

  /// 蛇身移动事件

  /// </summary>

  ///<param name="x">

  ///<param name="y">

  public void Snake_move(int x, int y)

  {

//记录xy的中间变量

int temp_x = 0, temp_y = 0;

 

//遍历蛇身进行移动

for (int i = 1; Snake_Boby[i] != null; i++)

{

 if(i >= 3)

 {

  //将记录的前一个蛇段位置赋给中间变量

  temp_x = Snake_Boby_content_x;

  temp_y = Snake_Boby_content_y;

 }

 if (i == 1)

 {

  //将记录蛇头的改变前的位置的x y赋给第一个蛇段,并记录蛇段的位置

  temp_x  = Snake_Boby[i].Left;

  temp_y = Snake_Boby[i].Top;

  Snake_Boby[i].Left = x;

  Snake_Boby[i].Top = y;

 }

 else

 {

  //将记录前一个个蛇段的改变前的位置temp_赋给第二个蛇段,并记录改前位置

  Snake_Boby_content_x = Snake_Boby[i].Left;

  Snake_Boby_content_y = Snake_Boby[i].Top;

  Snake_Boby[i].Left = temp_x;

  Snake_Boby[i].Top = temp_y;

 }

}

  }

   

当然不是!(ov)ノ

蛇的移动事件主要包括:

上一个事件中我们用到的每隔一段时间执行一次的Timer_Tick方法,蛇的自动移动方法既通过判别Key_Name(键盘状态)来确定自动移动的方向,改变Snake_Boby[0](蛇头)的位置,然后Snake_Boby[0]位置改变后再调用Snake_move方法, Snake_move方法是蛇移动的关键,既根据蛇头位置的改变,对蛇体进行遍历,将蛇头后面每一个元素的位置变为它前一个元素改变之前的位置,实现蛇的移动。 Form1_KeyDown方法既当this.KeyDown监控到键盘发生变化时,改变Key_Name(键盘状态)的值,并改变蛇头位置,执行Snake_move 并且这些移动事件最后都要执行Eat_time()方法判断是否与食物相遇

食物生成

也是生成一个label控件,并设置大小,text等属性

  /// <summary>

  /// Food的生成事件

  /// </summary>

  public void Snake_food()

  {

 

Label Food = new Label();

Food.Width = 20;

Food.Height = 20;

//生成一个随机位置的food

Food.Top = R.Next(1, 20) * 20;

Food.Left = R.Next(1, 20) * 20;

Food.Text = "";

Food.Tag = "food";

Food.BackColor = Color.White;

this.Controls.Add(Food);

  }

   

蛇吃食物事件

主要包括:

- Eat_time方法判别是否和蛇头相遇,如果相遇,调用Snake_eat方法蛇长加一,且改变食物位置

- Snake_eat遍历到蛇尾部,生成一个label位置设为,蛇尾改变前的位置。

   

  public void Eat_time()

  {

double x1 = 20, y1 = 20, x2 = 20, y2 = 20;

//遍历Controls中所有label

foreach (Label lb in this.Controls)

{

 //如果lb为food,将label的位置记录

 if (lb.Tag.ToString() == "food".ToString())

 {

  x2 = lb.Left;

  y2 = lb.Top;

 }

 //如果label为snake,将label的位置记录

 if (lb.Tag.ToString() == "0".ToString())

 {

  x1 = lb.Left; 

  y1 = lb.Top; 

 }

}

if (x2 == x1 && y2 == y1)

{

 Snake_eat();

 //将食物移位

 foreach (Label lb in this.Controls)

 {

  if (lb.Tag.ToString() == "food".ToString())

  {

lb.Top = R.Next(1, 20) * 20;

lb.Left = R.Next(1, 20) * 20;

  }

 }

}

  }

  /// <summary>

  /// 蛇触碰到食物的事件

  /// </summary>

  private void Snake_eat()

  {

int i = 0;

//遍历到蛇尾

for (; Snake_Boby[i] != null; i++) ;

//蛇触碰到food蛇段加一,定义蛇段

Label Snake_Boby_content = new Label();

Snake_Boby_content.Width = 10;

Snake_Boby_content.Height = 10;

Snake_Boby_content.Top = Snake_Boby_content_y;

Snake_Boby_content.Left = Snake_Boby_content_x;

Snake_Boby_content.BackColor = Color.White;

Snake_Boby_content.Text = "▉";

Snake_Boby_content.Tag = i;

Snake_Boby[i] = Snake_Boby_content;

Snake_Boby_content.BackColor = Color.Black;

this.Controls.Add(Snake_Boby_content);

  }

   

效果

最后

我们的乞丐版贪吃蛇就完成了!

如果你按照我的步骤一步一步来,就会体验到你的Snake,

从From_Load出现到你的屏幕上,然后Snake_move它开始单调得向右移动,

Form1_KeyDown andTimer_Tick 它开始按照你的意思开始移动,上下左右,来回穿梭

Snake_food你的屏幕上出现一个爱心形状的食物,但是你吃不到它

Eat_time and Snake_eat 终于它变成了你期待的样子

可是它似乎又缺点啥?

编程总是这样,它诱惑我们去得到我们期待的东西,我们一步步接近我们的期待,这个过程可能充满曲折,但却是充满的惊喜,当我们似乎得到我们想要的后,却又发现好像还有那么一段距离

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C#.NET频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程