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();
}
}