分析
1,实现地图,蛇,食物的出现
2,蛇的长度以及蛇头与蛇身的区别
3,食物的随机位置
4,实现开始继续让蛇停止与继续移动
5,蛇吃到食物加分数
6,蛇碰撞到墙壁或者蛇身就会死亡
代码实现
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;
using System.Media;
using System.Data.SqlClient;
namespace WpfApp1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//窗体边框不显示
this.WindowStyle = WindowStyle.None;
}
DispatcherTimer moverTimer = new DispatcherTimer();//计时器
Random ra = new Random();//创建随机数,食物所需要
Border food = new Border();//创建食物
int fenshu = 0; //记录分数
Label feng = new Label(); // 分数对象
List<Border> snake = new List<Border>();
//更方便计算
double size = 20;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.Background = Brushes.Transparent;
//全屏显示
this.WindowState = WindowState.Maximized;
this.Background = Brushes.Transparent;
//颜色渐变
continer.Background = new RadialGradientBrush(Colors.White,Colors.Blue);
//正常显示
continer.Width = this.Width;
continer.Height = this.Height;
feng.Width = 120;
feng.Height = 50;
Canvas.SetLeft(feng, 1060);
Canvas.SetTop(feng, 100);
feng.Background = Brushes.Coral;
feng.Foreground = Brushes.DeepSkyBlue;
feng.Content = " 得分:" + fenshu ;
feng.FontFamily = new FontFamily("楷体");
feng.FontSize = 20;
continer.Children.Add(feng);
Button Kaise = new Button();
Kaise.Cursor = Cursors.Hand; // 鼠标移动到按钮处变成手型
Kaise.Width = 120;
Kaise.Height = 50;
Canvas.SetLeft(Kaise, 1060);
Canvas.SetTop(Kaise, 160);
Kaise.Content = "开始游戏";
Kaise.FontFamily = new FontFamily("楷体");
Kaise.BorderBrush = Brushes.Cyan; // 边框颜色
Kaise.Foreground = Brushes.DarkRed; // 字体颜色
Kaise.FontSize = 20;
Kaise.Background = Brushes.BurlyWood;
Kaise.Click += Kaise_Click;
continer.Children.Add(Kaise);
Button Zanting = new Button();
Zanting.Cursor = Cursors.Hand; // 鼠标移动到按钮处变为手型
Zanting.Width = 120;
Zanting.Height = 50;
Canvas.SetLeft(Zanting, 1060);
Canvas.SetTop(Zanting, 220);
Zanting.Content = "暂停游戏";
Zanting.FontFamily = new FontFamily("楷体");
Zanting.BorderBrush = Brushes.Cyan;
Zanting.Foreground = Brushes.DarkRed;
Zanting.FontSize = 20;
Zanting.Background = Brushes.BurlyWood;
Zanting.Click += Zanting_Click;
continer.Children.Add(Zanting);
moverTimer.Interval = TimeSpan.FromMilliseconds(100);
moverTimer.Tick += MoverTimer_Tick;
//moverTimer.Start();
CreateSnake();
CreateDouDou();
//添加键盘事件
this.KeyDown += MainWindow_KeyDown;
}
private void Kaise_Click(object sender, RoutedEventArgs e)
{
moverTimer.Start();
}
private void Zanting_Click(object sender, RoutedEventArgs e)
{
moverTimer.Stop();
}
private void MainWindow_KeyDown(object sender, KeyEventArgs e)
{
//识别键盘按钮,而设置标签
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;
}
}
private void MoverTimer_Tick(object sender, EventArgs e)
{
//蛇的长度
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 (snake.Count > 0 && Canvas.GetTop(snake[0]) == Canvas.GetTop(food) && Canvas.GetLeft(snake[0]) == Canvas.GetLeft(food))
{
fenshu++;
Canvas.SetLeft(food, ra.Next(geziNumX) * size);
Canvas.SetTop(food, ra.Next(geziNumY) * size);
Border tianjia = new Border();//增添蛇身
tianjia.Width = tianjia.Height = size;
tianjia.Tag = " ";
tianjia.Background = Brushes.Green;
tianjia.CornerRadius = new CornerRadius(20); // 变圆
Canvas.SetLeft(tianjia, Canvas.GetLeft(snake[snake.Count - 1])); // 获取到蛇尾的Left位置
Canvas.SetTop(tianjia, Canvas.GetTop(snake[snake.Count - 1])); // 获取到蛇尾的Top位置
continer.Children.Add(tianjia);
snake.Add(tianjia);
feng.Content = " 得分:" + fenshu ;
}
for (int i = 1; i < snake.Count; i++)
{
// 蛇头碰到蛇身
if (Canvas.GetTop(snake[0]) == Canvas.GetTop(snake[i]) && Canvas.GetLeft(snake[0]) == Canvas.GetLeft(snake[i]))
{
MessageBox.Show("游戏结束");
moverTimer.Stop();
}
//蛇头碰到墙
if (Canvas.GetTop(snake[0]) <= 0 || Canvas.GetTop(snake[0]) == continer.Height || Canvas.GetLeft(snake[0]) <= 0 || Canvas.GetLeft(snake[0]) == continer.Width)
{
MessageBox.Show("游戏结束");
moverTimer.Stop();
}
}
}
int geziNumX = 60;
int geziNumY = 40;
//创建蛇元素
private void CreateSnake()
{
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.Black;
}
else {
//
br.Background = Brushes.Green;
}
br.CornerRadius = new CornerRadius(20);
// 位置
Canvas.SetLeft(br,(geziNumX/2)*size-i*size);
Canvas.SetTop(br, (geziNumY/2)*size);
continer.Children.Add(br);
snake.Add(br);
}
}
//创建食物
private void CreateDouDou()
{
food.Width = food.Height = size;
//食物颜色
food.Background = new RadialGradientBrush(Colors.Red, Colors.Red);
food.CornerRadius = new CornerRadius(5);
//随机位置
Canvas.SetLeft(food,ra.Next(geziNumX)*size);
Canvas.SetTop(food, ra.Next(geziNumY) * size);
continer.Children.Add(food);
}
}
}