WPF贪吃蛇2

WPF贪吃蛇2

增加内容

1、增加为两条蛇一条红头蛇,一条黄头蛇,分数独立,在结束游戏时可见

2、增加多个食物设置

3、黄头蛇方向控制:A:向左 D:向右 W:向上 S:向下

​ 红头蛇方向控制:↑:向上 ←:向左 →:向右 ↓:向下

4、增加毒食物,吃到毒食物减蛇长,减一分

5、两蛇相碰死亡

6、游戏结束后出现对话框选择,是:重开游戏,否:退出游戏

代码

                Canvas gameA = new Canvas();//游戏区域
        double size = 20;//表格单位
        int SetX = 60;
        int SetY = 40;
        int fs = 0;//蛇1分数
        int fs2 = 0;//蛇2分数
        Random r = new Random();
        
        //Border food = new Border();//实例化一个食物对象
        Border Dfood = new Border();//实例化一个毒食物对象
        DispatcherTimer timer = new DispatcherTimer();//实例化一个计时器
        List<Border> snack = new List<Border>();//蛇1泛型
        List<Border> snack2 = new List<Border>();//蛇2泛型
        List<Border> ffood = new List<Border>();//食物泛型
        bool pd = true;//判断游戏开始暂停

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //创建界面
            gameLoad();
            

            timer.Interval = TimeSpan.FromMilliseconds(100);//计时器运行周期
            timer.Tick += Timer_Tick;

            

        }
        /// <summary>
        /// 设计游戏界面
        /// </summary>
        private void gameLoad()
        {
            //界面设计
            this.Background = Brushes.Transparent;
            this.WindowState = WindowState.Maximized;
            game.Background = new RadialGradientBrush(Colors.Firebrick, Colors.AliceBlue);
            
            //game.Opacity = 0.6;
            Border load = new Border();//实例化一个border对象作为蛇的运行区域
            //区域的尺寸
            load.Width = SetX * size;
            load.Height = SetY * size;
            //区域的边宽
            load.BorderThickness = new Thickness(2);
            load.BorderBrush = Brushes.Black;
            //区域的位置
            Canvas.SetLeft(load, 0);
            Canvas.SetTop(load, 0);
            //将区域放入容器
            game.Children.Add(load);
            //游戏区
            gameA.Width = load.Width;
            gameA.Height = load.Height;
            Canvas.SetLeft(gameA, 0);
            Canvas.SetTop(gameA, 0);
            game.Children.Add(gameA);
            //创建开始按钮
            Button ks = new Button();
            ks.Width = 150;
            ks.Height = 60;
            ks.Content = "开始游戏";
            Canvas.SetLeft(ks, (SetX + 3) * size);
            Canvas.SetTop(ks, 5 * size);
            game.Children.Add(ks);
            //创建暂停按钮
            Button zt = new Button();
            zt.Width = 150;
            zt.Height = 60;
            zt.Content = "暂停游戏";
            Canvas.SetLeft(zt, (SetX + 3) * size);
            Canvas.SetTop(zt, 12 * size);
            game.Children.Add(zt);
            //按钮点击事件
            ks.Click += Ks_Click;
            zt.Click += Zt_Click;

            //创建三种难度的关卡按钮
            Button jd = new Button();
            jd.Width = 150;
            jd.Height = 60;
            jd.Content = "关卡1";
            Canvas.SetLeft(jd, (SetX + 3) * size);
            Canvas.SetTop(jd, 16 * size);
            game.Children.Add(jd);

            Button pt = new Button();
            pt.Width = 150;
            pt.Height = 60;
            pt.Content = "关卡2";
            Canvas.SetLeft(pt, (SetX + 3) * size);
            Canvas.SetTop(pt, 20 * size);
            game.Children.Add(pt);

            Button kn = new Button();
            kn.Width = 150;
            kn.Height = 60;
            kn.Content = "关卡3";
            Canvas.SetLeft(kn, (SetX + 3) * size);
            Canvas.SetTop(kn, 24 * size);
            game.Children.Add(kn);
            //关卡按钮点击事件
            jd.Click += Jd_Click;
            pt.Click += Pt_Click;
            kn.Click += Kn_Click;
        }
        /// <summary>
        /// 关卡3点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Kn_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("关卡难度为:困难");
            timer.Interval = TimeSpan.FromMilliseconds(50);//计时器运行周期
        }
        /// <summary>
        /// 关卡2点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Pt_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("关卡难度为:普通");
            timer.Interval = TimeSpan.FromMilliseconds(100);//计时器运行周期
        }
        /// <summary>
        /// 关卡1点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Jd_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("关卡难度为:简单");
            timer.Interval = TimeSpan.FromMilliseconds(400);//计时器运行周期
        }
        /// <summary>
        /// 暂停按钮点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Zt_Click(object sender, RoutedEventArgs e)
        {
            this.KeyDown -= MainWindow_KeyDown;//键盘点击事件
            timer.Stop();
            pd = false;
        }
        /// <summary>
        /// 开始按钮点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Ks_Click(object sender, RoutedEventArgs e)
        {
            if (pd == true)
            {
                //创建蛇1
                SetSnack();
                //创建蛇2
                SetSnack2();
                //创建食物
                //SetFood();
                //创建多个食物
                SetFoods(3);
                //创建毒食物
                SetDFood();
                this.KeyDown += MainWindow_KeyDown;//键盘点击事件
            }
            timer.Start();//计时器开始
            pd = false;
        }
        /// <summary>
        /// 控制蛇运动方向
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MainWindow_KeyDown(object sender, KeyEventArgs e)
        {
            //键盘上下左右,蛇头tag相应变化
            switch (e.Key)
            {
                case Key.Right:
                    snack[0].Tag = "R";
                    break;
                case Key.Left:
                    snack[0].Tag = "L";
                    break;
                case Key.Up:
                    snack[0].Tag = "U";
                    break;
                case Key.Down:
                    snack[0].Tag = "D";
                    break;
                case Key.A:
                    snack2[0].Tag = "L";
                    break;
                case Key.D:
                    snack2[0].Tag = "R";
                    break;
                case Key.W:
                    snack2[0].Tag = "U";
                    break;
                case Key.S:
                    snack2[0].Tag = "D";
                    break;
            }
        }

        /// <summary>
        /// 蛇运动
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Timer_Tick(object sender, EventArgs e)
        {
            //遍历蛇身
            for (int i = 0; i < snack.Count; i++)
            {
                switch (snack[i].Tag.ToString())
                {
                    //通过tag控制蛇1的运动方向
                    case "R":
                        Canvas.SetLeft(snack[i], Canvas.GetLeft(snack[i]) + size);
                        break;
                    case "L":
                        Canvas.SetLeft(snack[i], Canvas.GetLeft(snack[i]) - size);
                        break;
                    case "U":
                        Canvas.SetTop(snack[i], Canvas.GetTop(snack[i]) - size);
                        break;
                    case "D":
                        Canvas.SetTop(snack[i], Canvas.GetTop(snack[i]) + size);
                        break;
                    default:
                        break;
                }
            }
            for(int i = 0; i < snack2.Count; i++)
            {
                switch (snack2[i].Tag.ToString())
                {
                    //通过tag控制蛇2的运动方向
                    case "R":
                        Canvas.SetLeft(snack2[i], Canvas.GetLeft(snack2[i]) + size);
                        break;
                    case "L":
                        Canvas.SetLeft(snack2[i], Canvas.GetLeft(snack2[i]) - size);
                        break;
                    case "U":
                        Canvas.SetTop(snack2[i], Canvas.GetTop(snack2[i]) - size);
                        break;
                    case "D":
                        Canvas.SetTop(snack2[i], Canvas.GetTop(snack2[i]) + size);
                        break;
                    default:
                        break;
                }
            }
            //蛇每一节tag与前一节相同
            for (int i = snack.Count - 1; i > 0; i--)
            {
                snack[i].Tag = snack[i - 1].Tag;
            }
            for(int i = snack2.Count - 1; i > 0; i--)
            {
                snack2[i].Tag = snack2[i - 1].Tag;
            }
            //蛇吃食物
            EatFood();
            //蛇吃毒食物
            EatDFood();
            //碰撞情况
            PengZ();

        }

        /// <summary>
        /// 创建蛇1
        /// </summary>
        public void SetSnack()
        {
            for (int i = 0; i < 4; i++)
            {
                Border se = new Border();//实例化蛇1对象
                se.Width = size;
                se.Height = size;
                se.Tag = "R";
                if (i == 0)
                {
                    se.Background = Brushes.Red;
                }
                else
                {
                    se.Background = Brushes.Green;
                }
                Canvas.SetLeft(se, (SetX / 2) * size - i * size);
                Canvas.SetTop(se, (SetY / 2) * size);
                se.CornerRadius = new CornerRadius(10);
                gameA.Children.Add(se);
                snack.Add(se);
            }
        }
        /// <summary>
        /// 创建蛇2
        /// </summary>
        public void SetSnack2()
        {
            for (int i = 0; i < 4; i++)
            {
                Border se2 = new Border();//实例化蛇2对象
                se2.Width = size;
                se2.Height = size;
                se2.Tag = "L";
                if (i == 0)
                {
                    se2.Background = Brushes.Yellow;
                }
                else
                {
                    se2.Background = Brushes.Green;
                }
                Canvas.SetLeft(se2, (SetX / 2 + 5) * size + i * size);
                Canvas.SetTop(se2, (SetY / 2 - 5) * size);
                se2.CornerRadius = new CornerRadius(10);
                gameA.Children.Add(se2);
                snack2.Add(se2);
            }
        }
        /// <summary>
        /// 创建食物
        /// </summary>
        //public void SetFood()
        //{
        //    food.Width = food.Height = size;
        //    food.Background = new RadialGradientBrush(Colors.Orange, Colors.Cyan);//食物颜色
        //    food.CornerRadius = new CornerRadius(5);
        //    //食物位置随机
        //    Canvas.SetLeft(food, r.Next(1, SetX) * size);
        //    Canvas.SetTop(food, r.Next(1, SetY) * size);
        //    //如果食物在蛇身上生成
        //    for (int i = 0; i < snack.Count; i++)
        //    {
        //        for(int j = 0; j < snack2.Count; j++)
        //        {
        //            if (Canvas.GetLeft(food) == Canvas.GetLeft(snack[i]) && Canvas.GetTop(food) == Canvas.GetTop(snack[i]) || Canvas.GetLeft(food) == Canvas.GetLeft(snack2[j]) && Canvas.GetTop(food) == Canvas.GetTop(snack2[j]))
        //            {
        //                Canvas.SetLeft(food, r.Next(1, SetX) * size);
        //                Canvas.SetTop(food, r.Next(1, SetY) * size);
        //            }
        //        }
        //    }
        //    //将食物放入容器
        //    gameA.Children.Add(food);
        //}
        public void SetFoods( int x)
        {
            for(int a = 0; a < x; a++)
            {
                Border foods = new Border();
                foods.Tag = a;
                foods.Width = foods.Height = size;
                foods.Background = new RadialGradientBrush(Colors.Orange, Colors.Cyan);//食物颜色
                foods.CornerRadius = new CornerRadius(5);
                //食物位置随机
                Canvas.SetLeft(foods, r.Next(1, SetX) * size);
                Canvas.SetTop(foods, r.Next(1, SetY) * size);
                //如果食物在蛇身上生成
                for (int i = 0; i < snack.Count; i++)
                {
                    for (int j = 0; j < snack2.Count; j++)
                    {
                        if (Canvas.GetLeft(foods) == Canvas.GetLeft(snack[i]) && Canvas.GetTop(foods) == Canvas.GetTop(snack[i]) || Canvas.GetLeft(foods) == Canvas.GetLeft(snack2[j]) && Canvas.GetTop(foods) == Canvas.GetTop(snack2[j]))
                        {
                            Canvas.SetLeft(foods, r.Next(1, SetX) * size);
                            Canvas.SetTop(foods, r.Next(1, SetY) * size);
                        }
                    }
                }
                //将食物放入容器
                gameA.Children.Add(foods);
                ffood.Add(foods);
            }
        }
        /// <summary>
        /// 创建毒食物
        /// </summary>
        public void SetDFood()
        {
            Dfood.Width = Dfood.Height = size;
            Dfood.Background = new RadialGradientBrush(Colors.Black, Colors.Green);//食物颜色
            Dfood.CornerRadius = new CornerRadius(5);
            //食物位置随机
            Canvas.SetLeft(Dfood, r.Next(1, SetX) * size);
            Canvas.SetTop(Dfood, r.Next(1, SetY) * size);
            //如果食物在蛇身上生成
            for (int i = 0; i < snack.Count; i++)
            {
                for (int j = 0; j < snack2.Count; j++)
                {
                    if (Canvas.GetLeft(Dfood) == Canvas.GetLeft(snack[i]) && Canvas.GetTop(Dfood) == Canvas.GetTop(snack[i]) || Canvas.GetLeft(Dfood) == Canvas.GetLeft(snack2[j]) && Canvas.GetTop(Dfood) == Canvas.GetTop(snack2[j]))
                    {
                        Canvas.SetLeft(Dfood, r.Next(1, SetX) * size);
                        Canvas.SetTop(Dfood, r.Next(1, SetY) * size);
                    }
                }
            }


            //将毒食物放入容器
            gameA.Children.Add(Dfood);
        }
        
        /// <summary>
        /// 蛇吃食物
        /// </summary>
        public void EatFood()
        {
            蛇1吃食物
            蛇1吃食物
            //if (snack.Count > 0 && Canvas.GetLeft(snack[0]) == Canvas.GetLeft(food) && Canvas.GetTop(snack[0]) == Canvas.GetTop(food))
            //{
            //    gameA.Children.Remove(food);
            //    SetFood();
            //    fs++;//蛇1吃到一次食物分数加1
            //    //食物刷新位置
            //    Canvas.SetLeft(food, r.Next(SetX) * size);
            //    Canvas.SetTop(food, r.Next(SetY) * size);
            //    //蛇1身增加
            //    ZenS();
            //}
            蛇2吃食物
            //if (snack2.Count > 0 && Canvas.GetLeft(snack2[0]) == Canvas.GetLeft(food) && Canvas.GetTop(snack2[0]) == Canvas.GetTop(food))
            //{
            //    gameA.Children.Remove(food);
            //    SetFood();
            //    fs2++;//蛇2吃到食物分数加1
            //    //食物刷新位置
            //    Canvas.SetLeft(food, r.Next(SetX) * size);
            //    Canvas.SetTop(food, r.Next(SetY) * size);
            //    //蛇2身增加
            //    ZenS2();
            //}
            for(int i = 0; i < ffood.Count; i++)
            {
                //蛇1吃食物
                if (snack.Count > 0 && Canvas.GetLeft(snack[0]) == Canvas.GetLeft(ffood[i]) && Canvas.GetTop(snack[0]) == Canvas.GetTop(ffood[i]))
                {
                    gameA.Children.Remove(ffood[i]);
                    ffood.Remove(ffood[i]);
                    SetFoods(1);
                    fs++;//蛇1吃到一次食物分数加1
                         //食物刷新位置
                    Canvas.SetLeft(ffood[i], r.Next(SetX) * size);
                    Canvas.SetTop(ffood[i], r.Next(SetY) * size);
                    //蛇1身增加
                    ZenS();
                }
                //蛇2吃食物
                if (snack2.Count > 0 && Canvas.GetLeft(snack2[0]) == Canvas.GetLeft(ffood[i]) && Canvas.GetTop(snack2[0]) == Canvas.GetTop(ffood[i]))
                {
                    gameA.Children.Remove(ffood[i]);
                    ffood.Remove(ffood[i]);
                    SetFoods(1);
                    fs2++;//蛇2吃到食物分数加1
                          //食物刷新位置
                    Canvas.SetLeft(ffood[i], r.Next(SetX) * size);
                    Canvas.SetTop(ffood[i], r.Next(SetY) * size);
                    //蛇2身增加
                    ZenS2();
                }
            }
        }
        public void EatDFood()
        {
            //蛇1吃毒食物
            if (snack.Count > 0 && Canvas.GetLeft(snack[0]) == Canvas.GetLeft(Dfood) && Canvas.GetTop(snack[0]) == Canvas.GetTop(Dfood))
            {
                gameA.Children.Remove(Dfood);
                SetDFood();
                fs--;//蛇1吃到一次食物分数加1
                //食物刷新位置
                Canvas.SetLeft(Dfood, r.Next(SetX) * size);
                Canvas.SetTop(Dfood, r.Next(SetY) * size);
                //蛇1身减少
                gameA.Children.Remove(snack[snack.Count-1]);
                snack.Remove(snack[snack.Count - 1]);
            }
            //蛇2吃毒食物
            if (snack2.Count > 0 && Canvas.GetLeft(snack2[0]) == Canvas.GetLeft(Dfood) && Canvas.GetTop(snack2[0]) == Canvas.GetTop(Dfood))
            {
                gameA.Children.Remove(Dfood);
                SetDFood();
                fs2--;//蛇2吃到食物分数加1
                //食物刷新位置
                Canvas.SetLeft(Dfood, r.Next(SetX) * size);
                Canvas.SetTop(Dfood, r.Next(SetY) * size);
                //蛇2身减少
                gameA.Children.Remove(snack2[snack2.Count - 1]);
                snack2.Remove(snack2[snack2.Count - 1]);
            }
        }
        /// <summary>
        /// 蛇1身增加
        /// </summary>
        public void ZenS()
        {
            Border znt = new Border();//实例化一个border对象作为蛇身增加的一节
            znt.Width = znt.Height = size;//增加节的尺寸
            znt.Tag = "";//增加节的tag
            znt.Background = Brushes.Green;//增加节的颜色
            znt.CornerRadius = new CornerRadius(10);
            //增加节的位置
            Canvas.SetLeft(znt, Canvas.GetLeft(snack[snack.Count - 1]));
            Canvas.SetTop(znt, Canvas.GetTop(snack[snack.Count - 1]));
            //将节放入容器与list
            gameA.Children.Add(znt);
            snack.Add(znt);
        }
        /// <summary>
        /// 蛇2身增加
        /// </summary>
        public void ZenS2()
        {
            Border znt2 = new Border();//实例化一个border对象作为蛇身增加的一节
            znt2.Width = znt2.Height = size;//增加节的尺寸
            znt2.Tag = "";//增加节的tag
            znt2.Background = Brushes.Green;//增加节的颜色
            znt2.CornerRadius = new CornerRadius(10);
            //增加节的位置
            Canvas.SetLeft(znt2, Canvas.GetLeft(snack2[snack2.Count - 1]));
            Canvas.SetTop(znt2, Canvas.GetTop(snack2[snack2.Count - 1]));
            //将节放入容器与list
            gameA.Children.Add(znt2);
            snack2.Add(znt2);
        }
        /// <summary>
        /// 各种碰撞情况
        /// </summary>
        public void PengZ()
        {
            //若蛇碰到边界
            if (Canvas.GetLeft(snack[0]) <= -1 || Canvas.GetLeft(snack[0]) >= SetX * size  || Canvas.GetTop(snack[0]) <= -1 || Canvas.GetTop(snack[0]) >= SetY * size || Canvas.GetLeft(snack2[0]) <= -1 || Canvas.GetLeft(snack2[0]) >= SetX * size || Canvas.GetTop(snack2[0]) <= -1 || Canvas.GetTop(snack2[0]) >= SetY * size)
            {
                GameOver();
            }
            //若蛇1头碰到蛇1身
            for (int i = 1; i < snack.Count; i++)
            {
                if (Canvas.GetLeft(snack[0]) == Canvas.GetLeft(snack[i]) && Canvas.GetTop(snack[0]) == Canvas.GetTop(snack[i]))
                {
                    GameOver();
                }
            }
            //若蛇2头碰到蛇2身
            for (int i = 1; i < snack2.Count; i++)
            {
                if (Canvas.GetLeft(snack2[0]) == Canvas.GetLeft(snack2[i]) && Canvas.GetTop(snack2[0]) == Canvas.GetTop(snack2[i]))
                {
                    GameOver();
                }
            }
            //若蛇1头碰到蛇2
            for(int i = 0; i < snack2.Count; i++)
            {
                if (Canvas.GetLeft(snack[0]) == Canvas.GetLeft(snack2[i]) && Canvas.GetTop(snack[0]) == Canvas.GetTop(snack2[i]))
                {
                    GameOver();
                }
            }
            //若蛇2头碰到蛇1
            for(int i = 0; i < snack.Count; i++)
            {
                if (Canvas.GetLeft(snack2[0]) == Canvas.GetLeft(snack[i]) && Canvas.GetTop(snack2[0]) == Canvas.GetTop(snack[i]))
                {
                    GameOver();
                }
            }
        }
        /// <summary>
        /// 游戏结束
        /// </summary>
        public void GameOver()
        {
            timer.Stop();//停止计时器
            gameA.Children.Clear();
            MessageBoxResult Out = MessageBox.Show("游戏结束,红头蛇得分为:" + fs +",黄头蛇得分为:"+fs2+ ",是否重新开始游戏", "游戏结束", MessageBoxButton.YesNo, MessageBoxImage.Asterisk);
            if (Out == MessageBoxResult.Yes)
            {
                snack.Clear();//清除list
                snack2.Clear(); // 清除存储蛇2的泛型
                
                pd = true;
                fs = 0;
                fs2 = 0;
            }
            else
            {
                this.Close();
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值