C#贪吃蛇小游戏

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/define_LIN/article/details/80600980

C#贪吃蛇小游戏

##思路
首先我们生成一个空白的的窗体,然后再放一个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>
    /// <param name="e"></param>
    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>
    /// <param name="e"></param>
    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>
    /// <param name="y"></param>
    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;
            }
        }
    }

当然不是!(o゚v゚)ノ
蛇的移动事件主要包括:

上一个事件中我们用到的每隔一段时间执行一次的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);
    }

本文转载自:C#winform 经典小游戏贪吃蛇V1.0(一)

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值