C#窗体贪吃蛇

来源:互联网 发布:淘宝开放平台 什么 编辑:程序博客网 时间:2024/05/23 05:09

这几日自己尝试做了一个贪吃蛇,在尝试过程中发现了自己许多问题,如太小看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;            }        }    }}

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

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

 
原创粉丝点击