两条蛇 分别利用鼠标和键盘进行控制
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 _02贪吃蛇
{
/// <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 =400;
BG.Height = 400;
BG.Background = Brushes.SkyBlue;
BG.Opacity = 0.9;
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;
//动态数组不需要声明长度,数组内容根据填充的类型随意改变数量
#region 蛇1
/// <summary>
/// 动态数组,用来存储蛇
/// </summary>
List<Border> snake = new List<Border>();
/// <summary>
/// 用来存储位置
/// </summary>
List<Border> snakeLocation = new List<Border>();
#endregion
#region 蛇2
List<Border> snake02 = new List<Border>();
List<Border> snakeLocation02 = new List<Border>();
#endregion
#region 创建蛇
/// <summary>
/// 创建蛇的方法
/// </summary>
void CreateSnake()
{
for (int i = 0; i < snakeLength; i++)
{
//创造蛇1的border
Border br = new Border();
br.Width = br.Height = snakeSize;
br.CornerRadius = new CornerRadius(10);
Canvas.SetTop(br, 100);
Canvas.SetLeft(br, 100 - i * snakeSize);
//创造蛇1的位置的border
Border location = new Border();
Canvas.SetTop(location, Canvas.GetTop(br));
Canvas.SetLeft(location, Canvas.GetLeft(br));
//创造蛇2的border
Border br02 = new Border();
br02.Width = br02.Height = snakeSize;
br02.CornerRadius = new CornerRadius(10);
Canvas.SetTop(br02, 200);
Canvas.SetLeft(br02, 100 - i * snakeSize);
//创造蛇2的位置的border
Border location02 = new Border();
Canvas.SetTop(location02, Canvas.GetTop(br02));
Canvas.SetLeft(location02, Canvas.GetLeft(br02));
//判断蛇头
if (i == 0)
{
br.Background = Brushes.Tomato;
br02.Background = Brushes.Pink;
}
else
{
br.Background = Brushes.Pink;
br02.Background = Brushes.Tomato;
}
//将border装入snake数组中
snake.Add(br);
BG.Children.Add(br);
snakeLocation.Add(location);
BG.Children.Add(location);
snake02.Add(br02);
BG.Children.Add(br02);
snakeLocation02.Add(location02);
BG.Children.Add(location02);
}
nextpositionX = Canvas.GetLeft(snake[0]);
nextpositionY = Canvas.GetTop(snake[0]);
nextpositionX02 = Canvas.GetLeft(snake02[0]);
nextpositionY02 = Canvas.GetTop(snake02[0]);
}
#endregion
#region 蛇的移动
//判断蛇是否活着
bool islife = true;
double nextpositionX;
double nextpositionY;
bool islife02= true;
double nextpositionX02;
double nextpositionY02;
/// <summary>
/// 蛇的移动
/// </summary>
private void Time_Tick(object sender, EventArgs e)
{
#region 控制蛇1的移动
//向右
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);
//预判:预算出下一步移动的坐标
nextpositionY = Canvas.GetTop(snake[0]) - snakeSize;
}
//向下
if (direction == "down")
{
// Canvas.SetTop(snake[0], Canvas.GetTop(snake[0]) + snakeSize);
//预判:预算出下一步移动的坐标
nextpositionY = Canvas.GetTop(snake[0]) + snakeSize;
}
#endregion
//判断刚才预判的目标位置是否是死亡位置,如果是死亡位置,设置蛇的状态是死亡状态
//判断蛇1撞墙死亡
if (nextpositionX < 0 || nextpositionX > BG.Width - snakeSize || nextpositionY < 0 || nextpositionY > BG.Height - snakeSize)
{
islife = false;
//MessageBox.Show("撞墙死亡!");
//time.Stop();
}
//判断蛇1吃到自己死亡
for (int i = 1; i < snake.Count; i++)
{
if (nextpositionX == Canvas.GetLeft(snake[i]) && nextpositionY == Canvas.GetTop(snake[i]))
{
islife = false;
//time.Stop();
//MessageBox.Show("吃到自己了!");
}
}
//判断蛇1的头碰到蛇2的身体或者蛇2的头碰到蛇1的身体一起死
//for (int i = 1; i < snake.Count; i++)
//{
// if (nextpositionX == Canvas.GetLeft(snake02[i]) && nextpositionY == Canvas.GetTop(snake02[i
// ]))
// {
// islife = false;
// //time.Stop();
// //MessageBox.Show("吃到别人了!");
// }
//}
//只有当蛇处于活着的状态时,才进行移动,吃食物等;
if (islife)
{
Canvas.SetLeft(snake[0], nextpositionX);
Canvas.SetTop(snake[0], nextpositionY);
//移动蛇1身体的border
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]));
}
//移动蛇1的位置的border
for (int i = 0; i < snakeLocation.Count; i++)
{
Canvas.SetLeft(snakeLocation[i], Canvas.GetLeft(snake[i]));
Canvas.SetTop(snakeLocation[i], Canvas.GetTop(snake[i]));
}
}
//判断蛇1是否吃到食物
if (Canvas.GetLeft(food) == Canvas.GetLeft(snake[0]) && Canvas.GetTop(food) == Canvas.GetTop(snake[0]))
{
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);
//蛇长身体
CreateBody();
}
#region 控制蛇2的移动
//向右
if (direction02 == "right02")
{
//Canvas.SetLeft(snake02[0], Canvas.GetLeft(snake02[0]) + snakeSize);
//预判:预算出下一步移动的坐标
nextpositionX02 = Canvas.GetLeft(snake02[0]) + snakeSize;
}
//向左
if (direction02 == "left02")
{
// Canvas.SetLeft(snake02[0], Canvas.GetLeft(snake02[0]) - snakeSize);
//预判:预算出下一步移动的坐标
nextpositionX02 = Canvas.GetLeft(snake02[0]) - snakeSize;
}
//向上
if (direction02 == "up02")
{
// Canvas.SetTop(snake02[0], Canvas.GetTop(snake02[0]) - snakeSize);
//预判:预算出下一步移动的坐标
nextpositionY02 = Canvas.GetTop(snake02[0]) - snakeSize;
}
//向下
if (direction02 == "down02")
{
// Canvas.SetTop(snake02[0], Canvas.GetTop(snake02[0]) + snakeSize);
//预判:预算出下一步移动的坐标
nextpositionY02 = Canvas.GetTop(snake02[0]) + snakeSize;
}
#endregion
//判断刚才预判的目标位置是否是死亡位置,如果是死亡位置,设置蛇的状态是死亡状态
//判断蛇2撞墙死亡
if (nextpositionX02 < 0 || nextpositionX02 > BG.Width - snakeSize || nextpositionY02 < 0 || nextpositionY02 > BG.Height - snakeSize)
{
islife02 = false;
//MessageBox.Show("撞墙死亡!");
//time.Stop();
}
//判断蛇2吃到自己死亡
for (int i = 1; i < snake02.Count; i++)
{
if (nextpositionX02 == Canvas.GetLeft(snake02[i]) && nextpositionY02 == Canvas.GetTop(snake02[i]))
{
islife = false;
MessageBox.Show("吃到自己了!");
time.Stop();
}
}
//判断蛇2的头碰到蛇1的身体或者蛇1的头碰到蛇2的身体一起死
//for (int i = 0; i < snake02.Count; i++)
//{
// if (nextpositionX02 == Canvas.GetLeft(snake[i]) && nextpositionY02 == Canvas.GetTop(snake[i]))
// {
// islife = false;
// time.Stop();
// MessageBox.Show("吃到别人了!");
// }
//}
if (islife02)
{
Canvas.SetLeft(snake02[0], nextpositionX02);
Canvas.SetTop(snake02[0], nextpositionY02);
//移动蛇2身体的border
for (int i = 1; i < snake02.Count; i++)
{
Canvas.SetLeft(snake02[i], Canvas.GetLeft(snakeLocation02[i - 1]));
Canvas.SetTop(snake02[i], Canvas.GetTop(snakeLocation02[i - 1]));
}
//移动蛇2的位置的border
for (int i = 0; i < snakeLocation02.Count; i++)
{
Canvas.SetLeft(snakeLocation02[i], Canvas.GetLeft(snake02[i]));
Canvas.SetTop(snakeLocation02[i], Canvas.GetTop(snake02[i]));
}
}
//判断蛇2是否吃到食物
if (Canvas.GetLeft(food) == Canvas.GetLeft(snake02[0]) && Canvas.GetTop(food) == Canvas.GetTop(snake02[0]))
{
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);
//蛇2长身体
CreateBody02();
}
}
//蛇1长身体的方法
void CreateBody()
{
Brush bodycolor = 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 = Brushes.Pink;
Canvas.SetLeft(br,Canvas.GetLeft(snake[snake.Count-1]));
Canvas.SetTop(br,Canvas.GetTop(snake[snake.Count-1]));
br.Background = bodycolor;
Border location = new Border();
Canvas.SetLeft(location, Canvas.GetLeft(br));
Canvas.SetTop(location,Canvas.GetTop(br));
snake.Add(br);
BG.Children.Add(br);
snakeLocation.Add(location);
BG.Children.Add(location);
}
//蛇2长身体的方法
void CreateBody02()
{
Brush bodycolor02 = new SolidColorBrush(Color.FromRgb((byte)r.Next(256), (byte)r.Next(256), (byte)r.Next(256)));
Border br02 = new Border();
br02.Width = br02.Height = snakeSize;
br02.CornerRadius = new CornerRadius(20);
//br02.Background = Brushes.Tomato;
br02.Background = bodycolor02;
Canvas.SetLeft(br02, Canvas.GetLeft(snake02[snake02.Count - 1]));
Canvas.SetTop(br02, Canvas.GetTop(snake02[snake02.Count - 1]));
Border location02 = new Border();
Canvas.SetLeft(location02, Canvas.GetLeft(br02));
Canvas.SetTop(location02, Canvas.GetTop(br02));
snake02.Add(br02);
BG.Children.Add(br02);
snakeLocation02.Add(location02);
BG.Children.Add(location02);
}
#endregion
#region 键盘事件
//定义一个方向
string direction = "right";
string direction02 = "right02";
/// <summary>
/// 键盘事件
/// </summary>
private void MainWindow_KeyDown(object sender, KeyEventArgs e)
{
#region switch方法
//switch (e.Key)
//{
// 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:
// direction02 = "up02";
// break;
// case Key.S:
// direction02 = "down02";
// break;
// case Key.A:
// direction02 = "left02";
// break;
// case Key.D:
// direction02 = "right02";
// break;
// default:
// break;
//}
#endregion
//蛇1
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";
}
//蛇2
if (e.Key == Key.W && direction02 != "down02")
{
direction02 = "up02";
}
if (e.Key == Key.S && direction02 != "up02")
{
direction02 = "down02";
}
if (e.Key == Key.A && direction02 != "right02")
{
direction02 = "left02";
}
if (e.Key == Key.D && direction02 != "left02")
{
direction02 = "right02";
}
}
#endregion
#region 创建食物
Border food = new Border();
Random r = new Random();
/// <summary>
/// 创建食物的方法
/// </summary>
void CreateFood()
{
//X轴方向的格子数
int countRows = (int)BG.Width / snakeSize;
//Y轴方向的格子数
int countCols = (int)BG.Height / snakeSize;
food.Width = food.Height = snakeSize;
food.CornerRadius = new CornerRadius(10);
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);
}
#endregion
}
}