欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C#应用案例之贪吃蛇

程序员文章站 2022-07-02 17:52:25
...

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

需要解决的问题(过程)

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

游戏界面展示

C#应用案例之贪吃蛇
C#应用案例之贪吃蛇

代码展示

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

        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);
相关标签: c#