C#应用案例之贪吃蛇
程序员文章站
2022-07-02 17:52:25
...
本次的应用案例用到为WPF 应用
需要解决的问题(过程)
1.创建蛇 这里我们可以封装一个方法(私有的)用来装蛇的头部和身体 为蛇设置初始出现的位置已及初始的移动方向
2.创建食物 也封装一个方法(私有的)用来装食物 食物应该随机的出现在游戏界面的任何地方
3.创建键盘事件用键盘的方向键来控制蛇的(上下左右)移动,并用计时器来控制蛇的移动
4.创建游戏开始和暂停的按钮 用来控制蛇移动的计时器的开和关
5.当蛇的头部碰撞到食物时,将食物随机到其他位置并为蛇创建一节新的身体(相当于蛇吃掉食物增加身体长度)
6.当蛇的头部碰到了游戏界面的边界或自己的身体时,暂停游戏并给出提示(撞到了墙…咬到了自己…)
7.创建label控件记录所得的分数(所吃的食物数)
游戏界面展示
代码展示
为保证程序的正常运行将以下代码写在全局中
int size = 20; //设置大小
DispatcherTimer movetimer = new DispatcherTimer(); //创建计时器
Button ks = new Button(); //创建开始按钮
List<Border> snake = new List<Border>(); //<>表示泛型 //括号中可以是任意类型 list表示集合
int df = 0; //记录得分
Border food = new Border(); //创建食物
Label defen = new Label(); //创建label积分板
int gezix = 50;
int geziy = 30;
Random ra = new Random(); //创建随机对象
设置 MainWindow
this.WindowStyle = WindowStyle.None; //设置窗体无边框样式
this.AllowsTransparency = true; //允许窗体透明
设置窗体的属性(在加载事件中设置)
this.Background = Brushes.Transparent; //设置窗体的背景颜色为透明
this.WindowState = WindowState.Maximized; //将窗体最大化
jiemian.Background = new RadialGradientBrush(Colors.White,Colors.Yellow); //将canvas的背景颜色为环形渐变
创建蛇
//封装一个方法 创建蛇的对象 私有的
private void CreateSnake()
{
//创建初始的4节蛇身
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.Red;
}
else
{
br.Background = Brushes.Pink;
}
br.CornerRadius = new CornerRadius(20);
//设置蛇初始出现的位置
Canvas.SetLeft(br,(gezix/2)*size-i*size);
Canvas.SetTop(br,(geziy/2)*size);
jiemian.Children.Add(br);
snake.Add(br);
}
}
创建食物
//封装一个方法 创建食物的对象 私有的
private void CreateDouDou()
{
food.Width = size;
food.Height = size;
food.Background = new RadialGradientBrush(Colors.Red,Colors.Blue);
food.CornerRadius = new CornerRadius(20);
//随机食物初始出现的位置
Canvas.SetLeft(food,ra.Next(gezix)*size);
Canvas.SetTop(food,ra.Next(geziy)*size);
jiemian.Children.Add(food); //将食物添加到游戏中去
}
创建键盘事件
this.KeyDown += MainWindow_KeyDown; //创建键盘事件
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;
}
创建timer计时器令蛇进行移动
movetimer.Interval = TimeSpan.FromMilliseconds(200); //时间的设置
movetimer.Tick += Movetimer_Tick; //创建计时器的事件
timer计时器的事件
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 (Canvas.GetLeft(snake[0])==Canvas.GetLeft(food)&&Canvas.GetTop(snake[0])==Canvas.GetTop(food))
//如果蛇的头部碰到了食物
{
//计算得分
df += 1;
defen.Content = "你的得分为:" + df + "分";
//碰到了食物随机改变食物的位置(相当于生成新的食物)
Canvas.SetLeft(food, ra.Next(gezix) * size);
Canvas.SetTop(food,ra.Next(geziy)*size);
//碰到了食物后将蛇的长度增加
Border newfood = new Border();
newfood.Width = newfood.Height = size;
newfood.Tag = "Right";
newfood.Background = Brushes.Black;
newfood.CornerRadius = new CornerRadius(20); //将蛇的身体画圆
Canvas.SetLeft(newfood,Canvas.GetLeft(snake[snake.Count-1])-size);
Canvas.SetTop(newfood,Canvas.GetTop(snake[snake.Count-1]));
jiemian.Children.Add(newfood);
snake.Add(newfood);
}
蛇撞墙和咬到自己
//当蛇的头部触碰到了游戏界面的边缘
if (Canvas.GetLeft(snake[0])+size>=jiemian.Width||Canvas.GetLeft(snake[0])<=0||Canvas.GetTop(snake[0])>=jiemian.Height||Canvas.GetTop(snake[0])<=0)
{
MessageBox.Show("可能我撞了南墙才会回头吧!");
}
for (int i = 1; i < snake.Count; i++)
{
//蛇头触碰到了蛇的身体
if (Canvas.GetLeft(snake[0])==Canvas.GetLeft(snake[i])&&Canvas.GetTop(snake[0])==Canvas.GetTop(snake[i]))
{
MessageBox.Show("咬到自己了");
}
}
创建开始游戏按钮
//创建开始游戏的按钮
Button ks = new Button(); //创建开始按钮
ks.Width = size*5; //设置按钮大小
ks.Height = size*2;
ks.FontSize = 16F; //设置字体
ks.Content = "开始游戏"; //设置按钮文本 不同于windows窗体 用content来设置
Canvas.SetTop(ks, 30); //设置按钮位置 不同于windows窗体 canvas.setleft/settop(需要设置的控件的名称,距离左侧/顶部的距离)
jiemian.Children.Add(ks); //将按钮加入到界面中去
在按钮的点击事件中将 timer计时器打开
创建暂停游戏按钮
//创建暂停游戏的按钮
Button zt = new Button();
zt.Width = size * 5;
zt.Height = size * 2;
zt.FontSize = 16F;
zt.Content = "暂停游戏";
Canvas.SetTop(zt, 80);
jiemian.Children.Add(zt);
在按钮的点击事件中将 timer计时器关闭
记录得分
defen.FontSize = 16F; //设置字体大小
defen.Content = "你的得分为:" + df + "分";
jiemian.Children.Add(defen);
上一篇: 基于C# WPF框架的贪吃蛇
下一篇: JavaScript那些你还不知道的事
推荐阅读
-
PHP设计模式之观察者模式入门与应用案例详解
-
C#语法之泛型的多种应用
-
php设计模式之策略模式应用案例详解
-
php设计模式之装饰模式应用案例详解
-
Unity/C#基础复习(5) 之 浅析观察者、中介者模式在游戏中的应用与delegate原理
-
Flink与SparkStreaming之Counters& Accumulators累加器双向应用案例实战-Flink牛刀小试
-
Py之matplotlib&seaborn :高级图可视化之Q-Q分位数图probplot、boxplot箱线图、stripplot分类散点图案例应用及代码实现
-
大数据之Zookeeper(六)-Zookeeper的API应用&监听服务器节点动态上下线案例
-
js微信应用场景之微信音乐相册案例分享
-
C#应用案例之贪吃蛇