C#中的贪吃蛇

本文主要讲解贪吃蛇,实现两条蛇,代码如下
编辑器界面

<Window x:Class="贪吃蛇1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="800" Width="1000" WindowStyle="None" AllowsTransparency="False" Background="Pink" Loaded="Window_Loaded">
    <Canvas Name="back" Margin="0,0,200,0" Background="Goldenrod" Height="800" Width="800">
        <Button Content="结束游戏" Canvas.Left="868" Canvas.Top="199" Width="75" Click="Button_Click" />
        <Button Content="开始游戏" Canvas.Left="868" Canvas.Top="107" Width="75" Click="Button_Click_1"/>
    </Canvas>
</Window>

主题代码

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 贪吃蛇1
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        //结束
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
        //开始
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            t1.Interval = TimeSpan.FromMilliseconds(100);
            t1.Start();
        }
        int SnakeSize = 20;
        int rows;
        int column;
        List<Border> snake = new List<Border>();
        List<Border> snake1 = new List<Border>();
        Random r = new Random();
        DispatcherTimer t1 = new DispatcherTimer();

        Border food = new Border();
        //加载
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            rows = (int)back.Width / SnakeSize;
            column = (int)back.Height / SnakeSize;
            this.Left = this.Top = 0;
            CreateSnake();
            CreateSnake1();
            t1.Tick += t1_Tick;
            KeyDown += MainWindow_KeyDown;
            food.Width = food.Height = SnakeSize;
            food.CornerRadius = new CornerRadius(90);
            food.Background = new RadialGradientBrush(Color.FromRgb((byte)r.Next(0, 256), (byte)r.Next(0, 256), (byte)r.Next(0, 256)), Color.FromRgb((byte)r.Next(0, 256), (byte)r.Next(0, 256), (byte)r.Next(0, 256)));
            back.Children.Add(food);
            Canvas.SetLeft(food, r.Next(0, 20) * rows);
            Canvas.SetTop(food, r.Next(0, 20) * column);
            Canvas.SetZIndex(food, 3);
        }
        //获取键盘值
        void MainWindow_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key.ToString() == "W" && snake[0].Tag.ToString() != "S")
            {
                snake[0].Tag = "W";
            }
            if (e.Key.ToString() == "A" && snake[0].Tag.ToString() != "D")
            {
                snake[0].Tag = "A";
            }
            if (e.Key.ToString() == "S" && snake[0].Tag.ToString() != "W")
            {
                snake[0].Tag = "S";
            }
            if (e.Key.ToString() == "D" && snake[0].Tag.ToString() != "A")
            {
                snake[0].Tag = "D";
            }
            //二
            if (e.Key.ToString() == "Up" && snake1[0].Tag.ToString() != "Down")
            {
                snake1[0].Tag = "W";
            }
            if (e.Key.ToString() == "Left" && snake1[0].Tag.ToString() != "Right")
            {
                snake1[0].Tag = "A";
            }
            if (e.Key.ToString() == "Down" && snake1[0].Tag.ToString() != "Up")
            {
                snake1[0].Tag = "S";
            }
            if (e.Key.ToString() == "Right" && snake1[0].Tag.ToString() != "Left")
            {
                snake1[0].Tag = "D";
            }
        }
        //移动吃食物
        void t1_Tick(object sender, EventArgs e)
        {
            for (int i = snake.Count - 1; i > 0; i--)
            {
                Canvas.SetLeft(snake[i], Canvas.GetLeft(snake[i - 1]));
                Canvas.SetTop(snake[i], Canvas.GetTop(snake[i - 1]));
            }
            switch (snake[0].Tag.ToString())
            {
                case "W":
                    Canvas.SetTop(snake[0], Canvas.GetTop(snake[0]) - SnakeSize);
                    break;
                case "A":
                    Canvas.SetLeft(snake[0], Canvas.GetLeft(snake[0]) - SnakeSize);
                    break;
                case "S":
                    Canvas.SetTop(snake[0], Canvas.GetTop(snake[0]) + SnakeSize);
                    break;
                case "D":
                    Canvas.SetLeft(snake[0], Canvas.GetLeft(snake[0]) + SnakeSize);
                    break;
                default: break;
            }
            //吃食物
            if (Canvas.GetTop(food) == Canvas.GetTop(snake[0]) && Canvas.GetLeft(food) == Canvas.GetLeft(snake[0]))
            {
                Border b = new Border();
                b.Width = b.Height = SnakeSize;
                b.CornerRadius = new CornerRadius(90);
                b.Background = food.Background;
                back.Children.Add(b);
                Canvas.SetLeft(b, Canvas.GetLeft(snake[snake.Count - 1]));
                Canvas.SetTop(b, Canvas.GetTop(snake[snake.Count - 1]));
                Canvas.SetZIndex(b, 3);
                snake.Add(b);

                food.Background = new RadialGradientBrush(Color.FromRgb((byte)r.Next(0, 256), (byte)r.Next(0, 256), (byte)r.Next(0, 256)), Color.FromRgb((byte)r.Next(0, 256), (byte)r.Next(0, 256), (byte)r.Next(0, 256)));
                Canvas.SetLeft(food, r.Next(0, 20) * rows);
                Canvas.SetTop(food, r.Next(0, 20) * column);
            }
            //碰撞墙壁
            if (Canvas.GetLeft(snake[0]) >= 800)
            {
                Canvas.SetLeft(snake[0], 0);
            }
            if (Canvas.GetLeft(snake[0]) <= -20)
            {
                Canvas.SetLeft(snake[0], 780);
            } if (Canvas.GetTop(snake[0]) <= -20)
            {
                Canvas.SetTop(snake[0], 780);
            } if (Canvas.GetTop(snake[0]) >= 800)
            {
                Canvas.SetTop(snake[0], 0);
            }
            //第二条蛇
            for (int i = snake1.Count - 1; i > 0; i--)
            {
                Canvas.SetLeft(snake1[i], Canvas.GetLeft(snake1[i - 1]));
                Canvas.SetTop(snake1[i], Canvas.GetTop(snake1[i - 1]));
            }
            switch (snake1[0].Tag.ToString())
            {
                case "W":
                    Canvas.SetTop(snake1[0], Canvas.GetTop(snake1[0]) - SnakeSize);
                    break;
                case "A":
                    Canvas.SetLeft(snake1[0], Canvas.GetLeft(snake1[0]) - SnakeSize);
                    break;
                case "S":
                    Canvas.SetTop(snake1[0], Canvas.GetTop(snake1[0]) + SnakeSize);
                    break;
                case "D":
                    Canvas.SetLeft(snake1[0], Canvas.GetLeft(snake1[0]) + SnakeSize);
                    break;
                default: break;
            }
            //吃食物
            if (Canvas.GetTop(food) == Canvas.GetTop(snake1[0]) && Canvas.GetLeft(food) == Canvas.GetLeft(snake1[0]))
            {
                Border b = new Border();
                b.Width = b.Height = SnakeSize;
                b.CornerRadius = new CornerRadius(90);
                b.Background = food.Background;
                back.Children.Add(b);
                Canvas.SetLeft(b, Canvas.GetLeft(snake1[snake1.Count - 1]));
                Canvas.SetTop(b, Canvas.GetTop(snake1[snake1.Count - 1]));
                Canvas.SetZIndex(b, 3);
                snake1.Add(b);

                food.Background = new RadialGradientBrush(Color.FromRgb((byte)r.Next(0, 256), (byte)r.Next(0, 256), (byte)r.Next(0, 256)), Color.FromRgb((byte)r.Next(0, 256), (byte)r.Next(0, 256), (byte)r.Next(0, 256)));
                Canvas.SetLeft(food, r.Next(0, 20) * rows);
                Canvas.SetTop(food, r.Next(0, 20) * column);
            }
            //碰撞墙壁
            if (Canvas.GetLeft(snake1[0]) >= 800)
            {
                Canvas.SetLeft(snake1[0], 0);
            }
            if (Canvas.GetLeft(snake1[0]) <= -20)
            {
                Canvas.SetLeft(snake1[0], 780);
            } if (Canvas.GetTop(snake1[0]) <= -20)
            {
                Canvas.SetTop(snake1[0], 780);
            } if (Canvas.GetTop(snake1[0]) >= 800)
            {
                Canvas.SetTop(snake1[0], 0);
            }
        }
        //造蛇
        private void CreateSnake()
        {
            for (int i = 0; i < 3; i++)
            {
                Border kk = new Border();
                kk.Width = kk.Height = SnakeSize;
                kk.CornerRadius = new CornerRadius(90);
                kk.Background = new RadialGradientBrush(Color.FromRgb((byte)r.Next(0, 256), (byte)r.Next(0, 256), (byte)r.Next(0, 256)), Color.FromRgb((byte)r.Next(0, 256), (byte)r.Next(0, 256), (byte)r.Next(0, 256)));
                back.Children.Add(kk);
                Canvas.SetLeft(kk, (2 - i) * SnakeSize);
                Canvas.SetTop(kk, rows / 2 * SnakeSize);
                Canvas.SetZIndex(kk, 3);
                snake.Add(kk);
                snake[0].Tag = "D";
            }
        }
        //制造蛇二
        private void CreateSnake1()
        {
            for (int i = 0; i < 3; i++)
            {
                Border kk = new Border();
                kk.Width = kk.Height = SnakeSize;
                kk.CornerRadius = new CornerRadius(90);
                kk.Background = new RadialGradientBrush(Color.FromRgb((byte)r.Next(0, 256), (byte)r.Next(0, 256), (byte)r.Next(0, 256)), Color.FromRgb((byte)r.Next(0, 256), (byte)r.Next(0, 256), (byte)r.Next(0, 256)));
                back.Children.Add(kk);
                Canvas.SetLeft(kk, i * SnakeSize + 740);
                Canvas.SetTop(kk, rows / 2 * SnakeSize);
                Canvas.SetZIndex(kk, 3);
                snake1.Add(kk);
                snake1[0].Tag = "A";
            }
        }

    }
}

通过按键事件以及DispatcherTimer控制蛇的移动,并且DispatcherTimer还实现了蛇吃食物以及食物被吃掉后变换位置,蛇身的加长

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值