C#实现贪吃蛇(两条贪吃蛇)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace 贪吃蛇
{
    /// 
    /// MainWindow.xaml 的交互逻辑
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.WindowStyle = WindowStyle.None;
            this.AllowsTransparency = true;
        }
        Random a = new Random();
        Brush snakeColor;
        DispatcherTimer time = new DispatcherTimer();
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.WindowState = WindowState.Maximized;
            this.Background = Brushes.Transparent;

            BG.Width = 800;
            BG.Height = 600;
            BG.Background = Brushes.SkyBlue;
            BG.Opacity = 0.9;
            
            CreateSnake();

            time.Interval = TimeSpan.FromMilliseconds(300);
            time.Tick += Time_Tick;
            time.Start();

            this.KeyDown += MainWindow_KeyDown;

            CreateFood();
        }

        //常量蛇的初始长度
        const int snakeLength = 4;

        //常量蛇每节身体的大小
        const int snakeSize = 20;

        //动态数组不需要声明长度,数组内容根据填充的类型随意改变数量
        #region 蛇1

        /// 
        /// 动态数组,用来存储蛇
        /// 
        List snake = new List();
        /// 
        /// 用来存储位置
        /// 
        List snakeLocation = new List();

        #endregion

        #region 蛇2

        List snake02 = new List();
        List snakeLocation02 = new List();

        #endregion

        #region 创建蛇 

        /// 
        /// 创建蛇的方法
        /// 
        void CreateSnake()
        {
            for (int i = 0; i < snakeLength; i++)
            {
                //创造蛇1的border
                Border br = new Border();
                br.Width = br.Height = snakeSize;
                br.CornerRadius = new CornerRadius(10);
                Canvas.SetTop(br,100);
                Canvas.SetLeft(br, 100 - i * snakeSize);

                //创造蛇1的位置的border
                Border location = new Border();
                Canvas.SetTop(location, Canvas.GetTop(br));
                Canvas.SetLeft(location, Canvas.GetLeft(br));

                //创造蛇2的border
                Border br02 = new Border();
                br02.Width = br02.Height = snakeSize;
                br02.CornerRadius = new CornerRadius();
                Canvas.SetTop(br02, 400);
                Canvas.SetLeft(br02, 100 - i * snakeSize);

                //创造蛇2的位置的border
                Border location02 = new Border();
                Canvas.SetTop(location02, Canvas.GetTop(br02));
                Canvas.SetLeft(location02, Canvas.GetLeft(br02));

                //判断蛇头
                if (i==0)
                {
                    br.Background = Brushes.Tomato;
                    br02.Background = Brushes.Pink;
                }
                else
                {
                    br.Background = snakeColor;
                    br02.Background = Brushes.Tomato;
                }
                //将border装入snake数组中
                snake.Add(br);
                BG.Children.Add(br);

                snakeLocation.Add(location);
                BG.Children.Add(location);

                snake02.Add(br02);
                BG.Children.Add(br02);

                snakeLocation02.Add(location02);
                BG.Children.Add(location02);
            }
            //蛇1
            nextPositionx = Canvas.GetLeft(snake[0]);
            nextPositiony = Canvas.GetTop(snake[0]);
            //蛇2
            nextPositionx02 = Canvas.GetLeft(snake02[0]);
            nextPositiony02 = Canvas.GetTop(snake02[0]);
        }

        #endregion

        #region 蛇的移动

        //蛇1
        bool isLife = true;
        double nextPositionx;
        double nextPositiony;

        //蛇2
        bool isLife02 = true;
        double nextPositionx02;
        double nextPositiony02;

        /// 
        /// 蛇的移动
        /// 
        private void Time_Tick(object sender, EventArgs e)
        {
            #region 控制蛇1的移动键盘
            
            //向右
            if (direction== "right")
            {
                //预判:预算出下一个移动的坐标位置
                nextPositionx= Canvas.GetLeft(snake[0]) + snakeSize;
            }
            //向左
            if (direction == "left")
            {
                nextPositionx = Canvas.GetLeft(snake[0]) - snakeSize;
            }
            //向上
            if (direction == "up")
            {
                nextPositiony= Canvas.GetTop(snake[0]) - snakeSize;
            }
            //向下
            if (direction == "down")
            {
                nextPositiony = Canvas.GetTop(snake[0]) + snakeSize;
            }

            #endregion

            #region 控制蛇2的移动键盘

            //向右
            if (direction02 == "right")
            {
                //Canvas.SetLeft(snake02[0], Canvas.GetLeft(snake02[0]) + snakeSize);
                nextPositionx02 = Canvas.GetLeft(snake02[0]) + snakeSize;
            }
            //向左
            if (direction02 == "left")
            {
                //Canvas.SetLeft(snake02[0], Canvas.GetLeft(snake02[0]) - snakeSize);
                nextPositionx02 = Canvas.GetLeft(snake02[0]) - snakeSize;
            }
            //向上
            if (direction02 == "up")
            {
                //Canvas.SetTop(snake02[0], Canvas.GetTop(snake02[0]) - snakeSize);
                nextPositiony02 = Canvas.GetTop(snake02[0]) - snakeSize;
            }
            //向下
            if (direction02 == "down")
            {
                //Canvas.SetTop(snake02[0], Canvas.GetTop(snake02[0]) + snakeSize);
                nextPositiony02 = Canvas.GetTop(snake02[0]) + snakeSize;
            }

            #endregion

            #region 蛇撞到墙(蛇的死亡位置)

            //判断刚才预判的目标位置是否是死亡位置,如果是死亡位置,设置蛇的状态为死亡状态
            //蛇1
            if (nextPositionx<0 || nextPositionx>BG.Width-snakeSize || nextPositiony<0 || nextPositiony>BG.Height-snakeSize)
            {
                isLife = false;
            }
            //蛇2
            if (nextPositionx02 < 0 || nextPositionx02 > BG.Width - snakeSize || nextPositiony02 < 0 || nextPositiony02 > BG.Height - snakeSize)
            {
                isLife02 = false;
            }
            #endregion

            #region 移动蛇1

            //只有当蛇处于活着的状态下,才进行移动,吃食物...
            if (isLife)
            {
                Brush snakeColor = new SolidColorBrush(Color.FromRgb((byte)a.Next(256), (byte)a.Next(256), (byte)a.Next(256)));
                Canvas.SetLeft(snake[0], nextPositionx);
                Canvas.SetTop(snake[0], nextPositiony);
                //移动蛇1身体的border
                for (int i = 1; i < snake.Count; i++)
                {
                    snake[i].Background = snakeColor;
                    Canvas.SetLeft(snake[i], Canvas.GetLeft(snakeLocation[i - 1]));
                    Canvas.SetTop(snake[i], Canvas.GetTop(snakeLocation[i - 1]));
                }
                //移动蛇1的位置的border
                for (int i = 0; i < snakeLocation.Count; i++)
                {
                    Canvas.SetLeft(snakeLocation[i], Canvas.GetLeft(snake[i]));
                    Canvas.SetTop(snakeLocation[i], Canvas.GetTop(snake[i]));
                }
            }

            #endregion

            #region 移动蛇2
            if (isLife02)
            {
                Canvas.SetLeft(snake02[0], nextPositionx02);
                Canvas.SetTop(snake02[0], nextPositiony02);
                //移动蛇2身体的border
                for (int i = 1; i < snake02.Count; i++)
                {
                    Canvas.SetLeft(snake02[i], Canvas.GetLeft(snakeLocation02[i - 1]));
                    Canvas.SetTop(snake02[i], Canvas.GetTop(snakeLocation02[i - 1]));
                }
                //移动蛇2的位置的border
                for (int i = 0; i < snakeLocation02.Count; i++)
                {
                    Canvas.SetLeft(snakeLocation02[i], Canvas.GetLeft(snake02[i]));
                    Canvas.SetTop(snakeLocation02[i], Canvas.GetTop(snake02[i]));
                }
            }

            #endregion

            #region 吃到食物,食物随机

            #region 蛇1吃到食物,食物随机

            if (Canvas.GetLeft(food)==nextPositionx && Canvas.GetTop(food)==nextPositiony)
            {
                NextFood();
                ChangeBody();
            }

            #endregion

            #region 蛇2吃到食物,食物随机

            if ( Canvas.GetLeft(food) == nextPositionx02 && Canvas.GetTop(food) == nextPositiony02)
            {
                NextFood();
                ChangeBody02();
            }

            #endregion

            #endregion

            #region 蛇1吃到自己死亡

            for (int i = 1; i < snake.Count; i++)
            {
                if (nextPositionx == Canvas.GetLeft(snake[i]) && nextPositiony == Canvas.GetTop(snake[i]))
                {
                    isLife = false;
                }
            }

            #endregion

            #region 蛇2吃到自己死亡

            for (int i = 1; i < snake02.Count; i++)
            {
                if (nextPositionx02 == Canvas.GetLeft(snake02[i]) && nextPositiony02== Canvas.GetTop(snake02[i]))
                {
                    isLife02 = false;
                }
            }

            #endregion

        #region 两条蛇吃到食物随机的共同方法

        /// 
        /// 两条蛇食物随机的方法
        /// 
        private void NextFood()
        {
            int countRows = (int)BG.Width / snakeSize;
            int countCols = (int)BG.Height / snakeSize;
            Canvas.SetLeft(food, r.Next(countRows) * snakeSize);
            Canvas.SetTop(food, r.Next(countCols) * snakeSize);
        }

        #endregion

        #region 蛇长身体了

        /// 
        /// 蛇1长身体
        /// 
        void ChangeBody() 
        {
            Brush bodyColor = new SolidColorBrush(Color.FromRgb((byte)a.Next(256), (byte)a.Next(256), (byte)a.Next(256)));
            Border br = new Border();
            br.Width = br.Height = snakeSize;
            br.CornerRadius = new CornerRadius(10);
            br.Background = bodyColor;
            Canvas.SetTop(br, Canvas.GetTop(snake[snake.Count - 1]));
            Canvas.SetLeft(br, Canvas.GetLeft(snake[snake.Count - 1]));

            Border location = new Border();
            Canvas.SetTop(location, Canvas.GetTop(br));
            Canvas.SetLeft(location, Canvas.GetLeft(br));

            BG.Children.Add(br);
            snake.Add(br);
            BG.Children.Add(location);
            snakeLocation.Add(location);
        }

        /// 
        /// 蛇2长身体
        /// 
        void ChangeBody02()
        {
            Border br02 = new Border();
            br02.Width = br02.Height = snakeSize;
            br02.CornerRadius = new CornerRadius(10);
            br02.Background = Brushes.Cyan;
            Canvas.SetTop(br02, Canvas.GetTop(snake02[snake02.Count - 1]));
            Canvas.SetLeft(br02, Canvas.GetLeft(snake02[snake02.Count - 1]));

            Border location02 = new Border();
            Canvas.SetTop(location02, Canvas.GetTop(br02));
            Canvas.SetLeft(location02, Canvas.GetLeft(br02));

            BG.Children.Add(br02);
            snake02.Add(br02);
            BG.Children.Add(location02);
            snakeLocation02.Add(location02);
        }

        #endregion

        #endregion

        //定义一个方向
        string direction = "right";
        string direction02 = "right";

        #region 键盘事件

        /// 
        /// 键盘事件
        /// 
        private void MainWindow_KeyDown(object sender, KeyEventArgs e)
        {
            //控制蛇1的移动键盘
            if (e.Key==Key.Up && direction!="down")
            {
                direction = "up";
            }
            if (e.Key == Key.Down && direction != "up")
            {
                direction = "down";
            }
            if (e.Key == Key.Left && direction != "right")
            {
                direction = "left";
            }
            if (e.Key == Key.Right && direction != "left")
            {
                direction = "right";
            }
            //控制蛇2的移动键盘
            if (e.Key == Key.W && direction02 != "down")
            {
                direction02 = "up";
            }
            if (e.Key == Key.S && direction02 != "up")
            {
                direction02 = "down";
            }
            if (e.Key == Key.A && direction02 != "right")
            {
                direction02 = "left";
            }
            if (e.Key == Key.D && direction02 != "left")
            {
                direction02 = "right";
            }
        }

        #endregion

        #region 创建食物
        
        Border food = new Border();
        Random r = new Random();
        /// 
        /// 创建食物的方法
        /// 
        void CreateFood()
        {
            //X轴方向的格子数
            int countRows =(int) BG.Width / snakeSize;
            //Y轴方向的格子数
            int countCols = (int)BG.Height / snakeSize;

            food.Width = food.Height = snakeSize;
            food.CornerRadius = new CornerRadius(10);
            food.Background = new RadialGradientBrush(Colors.Red, Colors.Orange);
            Canvas.SetLeft(food, r.Next(countRows) * snakeSize);
            Canvas.SetTop(food, r.Next(countCols) * snakeSize);
            BG.Children.Add(food);
        }

        #endregion
    }
}

你可能感兴趣的:(C#实现贪吃蛇(两条贪吃蛇))