C#应用案例之贪吃蛇

本次的应用案例用到为WPF 应用

需要解决的问题(过程)

1.创建蛇 这里我们可以封装一个方法(私有的)用来装蛇的头部和身体 为蛇设置初始出现的位置已及初始的移动方向
2.创建食物 也封装一个方法(私有的)用来装食物 食物应该随机的出现在游戏界面的任何地方
3.创建键盘事件用键盘的方向键来控制蛇的(上下左右)移动,并用计时器来控制蛇的移动
4.创建游戏开始和暂停的按钮 用来控制蛇移动的计时器的开和关
5.当蛇的头部碰撞到食物时,将食物随机到其他位置并为蛇创建一节新的身体(相当于蛇吃掉食物增加身体长度)
6.当蛇的头部碰到了游戏界面的边界或自己的身体时,暂停游戏并给出提示(撞到了墙…咬到了自己…)
7.创建label控件记录所得的分数(所吃的食物数)

游戏界面展示

在这里插入图片描述
在这里插入图片描述

代码展示

为保证程序的正常运行将以下代码写在全局中

        int size = 20;  //设置大小
        DispatcherTimer movetimer = new DispatcherTimer();  //创建计时器
        Button ks = new Button();  //创建开始按钮
        List<Border> snake = new List<Border>();  //<>表示泛型  //括号中可以是任意类型  list表示集合
        int df = 0;  //记录得分
        Border food = new Border();  //创建食物
        Label defen = new Label();  //创建label积分板
        int gezix = 50;
        int geziy = 30;
        Random ra = new Random();  //创建随机对象

设置 MainWindow

            this.WindowStyle = WindowStyle.None;  //设置窗体无边框样式
            this.AllowsTransparency = true;  //允许窗体透明

设置窗体的属性(在加载事件中设置)

            this.Background = Brushes.Transparent;  //设置窗体的背景颜色为透明
            this.WindowState = WindowState.Maximized;  //将窗体最大化
            jiemian.Background = new RadialGradientBrush(Colors.White,Colors.Yellow);  //将canvas的背景颜色为环形渐变

创建蛇

//封装一个方法  创建蛇的对象   私有的
        private void CreateSnake() 
        {
            //创建初始的4节蛇身
            for (int i = 0; i < 4; i++)
            {
                Border br = new Border();
                br.Width = size;
                br.Height = size;
                br.Tag = "Right";
                //区别蛇的头(红)和身体(粉)
                if (i==0)
                {
                    br.Background = Brushes.Red;
                }
                else
                {
                    br.Background = Brushes.Pink;
                }
                br.CornerRadius = new CornerRadius(20);
                //设置蛇初始出现的位置
                Canvas.SetLeft(br,(gezix/2)*size-i*size);
                Canvas.SetTop(br,(geziy/2)*size);
                jiemian.Children.Add(br);
                snake.Add(br);
            }
        }

创建食物

//封装一个方法   创建食物的对象  私有的
        private void CreateDouDou() 
        {
            food.Width = size;
            food.Height = size;
            food.Background = new RadialGradientBrush(Colors.Red,Colors.Blue);
            food.CornerRadius = new CornerRadius(20);
            //随机食物初始出现的位置
            Canvas.SetLeft(food,ra.Next(gezix)*size);
            Canvas.SetTop(food,ra.Next(geziy)*size);
            jiemian.Children.Add(food);  //将食物添加到游戏中去
        }

创建键盘事件

this.KeyDown += MainWindow_KeyDown;  //创建键盘事件
            switch (e.Key)
            {
                case Key.Right:
                    snake[0].Tag = "Right";
                    break;
                case Key.Left:
                    snake[0].Tag = "Left";
                    break;
                case Key.Up:
                    snake[0].Tag = "Up";
                    break;
                case Key.Down:
                    snake[0].Tag = "Down";
                    break;
            }

创建timer计时器令蛇进行移动

            movetimer.Interval = TimeSpan.FromMilliseconds(200);  //时间的设置
            movetimer.Tick += Movetimer_Tick;  //创建计时器的事件

