C#窗体贪吃蛇

这几日自己尝试做了一个贪吃蛇,在尝试过程中发现了自己许多问题,如太小看winform了,之前总是认为其门槛低就没有太过于重视,结果还是眼高手低。

再此也提醒各位朋友与自己,每当脑海有想法时,尽量动手尝试,不要成为一个理论帝,好了,废话不多说。

代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace tcs
{
    public partial class Form1 : Form
    {
        Keys k = Keys.D;
        int grade = 0;
        string Direction = "D";
        List<Label> snake_point = new List<Label>();   //label控件集合,因为蛇是由多个label控件组成
        int snakeLen = 4;                              //蛇的初始长度
        static Random r = new Random();//随机数
        public Form1()
        {
            InitializeComponent();
        }

        //食物的生成
        private void food()
        {
            int x = r.Next(0, 40) * 10, y = r.Next(0, 40) * 10;
            Label l = new Label();
            l.Tag = "food";
            l.Top = x;
            l.Left = y;
            l.Height = 10;
            l.Width = 10;
            l.BackColor = Color.Green;
            this.Controls.Add(l);
        }
        //蛇的生成
        private void snake(Label lbl)
        {
            int x = 200, y = 200;
            for (int i = 0; i < snakeLen; i++)
            {
                Label l = new Label();
                l.BackColor = Color.Red;
                l.Width = 10;
                l.Height = 10;
                l.Top = y;
                l.Left = x - i * 10;
                this.Controls.Add(l);
                snake_point.Add(l);
            }
        }
        //吃的过程
        private void eat()
        {
            foreach (Label ctl in this.Controls)
            {
                if (ctl.BackColor == Color.Green)
                {
                    int x = ctl.Left, y = ctl.Top;
                    if (x == snake_point[0].Left && y == snake_point[0].Top)
                    {
                        this.Controls.Remove(ctl); food(); eat_food(); snakeLen++; grade++;
                    }
                }
            }
        }吃的判断
        private void eat_food()
        {
            Label lbl = new Label();
            lbl.Top = snake_point[snakeLen - 1].Top;
            lbl.Left = snake_point[snakeLen - 1].Left;
            lbl.Width = 10;
            lbl.Height = 10;
            lbl.BackColor = Color.Red;
            this.Controls.Add(lbl);
            snake_point.Add(lbl);
        }
        //死亡判断
        private void die()
        {
            Form1 f = new Form1();
            int i = 0;
            foreach (var a in snake_point)
            {
                if (a.Left == snake_point[0].Left && a.Top == snake_point[0].Top)
                    i++;
            }
            if (i == 2) { timer1.Enabled = false; MessageBox.Show(grade.ToString()); this.Dispose(false); }
        }
        //移动处理
        private void move(Keys k)
        {
            switch (k.ToString())
            {
                case "A":
                    for (int i = snakeLen - 1; i > 0; i--)
                    {
                        if (Direction == "D")//当蛇方向与按键相反的时候,不作为
                        {
                            snake_point[i].Left = snake_point[i - 1].Left;
				//切记不要使用label的交换来使蛇移动,蛇会断开,推荐尝试,我在这里吃了不少亏
                            snake_point[i].Top = snake_point[i - 1].Top;//我也不知道为什么,有大神看见请留言
                            snake_point[i - 1].Left += 10;
                            Direction = "D";
                        }
                        else
                        {
                            snake_point[i].Left = snake_point[i - 1].Left;
                            snake_point[i].Top = snake_point[i - 1].Top;
                            snake_point[i - 1].Left -= 10;
                            Direction = "A";
                        }
                    }
                    break;
                case "D":
                    for (int i = snakeLen - 1; i > 0; i--)
                    {
                        if (Direction == "A")
                        {
                            snake_point[i].Left = snake_point[i - 1].Left;
                            snake_point[i].Top = snake_point[i - 1].Top;
                            snake_point[i - 1].Left -= 10;
                            Direction = "A";
                        }
                        else
                        {
                            snake_point[i].Left = snake_point[i - 1].Left;
                            snake_point[i].Top = snake_point[i - 1].Top;
                            snake_point[i - 1].Left += 10;
                            Direction = "D";
                        }
                    }
                    break;
                case "W":
                    for (int i = snakeLen - 1; i > 0; i--)
                    {
                        if (Direction == "S")
                        {
                            snake_point[i].Top = snake_point[i - 1].Top;
                            snake_point[i].Left = snake_point[i - 1].Left;
                            snake_point[i - 1].Top += 10;
                        }
                        else
                        {
                            snake_point[i].Top = snake_point[i - 1].Top;
                            snake_point[i].Left = snake_point[i - 1].Left;
                            snake_point[i - 1].Top -= 10;
                            Direction = "W";
                        }
                    }
                    break;
                case "S":
                    for (int i = snakeLen - 1; i > 0; i--)
                    {
                        if (Direction == "W")
                        {
                            snake_point[i].Top = snake_point[i - 1].Top;
                            snake_point[i].Left = snake_point[i - 1].Left;
                            snake_point[i - 1].Top -= 10;
                        }
                        else
                        {
                            snake_point[i].Top = snake_point[i - 1].Top;
                            snake_point[i].Left = snake_point[i - 1].Left;
                            snake_point[i - 1].Top += 10;
                            Direction = "S";
                        }
                    }
                    break;
            }
        }
	//主窗体
        private void Form1_Load(object sender, EventArgs e)
        {
            //this.Top = 120;
            //this.Left = 120;
            this.Height = 438;
            this.Width = 415;
            this.BackColor = Color.Gold;
            food(); int x = 200, y = 200;
            for (int i = 0; i < snakeLen; i++)
            {
                Label l = new Label();
                l.BackColor = Color.Red;
                l.Width = 10;
                l.Height = 10;
                l.Top = y;
                l.Left = x - i * 10;
                this.Controls.Add(l);
                snake_point.Add(l);
            }
            timer1.Enabled = true;
            timer1.Interval = 200;
            timer1.Tick += timer1_Tick;
        }
        //判断蛇头是否到达边缘,并使其透墙
        private void decide()
        {
            if (snake_point[0].Left > 390)
            { snake_point[0].Left = 0; }
            if (snake_point[0].Left < 0)
            { snake_point[0].Left = 390; }
            if (snake_point[0].Top > 390)
            { snake_point[0].Top = 0; }
            if (snake_point[0].Top < 0)
            { snake_point[0].Top = 390; }
            die();
        }
	//时间控件
        private void timer1_Tick(object sender, EventArgs e)
        {
            decide(); move(k); eat();
        }
	//时间控制的重复操作
        private void Form1_Click(object sender, EventArgs e)
        {
            timer1.Tick += timer1_Tick;
        }
        //读取form1的按键操作
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.A: k = e.KeyCode; break;
                case Keys.D: k = e.KeyCode; break;
                case Keys.W: k = e.KeyCode; break;
                case Keys.S: k = e.KeyCode; break;
            }
        }
    }
}



这个程序十分简单,但扩展性不是太好。我在尝试的时候读了很多别人的程序时,发现很多时候不是太明白(我接触的相关东西太少,前面提到),所以基本上是靠自己完成。(不过也理清了基本逻辑)

读者尝试的时候推荐理清贪吃蛇细节上的思路。


  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值