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 _02贪吃蛇
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.WindowStyle = WindowStyle.None;
            this.AllowsTransparency = true;
        }
        DispatcherTimer time = new DispatcherTimer();
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.WindowState = WindowState.Maximized;
            this.Background = Brushes.Transparent;

            BG.Width =400;
            BG.Height = 400;
            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

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

        #endregion
        #region 蛇2

        List<Border> snake02 = new List<Border>();
        List<Border> snakeLocation02 = new List<Border>();

        #endregion

        #region 创建蛇

        /// <summary>
        /// 创建蛇的方法
        /// </summary>
        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(10);
                Canvas.SetTop(br02, 200);
                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 = Brushes.Pink;
                    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);
            }
            nextpositionX = Canvas.GetLeft(snake[0]);
            nextpositionY = Canvas.GetTop(snake[0]);

            nextpositionX02 = Canvas.GetLeft(snake02[0]);
            nextpositionY02 = Canvas.GetTop(snake02[0]);
        }

        #endregion

        #region 蛇的移动
        //判断蛇是否活着
        bool islife = true;
        double nextpositionX;
        double nextpositionY;

        bool islife02= true;
        double nextpositionX02;
        double nextpositionY02;
        /// <summary>
        /// 蛇的移动
        /// </summary>
        private void Time_Tick(object sender, EventArgs e)
        {
            #region 控制蛇1的移动

            //向右
            if (direction == "right")
            {
                // Canvas.SetLeft(snake[0], Canvas.GetLeft(snake[0]) + snakeSize);
                //预判:预算出下一步移动的坐标
                nextpositionX = Canvas.GetLeft(snake[0]) + snakeSize;
            }
            //向左
            if (direction == "left")
            {
                //Canvas.SetLeft(snake[0], Canvas.GetLeft(snake[0]) - snakeSize);
                //预判:预算出下一步移动的坐标
                nextpositionX = Canvas.GetLeft(snake[0]) - snakeSize;
            }
            //向上
            if (direction == "up")
            {
                // Canvas.SetTop(snake[0], Canvas.GetTop(snake[0]) - snakeSize);
                //预判:预算出下一步移动的坐标
                nextpositionY = Canvas.GetTop(snake[0]) - snakeSize;
            }
            //向下
            if (direction == "down")
            {
                // Canvas.SetTop(snake[0], Canvas.GetTop(snake[0]) + snakeSize);
                //预判:预算出下一步移动的坐标
                nextpositionY = Canvas.GetTop(snake[0]) + snakeSize;
            }

            #endregion
            //判断刚才预判的目标位置是否是死亡位置,如果是死亡位置,设置蛇的状态是死亡状态
            //判断蛇1撞墙死亡
            if (nextpositionX < 0 || nextpositionX > BG.Width - snakeSize || nextpositionY < 0 || nextpositionY > BG.Height - snakeSize)
            {
                islife = false;
                //MessageBox.Show("撞墙死亡!");
                //time.Stop();
            }

            //判断蛇1吃到自己死亡
            for (int i = 1; i < snake.Count; i++)
            {
                if (nextpositionX == Canvas.GetLeft(snake[i]) && nextpositionY == Canvas.GetTop(snake[i]))
                {
                    islife = false;
                    //time.Stop();
                    //MessageBox.Show("吃到自己了!");
                }
            }

            //判断蛇1的头碰到蛇2的身体或者蛇2的头碰到蛇1的身体一起死
            //for (int i = 1; i < snake.Count; i++)
            //{
            //    if (nextpositionX == Canvas.GetLeft(snake02[i]) && nextpositionY == Canvas.GetTop(snake02[i
            //        ]))
            //    {
            //        islife = false;
            //        //time.Stop();
            //        //MessageBox.Show("吃到别人了!");
            //    }
            //}

            //只有当蛇处于活着的状态时,才进行移动,吃食物等;
            if (islife)
            {
                Canvas.SetLeft(snake[0], nextpositionX);
                Canvas.SetTop(snake[0], nextpositionY);
                //移动蛇1身体的border
                for (int i = 1; i < snake.Count; i++)
                {
                    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]));
                }

            }
            //判断蛇1是否吃到食物
            if (Canvas.GetLeft(food) == Canvas.GetLeft(snake[0]) && Canvas.GetTop(food) == Canvas.GetTop(snake[0]))
            {
                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);
                //蛇长身体
                CreateBody();
            }
        

            #region 控制蛇2的移动

            //向右
            if (direction02 == "right02")
            {
                //Canvas.SetLeft(snake02[0], Canvas.GetLeft(snake02[0]) + snakeSize);
                //预判:预算出下一步移动的坐标
                nextpositionX02 = Canvas.GetLeft(snake02[0]) + snakeSize;
            }
            //向左
            if (direction02 == "left02")
            {
                // Canvas.SetLeft(snake02[0], Canvas.GetLeft(snake02[0]) - snakeSize);
                //预判:预算出下一步移动的坐标
                nextpositionX02 = Canvas.GetLeft(snake02[0]) - snakeSize;
            }
            //向上
            if (direction02 == "up02")
            {
                // Canvas.SetTop(snake02[0], Canvas.GetTop(snake02[0]) - snakeSize);
                //预判:预算出下一步移动的坐标
                nextpositionY02 = Canvas.GetTop(snake02[0]) - snakeSize;
            }
            //向下
            if (direction02 == "down02")
            {
                // Canvas.SetTop(snake02[0], Canvas.GetTop(snake02[0]) + snakeSize);
                //预判:预算出下一步移动的坐标
                nextpositionY02 = Canvas.GetTop(snake02[0]) + snakeSize;
            }


            #endregion
            //判断刚才预判的目标位置是否是死亡位置,如果是死亡位置,设置蛇的状态是死亡状态
            //判断蛇2撞墙死亡
            if (nextpositionX02 < 0 || nextpositionX02 > BG.Width - snakeSize || nextpositionY02 < 0 || nextpositionY02 > BG.Height - snakeSize)
            {
                islife02 = false;
                //MessageBox.Show("撞墙死亡!");
                //time.Stop();
            }
           

            //判断蛇2吃到自己死亡
            for (int i = 1; i < snake02.Count; i++)
            {
                if (nextpositionX02 == Canvas.GetLeft(snake02[i]) && nextpositionY02 == Canvas.GetTop(snake02[i]))
                {
                    islife = false;
                    MessageBox.Show("吃到自己了!");
                    time.Stop();
                }
            }

            //判断蛇2的头碰到蛇1的身体或者蛇1的头碰到蛇2的身体一起死
            //for (int i = 0; i < snake02.Count; i++)
            //{
            //    if (nextpositionX02 == Canvas.GetLeft(snake[i]) && nextpositionY02 == Canvas.GetTop(snake[i]))
            //    {
            //        islife = false;
            //        time.Stop();
            //        MessageBox.Show("吃到别人了!");
            //    }
            //}


            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]));
                }
            }
              

            //判断蛇2是否吃到食物
            if (Canvas.GetLeft(food) == Canvas.GetLeft(snake02[0]) && Canvas.GetTop(food) == Canvas.GetTop(snake02[0]))
            {
                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);
                //蛇2长身体
                CreateBody02();
            }
        }
        //蛇1长身体的方法
        void CreateBody()
        {
            Brush bodycolor = new SolidColorBrush(Color.FromRgb((byte)r.Next(256),(byte)r.Next(256),(byte)r.Next(256)));
            Border br = new Border();
            br.Width = br.Height = snakeSize;
            br.CornerRadius = new CornerRadius(20);
           // br.Background = Brushes.Pink;
            Canvas.SetLeft(br,Canvas.GetLeft(snake[snake.Count-1]));
            Canvas.SetTop(br,Canvas.GetTop(snake[snake.Count-1]));
            br.Background = bodycolor;
            Border location = new Border();
            Canvas.SetLeft(location, Canvas.GetLeft(br));
            Canvas.SetTop(location,Canvas.GetTop(br));

            snake.Add(br);
            BG.Children.Add(br);

            snakeLocation.Add(location);
            BG.Children.Add(location);
        }
        //蛇2长身体的方法
        void CreateBody02()
        {
            Brush bodycolor02 = new SolidColorBrush(Color.FromRgb((byte)r.Next(256), (byte)r.Next(256), (byte)r.Next(256)));
            Border br02 = new Border();
            br02.Width = br02.Height = snakeSize;
            br02.CornerRadius = new CornerRadius(20);
            //br02.Background = Brushes.Tomato;
            br02.Background = bodycolor02;
            Canvas.SetLeft(br02, Canvas.GetLeft(snake02[snake02.Count - 1]));
            Canvas.SetTop(br02, Canvas.GetTop(snake02[snake02.Count - 1]));

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

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

            snakeLocation02.Add(location02);
            BG.Children.Add(location02);

        }
        #endregion


        #region 键盘事件
        //定义一个方向
        string direction = "right";
        string direction02 = "right02";

        /// <summary>
        /// 键盘事件
        /// </summary>
        private void MainWindow_KeyDown(object sender, KeyEventArgs e)
        {
            #region switch方法
            //switch (e.Key)
            //{
            //    case Key.Up:
            //        direction = "up";
            //        break;
            //    case Key.Down:
            //        direction = "down";
            //        break;
            //    case Key.Left:
            //        direction = "left";
            //        break;
            //    case Key.Right:
            //        direction = "right";
            //        break;
            //    case Key.W:
            //        direction02 = "up02";
            //        break;
            //    case Key.S:
            //        direction02 = "down02";
            //        break;
            //    case Key.A:
            //        direction02 = "left02";
            //        break;
            //    case Key.D:
            //        direction02 = "right02";
            //        break;
            //    default:
            //        break;
            //}
            #endregion
            //蛇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 != "down02")
            {
                direction02 = "up02";
            }
            if (e.Key == Key.S && direction02 != "up02")
            {
                direction02 = "down02";
            }
            if (e.Key == Key.A && direction02 != "right02")
            {
                direction02 = "left02";
            }
            if (e.Key == Key.D && direction02 != "left02")
            {
                direction02 = "right02";
            }
        }

        #endregion

        #region 创建食物

        Border food = new Border();
        Random r = new Random();
        /// <summary>
        /// 创建食物的方法
        /// </summary>
        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
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43552118/article/details/87105372
今日推荐