timer计时器的事件

            for (int i = 0; i < snake.Count; i++)
            {
                if (snake[i].Tag.ToString() == "Left")
                { 
                    Canvas.SetLeft(snake[i], Canvas.GetLeft(snake[i]) - size);
                }
                else if (snake[i].Tag.ToString() == "Right")
                {
                    Canvas.SetLeft(snake[i], Canvas.GetLeft(snake[i]) + size);
                }
                else if (snake[i].Tag.ToString() == "Up")
                {
                    Canvas.SetTop(snake[i], Canvas.GetTop(snake[i]) - size);
                }
                else if (snake[i].Tag.ToString() == "Down")
                {
                    Canvas.SetTop(snake[i], Canvas.GetTop(snake[i]) + size);
                }
            }
            for (int i = snake.Count - 1; i > 0; i--)
            {
                snake[i].Tag = snake[i - 1].Tag;
            }

蛇吃食物增加长度和得分

            if (Canvas.GetLeft(snake[0])==Canvas.GetLeft(food)&&Canvas.GetTop(snake[0])==Canvas.GetTop(food))
                //如果蛇的头部碰到了食物
            {
                //计算得分
                df += 1;
                defen.Content = "你的得分为:" + df + "分";
                //碰到了食物随机改变食物的位置(相当于生成新的食物)
                Canvas.SetLeft(food, ra.Next(gezix) * size);
                Canvas.SetTop(food,ra.Next(geziy)*size);
                //碰到了食物后将蛇的长度增加
                Border newfood = new Border();
                newfood.Width = newfood.Height = size;  
                newfood.Tag = "Right";
                newfood.Background = Brushes.Black;
                newfood.CornerRadius = new CornerRadius(20);  //将蛇的身体画圆
                Canvas.SetLeft(newfood,Canvas.GetLeft(snake[snake.Count-1])-size);
                Canvas.SetTop(newfood,Canvas.GetTop(snake[snake.Count-1]));
                jiemian.Children.Add(newfood);
                snake.Add(newfood);
            }

蛇撞墙和咬到自己

            //当蛇的头部触碰到了游戏界面的边缘
            if (Canvas.GetLeft(snake[0])+size>=jiemian.Width||Canvas.GetLeft(snake[0])<=0||Canvas.GetTop(snake[0])>=jiemian.Height||Canvas.GetTop(snake[0])<=0)
            {
                MessageBox.Show("可能我撞了南墙才会回头吧!");
            }
            for (int i = 1; i < snake.Count; i++)
            {
                //蛇头触碰到了蛇的身体
                if (Canvas.GetLeft(snake[0])==Canvas.GetLeft(snake[i])&&Canvas.GetTop(snake[0])==Canvas.GetTop(snake[i]))
                {
                    MessageBox.Show("咬到自己了");
                }
            }

创建开始游戏按钮

            //创建开始游戏的按钮
            Button ks = new Button();  //创建开始按钮
            ks.Width = size*5;  //设置按钮大小
            ks.Height = size*2;
            ks.FontSize = 16F;  //设置字体
            ks.Content = "开始游戏";  //设置按钮文本  不同于windows窗体  用content来设置
            Canvas.SetTop(ks, 30);  //设置按钮位置   不同于windows窗体  canvas.setleft/settop(需要设置的控件的名称,距离左侧/顶部的距离)
            jiemian.Children.Add(ks);  //将按钮加入到界面中去

在按钮的点击事件中将 timer计时器打开
创建暂停游戏按钮

            //创建暂停游戏的按钮
            Button zt = new Button();
            zt.Width = size * 5;
            zt.Height = size * 2;
            zt.FontSize = 16F;
            zt.Content = "暂停游戏";
            Canvas.SetTop(zt, 80);
            jiemian.Children.Add(zt);

在按钮的点击事件中将 timer计时器关闭
记录得分

            defen.FontSize = 16F;  //设置字体大小
            defen.Content = "你的得分为:" + df + "分";
            jiemian.Children.Add(defen);

猜你喜欢

转载自blog.csdn.net/Layfolk_XK/article/details/106356570