![在这里插入图片描述]()
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 _01_贪吃蛇
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.WindowStyle = WindowStyle.None;
this.AllowsTransparency = true;
}
DispatcherTimer time = new DispatcherTimer();
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.WindowState = WindowState.Maximized;
this.Background = Brushes.Transparent;
//地图
BG.Width = 800;
BG.Height = 600;
BG.Background = Brushes.Green;
BG.Opacity = 0.8;
CreateSnake();
time.Interval = TimeSpan.FromMilliseconds(300);
time.Tick += Time_Tick;
time.Start();
this.KeyDown += MainWindow_KeyDown;
CreateFood();
}
//常量蛇的初始长度
const int snakeLength = 4;
//常量蛇的每节身体的边长
const int snakeSize = 20;
//数组长度不能改变,使用集合
//动态数组,不需要声明长度
/// <summary>
/// 用来存储蛇
/// </summary>
List<Border> snake = new List<Border>();
///<summary>
/// 存储蛇的位置
/// </summary>
List<Border> snakeLocation = new List<Border>();
///<summary>
/// 用来存储蛇2
/// </summary>
List<Border> snake1 = new List<Border>();
///<summary>
/// 存储蛇2的位置
/// </summary>
List<Border> snakeLocation1 = new List<Border>();
#region 创建蛇
///<summary>
/// 创建蛇身体的方法
/// </summary>
void CreateSnake()
{
for (int i = 0; i < snakeLength; i++)
{
//随机色
Brush mamaipi = new SolidColorBrush(Color.FromRgb((byte)r.Next(256), (byte)r.Next(256), (byte)r.Next(256)));
Border br = new Border();
Border location = new Border();//在设置border用来记录蛇的位置,只设置left,top属性
br.Width = br.Height = snakeSize;
br.CornerRadius = new CornerRadius(10);
Canvas.SetLeft(br, 100 - i * snakeSize);
Canvas.SetTop(br, 100);
Canvas.SetTop(location, Canvas.GetTop(br));
Canvas.SetLeft(location, Canvas.GetLeft(br));
//判断蛇头金色
if (i==0)
{
br.Background = Brushes.Red;
}
else
{
// br.Background = Brushes.Cyan;
br.Background = mamaipi;
br.BorderThickness = new Thickness(3);
br.BorderBrush = Brushes.White;
}
BG.Children.Add(br);
snake.Add(br);
BG.Children.Add(location);
snakeLocation.Add(location);
}
for (int i = 0; i < snakeLength; i++)
{
Brush mamaipi = new SolidColorBrush(Color.FromRgb((byte)r.Next(256), (byte)r.Next(256), (byte)r.Next(256)));
Border br1 = new Border();
Border location1 = new Border();//在设置border用来记录蛇的位置,只设置left,top属性
br1.Width = br1.Height = snakeSize;
br1.CornerRadius = new CornerRadius(10);
Canvas.SetLeft(br1, 100 - i * snakeSize);
Canvas.SetTop(br1, BG.Height-100);
Canvas.SetTop(location1, Canvas.GetTop(br1));
Canvas.SetLeft(location1, Canvas.GetLeft(br1));
if (i==0)
{
br1.Background = Brushes.White;
}
else
{
// br1.Background = Brushes.Gold;
br1.Background = mamaipi;
br1.BorderThickness = new Thickness(3);
br1.BorderBrush = Brushes.Cyan;
}
BG.Children.Add(br1);
snake1.Add(br1);
BG.Children.Add(location1);
snakeLocation1.Add(location1);
}
nextPositionx = Canvas.GetLeft(snake[0]);
nextPosutiony = Canvas.GetTop(snake[0]);
nextPositionx1 = Canvas.GetLeft(snake1[0]);
nextPOsutiony1 = Canvas.GetTop(snake1[0]);
}
string direction = "right";
string direction1 = "right1";
bool islife = true;
bool islife1 = true;
double nextPositionx;
double nextPosutiony;
double nextPositionx1;
double nextPOsutiony1;
#endregion
private void Time_Tick(object sender, EventArgs e)
{
//snake头部移动
//向右
if (direction=="right")
{
//Canvas.SetLeft(snake[0], Canvas.GetLeft(snake[0]) + snakeSize);
//预判:预算出下一步移动的坐标位置
nextPositionx = Canvas.GetLeft(snake[0]) + snakeSize;
}
//向左
if (direction == "left")
{
//Canvas.SetLeft(snake[0], Canvas.GetLeft(snake[0]) - snakeSize);
nextPositionx = Canvas.GetLeft(snake[0]) - snakeSize;
}
//向上
if (direction == "up")
{
//Canvas.SetTop(snake[0], Canvas.GetTop(snake[0]) - snakeSize);
nextPosutiony = Canvas.GetTop(snake[0]) - snakeSize;
}
//向下
if (direction == "down")
{
//Canvas.SetTop(snake[0], Canvas.GetTop(snake[0]) + snakeSize);
nextPosutiony = Canvas.GetTop(snake[0]) + snakeSize;
}
//snak1头部移动
if (direction1 == "right1")
{
// Canvas.SetLeft(snake1[0], Canvas.GetLeft(snake1[0]) + snakeSize);
nextPositionx1 = Canvas.GetLeft(snake1[0]) + snakeSize;
}
//向左
if (direction1 == "left1")
{
// Canvas.SetLeft(snake1[0], Canvas.GetLeft(snake1[0]) - snakeSize);
nextPositionx1 = Canvas.GetLeft(snake1[0]) - snakeSize;
}
//向上
if (direction1 == "up1")
{
// Canvas.SetTop(snake1[0], Canvas.GetTop(snake1[0]) - snakeSize);
nextPOsutiony1 = Canvas.GetTop(snake1[0]) - snakeSize;
}
//向下
if (direction1 == "down1")
{
// Canvas.SetTop(snake1[0], Canvas.GetTop(snake1[0]) + snakeSize);
nextPOsutiony1 = Canvas.GetTop(snake1[0]) + snakeSize;
}
//判断刚才预判的目标位置是否是死亡位置,如果是死亡位置则设置蛇的状态为死亡状态
if (nextPositionx < 0 || nextPositionx > BG.Width - snakeSize || nextPosutiony < 0 || nextPosutiony > BG.Height - snakeSize)
{
islife = false;
// MessageBox.Show("你撞死了!");
}
if (nextPositionx1<0||nextPositionx1>BG.Width-snakeSize||nextPOsutiony1<0||nextPOsutiony1>BG.Height-snakeSize)
{
islife1 = false;
// MessageBox.Show("你撞死了!");
}
if (islife)
{
Canvas.SetLeft(snake[0], nextPositionx);
Canvas.SetTop(snake[0], nextPosutiony);
//snake身体移动(把前一节的位置给后一节)
for (int i = 1; i < snake.Count; i++)
{
Canvas.SetLeft(snake[i], Canvas.GetLeft(snakeLocation[i - 1]));
Canvas.SetTop(snake[i], Canvas.GetTop(snakeLocation[i - 1]));
}
//重新记录蛇snake的位置
for (int i = 0; i < snakeLocation.Count; i++)
{
Canvas.SetLeft(snakeLocation[i], Canvas.GetLeft(snake[i]));
Canvas.SetTop(snakeLocation[i], Canvas.GetTop(snake[i]));
}
}
if (islife1)
{
Canvas.SetLeft(snake1[0], nextPositionx1);
Canvas.SetTop(snake1[0], nextPOsutiony1);
//snake1身体移动
for (int i = 1; i < snake1.Count; i++)
{
Canvas.SetLeft(snake1[i], Canvas.GetLeft(snakeLocation1[i - 1]));
Canvas.SetTop(snake1[i], Canvas.GetTop(snakeLocation1[i - 1]));
}
//重新记录蛇snake1的位置
for (int i = 0; i < snakeLocation1.Count; i++)
{
Canvas.SetLeft(snakeLocation1[i], Canvas.GetLeft(snake1[i]));
Canvas.SetTop(snakeLocation1[i], Canvas.GetTop(snake1[i]));
}
}
#region 判断蛇吃到食物重新改变食物的位置
//判断蛇snake是否吃到食物
if (Canvas.GetLeft(snake[0]) == Canvas.GetLeft(food) && Canvas.GetTop(snake[0]) == Canvas.GetTop(food))
{
int countRows = (int)BG.Width / snakeSize;
int countCols = (int)BG.Height / snakeSize;
Canvas.SetLeft(food, r.Next(countRows) * snakeSize);
Canvas.SetTop(food, r.Next(countCols) * snakeSize);
//snake长身体
ChangeBody();
}
//判断蛇snake1是否吃到食物
if (Canvas.GetLeft(snake1[0]) == Canvas.GetLeft(food) && Canvas.GetTop(snake1[0]) == Canvas.GetTop(food))
{
int countRows = (int)BG.Width / snakeSize;
int countCols = (int)BG.Height / snakeSize;
Canvas.SetLeft(food, r.Next(countRows) * snakeSize);
Canvas.SetTop(food, r.Next(countCols) * snakeSize);
//snake1长身体
ChangeBody1();
}
#endregion
#region 判断吃到自己
//判断吃到自己
for (int i = 1; i < snake.Count ; i++)
{
if (nextPositionx == Canvas.GetLeft(snake[i]) && nextPosutiony == Canvas.GetTop(snake[i]))
{
islife = false;
}
}
for (int i = 1; i < snake1.Count; i++)
{
if (nextPositionx1 == Canvas.GetLeft(snake1[i]) && nextPOsutiony1 == Canvas.GetTop(snake1[i]))
{
islife1 = false;
}
}
#endregion
}
private void ChangeBody()
{
Brush mamaipi = new SolidColorBrush(Color.FromRgb((byte)r.Next(256), (byte)r.Next(256), (byte)r.Next(256)));
Border br = new Border();
br.Width = br.Height = snakeSize;
br.CornerRadius = new CornerRadius(20);
br.Background =mamaipi;
br.BorderThickness = new Thickness(3);
br.BorderBrush = Brushes.White;
Canvas.SetLeft(br, Canvas.GetLeft(snake[snake.Count - 1]));
Canvas.SetTop(br, Canvas.GetTop(snake[snake.Count - 1]));
Border location = new Border();
Canvas.SetLeft(location, Canvas.GetLeft(br));
Canvas.SetTop(location, Canvas.GetTop(br));
snakeLocation.Add(location);
BG.Children.Add(br);
BG.Children.Add(location);
snake.Add(br);
}
private void ChangeBody1()
{
Brush mamaipi = new SolidColorBrush(Color.FromRgb((byte)r.Next(256), (byte)r.Next(256), (byte)r.Next(256)));
Border br = new Border();
br.Width = br.Height = snakeSize;
br.CornerRadius = new CornerRadius(20);
br.Background = mamaipi;
br.BorderThickness = new Thickness(3);
br.BorderBrush = Brushes.White;
Canvas.SetLeft(br, Canvas.GetLeft(snake1[snake1.Count - 1]));
Canvas.SetTop(br, Canvas.GetTop(snake1[snake1.Count - 1]));
Border location1 = new Border();
Canvas.SetLeft(location1, Canvas.GetLeft(br));
Canvas.SetTop(location1, Canvas.GetTop(br));
snakeLocation1.Add(location1);
BG.Children.Add(br);
BG.Children.Add(location1);
snake1.Add(br);
}
private void MainWindow_KeyDown(object sender, KeyEventArgs e)
{
//switch{
// case Key.Up:
// direction = "up";
// break;
// case Key.Down:
// direction = "down";
// break;
// case Key.Left:
// direction = "left";
// break;
// case Key.Right:
// direction = "right";
// break;
// case Key.W:
// direction1 = "up1";
// break;
// case Key.S:
// direction1 = "down1";
// break;
// case Key.A:
// direction1 = "left1";
// break;
// case Key.D:
// direction1 = "right1";
// break;
// default:
// break;
//}
if (e.Key==Key.Up&&direction!="down")
{
direction = "up";
}
if (e.Key==Key.Down&&direction!="up")
{
direction = "down";
}
if (e.Key==Key.Left&&direction!="right")
{
direction = "left";
}
if (e.Key==Key.Right&&direction!="left")
{
direction = "right";
}
if (e.Key==Key.W&&direction1!="down1")
{
direction1 = "up1";
}
if (e.Key==Key.S&&direction1!="up1")
{
direction1 = "down1";
}
if (e.Key==Key.A&&direction1!="right1")
{
direction1 = "left1";
}
if (e.Key==Key.D&&direction1!="left1")
{
direction1 = "right1";
}
//}
}
Random r = new Random();
Border food = new Border();
void CreateFood()
{
int countRows = (int)BG.Width / snakeSize;
int countCols = (int)BG.Height / snakeSize;
food.Width = food.Height = snakeSize;
food.CornerRadius = new CornerRadius(20);
food.Background = new RadialGradientBrush(Colors.Red, Colors.Orange);
Canvas.SetLeft(food, r.Next(countRows) * snakeSize);
Canvas.SetTop(food, r.Next(countCols) * snakeSize);
BG.Children.Add(food);
}
}
}