在这里插入图片描述

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 _01_贪吃蛇
{
    /// <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 = 800;
            BG.Height = 600;
            BG.Background = Brushes.Green;
            BG.Opacity = 0.8;
            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;
        //数组长度不能改变,使用集合
        //动态数组,不需要声明长度
        /// <summary>
        /// 用来存储蛇
        /// </summary>
        List<Border> snake = new List<Border>();
        ///<summary>
        /// 存储蛇的位置
        /// </summary>
        List<Border> snakeLocation = new List<Border>();
        ///<summary>
        /// 用来存储蛇2
        /// </summary>
        List<Border> snake1 = new List<Border>();
        ///<summary>
        /// 存储蛇2的位置
        /// </summary>
        List<Border> snakeLocation1 = new List<Border>();
        #region 创建蛇
        ///<summary>
        /// 创建蛇身体的方法
        /// </summary>
        void CreateSnake()
        {
            for (int i = 0; i < snakeLength; i++)
            {
                //随机色
                Brush mamaipi = new SolidColorBrush(Color.FromRgb((byte)r.Next(256), (byte)r.Next(256), (byte)r.Next(256)));
                Border br = new Border();
                Border location = new Border();//在设置border用来记录蛇的位置,只设置left,top属性
                br.Width = br.Height = snakeSize;
                br.CornerRadius = new CornerRadius(10);
                Canvas.SetLeft(br, 100 - i * snakeSize);
                Canvas.SetTop(br, 100);
                Canvas.SetTop(location, Canvas.GetTop(br));
                Canvas.SetLeft(location, Canvas.GetLeft(br));
                //判断蛇头金色
                if (i==0)
                {
                    br.Background = Brushes.Red;
                }
                else
                {
                    // br.Background = Brushes.Cyan;
                    br.Background = mamaipi;
                    br.BorderThickness = new Thickness(3);
                    br.BorderBrush = Brushes.White;
                    
                }
               
                BG.Children.Add(br);
                snake.Add(br);
                BG.Children.Add(location);
                snakeLocation.Add(location);
            }
            for (int i = 0; i < snakeLength; i++)
            {
                Brush mamaipi = new SolidColorBrush(Color.FromRgb((byte)r.Next(256), (byte)r.Next(256), (byte)r.Next(256)));
                Border br1 = new Border();
                Border location1 = new Border();//在设置border用来记录蛇的位置,只设置left,top属性
                br1.Width = br1.Height = snakeSize;
                br1.CornerRadius = new CornerRadius(10);
                Canvas.SetLeft(br1, 100 - i * snakeSize);
                Canvas.SetTop(br1, BG.Height-100);
                Canvas.SetTop(location1, Canvas.GetTop(br1));
                Canvas.SetLeft(location1, Canvas.GetLeft(br1));
                if (i==0)
                {
                    br1.Background = Brushes.White;
                }
                else
                {
                    //  br1.Background = Brushes.Gold;
                    br1.Background = mamaipi;
                    br1.BorderThickness = new Thickness(3);
                    br1.BorderBrush = Brushes.Cyan;
                }
                BG.Children.Add(br1);
                snake1.Add(br1);
                BG.Children.Add(location1);
                snakeLocation1.Add(location1);
            }
            nextPositionx = Canvas.GetLeft(snake[0]);
            nextPosutiony = Canvas.GetTop(snake[0]);
            nextPositionx1 = Canvas.GetLeft(snake1[0]);
            nextPOsutiony1 = Canvas.GetTop(snake1[0]);
        }
        string direction = "right";
        string direction1 = "right1";
        bool islife = true;
        bool islife1 = true;
        double nextPositionx;
        double nextPosutiony;
        double nextPositionx1;
        double nextPOsutiony1;
        #endregion
        private void Time_Tick(object sender, EventArgs e)
        {
            //snake头部移动
            //向右
            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);
                nextPosutiony = Canvas.GetTop(snake[0]) - snakeSize;
            }
            //向下
            if (direction == "down")
            {
                //Canvas.SetTop(snake[0], Canvas.GetTop(snake[0]) + snakeSize);
                nextPosutiony = Canvas.GetTop(snake[0]) + snakeSize;
            }

            //snak1头部移动
            if (direction1 == "right1")
            {
                // Canvas.SetLeft(snake1[0], Canvas.GetLeft(snake1[0]) + snakeSize);
                nextPositionx1 = Canvas.GetLeft(snake1[0]) + snakeSize;
            }
            //向左
            if (direction1 == "left1")
            {
               // Canvas.SetLeft(snake1[0], Canvas.GetLeft(snake1[0]) - snakeSize);
                nextPositionx1 = Canvas.GetLeft(snake1[0]) - snakeSize;
            }
            //向上
            if (direction1 == "up1")
            {
               // Canvas.SetTop(snake1[0], Canvas.GetTop(snake1[0]) - snakeSize);
                nextPOsutiony1 = Canvas.GetTop(snake1[0]) - snakeSize;
            }
            //向下
            if (direction1 == "down1")
            {
               // Canvas.SetTop(snake1[0], Canvas.GetTop(snake1[0]) + snakeSize);
                nextPOsutiony1 = Canvas.GetTop(snake1[0]) + snakeSize;
            }

            //判断刚才预判的目标位置是否是死亡位置,如果是死亡位置则设置蛇的状态为死亡状态
            if (nextPositionx < 0 || nextPositionx > BG.Width - snakeSize || nextPosutiony < 0 || nextPosutiony > BG.Height - snakeSize)
            {
                islife = false;
               // MessageBox.Show("你撞死了!");
            }

            if (nextPositionx1<0||nextPositionx1>BG.Width-snakeSize||nextPOsutiony1<0||nextPOsutiony1>BG.Height-snakeSize)
            {
                islife1 = false;
               // MessageBox.Show("你撞死了!");
            }

            if (islife)
            {
                Canvas.SetLeft(snake[0], nextPositionx);
                Canvas.SetTop(snake[0], nextPosutiony);
                //snake身体移动(把前一节的位置给后一节)
                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]));
                }
                //重新记录蛇snake的位置
                for (int i = 0; i < snakeLocation.Count; i++)
                {
                    Canvas.SetLeft(snakeLocation[i], Canvas.GetLeft(snake[i]));
                    Canvas.SetTop(snakeLocation[i], Canvas.GetTop(snake[i]));
                }
            }
            if (islife1)
            {
                Canvas.SetLeft(snake1[0], nextPositionx1);
                Canvas.SetTop(snake1[0], nextPOsutiony1);
                //snake1身体移动
                for (int i = 1; i < snake1.Count; i++)
                {
                    Canvas.SetLeft(snake1[i], Canvas.GetLeft(snakeLocation1[i - 1]));
                    Canvas.SetTop(snake1[i], Canvas.GetTop(snakeLocation1[i - 1]));
                }
                //重新记录蛇snake1的位置
                for (int i = 0; i < snakeLocation1.Count; i++)
                {
                    Canvas.SetLeft(snakeLocation1[i], Canvas.GetLeft(snake1[i]));
                    Canvas.SetTop(snakeLocation1[i], Canvas.GetTop(snake1[i]));
                }
            }
            #region 判断蛇吃到食物重新改变食物的位置
            //判断蛇snake是否吃到食物
            if (Canvas.GetLeft(snake[0]) == Canvas.GetLeft(food) && Canvas.GetTop(snake[0]) == Canvas.GetTop(food))
            {
                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);
                //snake长身体
                ChangeBody();
            }

            //判断蛇snake1是否吃到食物
            if (Canvas.GetLeft(snake1[0]) == Canvas.GetLeft(food) && Canvas.GetTop(snake1[0]) == Canvas.GetTop(food))
            {
                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);
                //snake1长身体
                ChangeBody1();
            }
            #endregion
            #region 判断吃到自己
            //判断吃到自己
            for (int i = 1; i < snake.Count ; i++)
            {
                if (nextPositionx == Canvas.GetLeft(snake[i]) && nextPosutiony == Canvas.GetTop(snake[i]))
                {
                    islife = false;
                }
            }
            for (int i = 1; i < snake1.Count; i++)
            {
                if (nextPositionx1 == Canvas.GetLeft(snake1[i]) && nextPOsutiony1 == Canvas.GetTop(snake1[i]))
                {
                    islife1 = false;
                }
            }
            #endregion
        }
        private void ChangeBody()
        {
            Brush mamaipi = 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 =mamaipi;
            br.BorderThickness = new Thickness(3);
            br.BorderBrush = Brushes.White;
            Canvas.SetLeft(br, Canvas.GetLeft(snake[snake.Count - 1]));
            Canvas.SetTop(br, Canvas.GetTop(snake[snake.Count - 1]));

            Border location = new Border();
            Canvas.SetLeft(location, Canvas.GetLeft(br));
            Canvas.SetTop(location, Canvas.GetTop(br));
            snakeLocation.Add(location);
            BG.Children.Add(br);
            BG.Children.Add(location);
            snake.Add(br);
        }
        private void ChangeBody1()
        {
            Brush mamaipi = 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 = mamaipi;
            br.BorderThickness = new Thickness(3);
            br.BorderBrush = Brushes.White;
            Canvas.SetLeft(br, Canvas.GetLeft(snake1[snake1.Count - 1]));
            Canvas.SetTop(br, Canvas.GetTop(snake1[snake1.Count - 1]));

            Border location1 = new Border();
            Canvas.SetLeft(location1, Canvas.GetLeft(br));
            Canvas.SetTop(location1, Canvas.GetTop(br));
            snakeLocation1.Add(location1);
            BG.Children.Add(br);
            BG.Children.Add(location1);
            snake1.Add(br);
        }
        private void MainWindow_KeyDown(object sender, KeyEventArgs e)
        {
            //switch{
                // 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:
                //     direction1 = "up1";
                //     break;
                // case Key.S:
                //     direction1 = "down1";
                //     break;
                // case Key.A:
                //     direction1 = "left1";
                //     break;
                // case Key.D:
                //     direction1 = "right1";
                //     break;
                // default:
                //     break;
            //}
            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";
            }
            if (e.Key==Key.W&&direction1!="down1")
            {
                direction1 = "up1";
            }
            if (e.Key==Key.S&&direction1!="up1")
            {
                direction1 = "down1";
            }
            if (e.Key==Key.A&&direction1!="right1")
            {
                direction1 = "left1";
            }
            if (e.Key==Key.D&&direction1!="left1")
            {
                direction1 = "right1";
            }
            //}
        }
        Random r = new Random();
        Border food = new Border();
        void CreateFood()
        {
            int countRows = (int)BG.Width / snakeSize;
            int countCols = (int)BG.Height / snakeSize;

            food.Width = food.Height = snakeSize;
            food.CornerRadius = new CornerRadius(20);
            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);
        }
    }
}

posted on 2019-01-28 16:31  豆皮没有豆  阅读(246)  评论(0)    收藏  举报