文章目录

  • 一、贪食蛇游戏分析
  • 二、代码实现
  • 三、效果图

一、贪食蛇游戏分析

  1. 创建两个区域,即:游戏区域、控制区域
  2. 分别设置两个区域的样式
  3. 在游戏区域,创建蛇(设置其相关属性)
  4. 在游戏区域,创建食物(设置其相关属性)
  5. 通过键盘操控,使蛇动起来(获取键盘按下的键,触发键盘按下事件)
  6. 当蛇头的坐标完全等于食物时,吃掉食物(随机食物位置)
  7. 给蛇自己增加一节(注意:增加一节的位置)
  8. 碰到墙壁时,游戏结束
  9. 碰到自己时,游戏结束
  10. 给蛇吃食物、死亡,添加音效
  11. 给控制区域,添加“开始、暂停”按钮(通过开启、关闭计时器)
  12. 添加计分功能(蛇吃到食物时,分数+1)
  13. 蛇死亡时,弹出最终得分

二、代码实现

1、XAML代码

<Window x:Class="SnakeTest2.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:SnakeTest2"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" Loaded="MainWindow_OnLoaded"><Canvas Name="CanvasAll"><Canvas Name="CanvasLeft"></Canvas><Canvas Name="CanvasRight"></Canvas></Canvas>
</Window>

2、CS代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Media;
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 SnakeTest2
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();// 设置窗体最大化this.WindowState = WindowState.Maximized;// 去掉窗体样式this.WindowStyle = WindowStyle.None;}//初始化游戏开始、暂停按钮Button btn = new Button();//创建计时器DispatcherTimer timerStart = new DispatcherTimer();//实现计分板Label lab = new Label();//创建得分private int result = 0;private void MainWindow_OnLoaded(object sender, RoutedEventArgs e){// 设置容器大小等于窗体CanvasAll.Width = this.Width;CanvasAll.Height = this.Height;// 设置游戏区域样式CanvasLeft.Width = 0.75 * CanvasAll.Width;CanvasLeft.Height = CanvasAll.Height;CanvasLeft.Background = new LinearGradientBrush(Colors.Chartreuse, Colors.Orange,45);Canvas.SetLeft(CanvasLeft,0);// 设置控制区域大小CanvasRight.Width = 0.25 * CanvasAll.Width;CanvasRight.Height = CanvasAll.Height;CanvasRight.Background = Brushes.Aquamarine;Canvas.SetLeft(CanvasRight, Canvas.GetLeft(CanvasLeft)+CanvasLeft.Width);// 创建一条蛇creatSnake(50,snakeList);// 创建食物creatFood(50);// 鼠标按下this.KeyDown += MainWindow_KeyDown;timerStart.Interval = TimeSpan.FromMilliseconds(400);timerStart.Tick += TimerStart_Tick;btn.Width = CanvasRight.Width;btn.Height = 100;btn.FontSize = 32;btn.FontFamily = new FontFamily("楷体");btn.Content = "游戏开始";btn.Background = Brushes.CornflowerBlue;btn.Click += Btn_Click;CanvasRight.Children.Add(btn);lab.Width = CanvasRight.Width;lab.Height = 100;lab.FontSize = 32;lab.Foreground = Brushes.PaleVioletRed;lab.HorizontalAlignment = HorizontalAlignment.Center;lab.FontFamily = new FontFamily("楷体");lab.Background = Brushes.Aquamarine;Canvas.SetTop(lab, 100);Canvas.SetLeft(lab, 120);CanvasRight.Children.Add(lab);}/// <summary>/// 按钮点击事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Btn_Click(object sender, RoutedEventArgs e){if (btn.Content == "游戏开始"){timerStart.Start();btn.Content = "游戏暂停";}else{timerStart.Stop();btn.Content = "游戏开始";}}/// <summary>/// 计时器事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void TimerStart_Tick(object sender, EventArgs e){moveSnake(snakeList, 50);eatFood(snakeList,50);overSnake(snakeList);lab.Content = "总分:" + result;}/// <summary>/// 蛇移动的方法/// </summary>/// <param name="size"></param>protected void moveSnake(List<Border> snake, int size){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;}}/// <summary>/// 鼠标按下事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void MainWindow_KeyDown(object sender, KeyEventArgs e){// MessageBox.Show(e.Key.ToString());switch (e.Key){case Key.Right:snakeList[0].Tag = "Right";break;case Key.Left:snakeList[0].Tag = "Left";break;case Key.Up:snakeList[0].Tag = "Up";break;case Key.Down:snakeList[0].Tag = "Down";break;}}// 创建代表蛇的泛型ListList<Border> snakeList = new List<Border>();// 创建随机数对象Random ra = new Random();/// <summary>/// 创建蛇的方法/// </summary>/// <param name="size"></param>protected void creatSnake(int size,List<Border> snake){for (int i = 0; i < 4; i++){Border cSnake = new Border();cSnake.Width = cSnake.Height = size;cSnake.Tag = "Right";if (i == 0){cSnake.Background = Brushes.Red;}else{cSnake.Background = Brushes.Blue;}Canvas.SetLeft(cSnake,400-i*size);Canvas.SetTop(cSnake,200);cSnake.CornerRadius = new CornerRadius(size);CanvasLeft.Children.Add(cSnake);snake.Add(cSnake);}}Border cFood = new Border();/// <summary>/// 创建食物的方法/// </summary>/// <param name="size"></param>protected void creatFood(int size){cFood.Width = cFood.Height = size;cFood.Background = Brushes.DarkViolet;Canvas.SetLeft(cFood, ra.Next(Convert.ToInt32(CanvasLeft.Width / size)) * size);Canvas.SetTop(cFood,ra.Next(Convert.ToInt32(CanvasLeft.Height / size)) * size);cFood.CornerRadius = new CornerRadius(size);CanvasLeft.Children.Add(cFood);}/// <summary>/// 吃食物/// </summary>/// <param name="snake"></param>/// <param name="size"></param>protected void eatFood(List<Border> snake, int size){if (Canvas.GetLeft(snake[0]) == Canvas.GetLeft(cFood) && Canvas.GetTop(snake[0]) == Canvas.GetTop(cFood)){++result;SoundPlayer player = new SoundPlayer();player.SoundLocation = "../../sounds/三全音.wav";player.Play();Canvas.SetLeft(cFood, ra.Next(Convert.ToInt32(CanvasLeft.Width / size)) * size);Canvas.SetTop(cFood, ra.Next(Convert.ToInt32(CanvasLeft.Height / size)) * size);// 创建一节蛇 Border aSnake = new Border();aSnake.Width = aSnake.Height = size;aSnake.Background = Brushes.Green;//判断方向Canvas.SetLeft(aSnake,Canvas.GetLeft(snake[snake.Count-1]));Canvas.SetTop(aSnake,Canvas.GetTop(snake[snake.Count-1]));aSnake.Tag = "";aSnake.CornerRadius = new CornerRadius(size);CanvasLeft.Children.Add(aSnake);snake.Add(aSnake);}}/// <summary>/// 蛇死亡/// </summary>protected void overSnake(List<Border> snake){if (Canvas.GetLeft(snake[0])<=0 || Canvas.GetLeft(snake[0])>= CanvasLeft.Width-snake[0].Width || Canvas.GetTop(snake[0]) <= 0 || Canvas.GetTop(snake[0]) >= CanvasLeft.Height - snake[0].Height){SoundPlayer player = new SoundPlayer();player.SoundLocation = "../../sounds/MyBomb.wav";player.Play();MessageBox.Show("您已碰墙,游戏结束");Environment.Exit(-1);}for (int i = snake.Count - 1; i > 0; i--){if (Canvas.GetLeft(snake[0]) == Canvas.GetLeft(snake[i]) && Canvas.GetTop(snake[0]) == Canvas.GetTop(snake[i])){SoundPlayer player = new SoundPlayer();player.SoundLocation = "../../sounds/MyBomb.wav";player.Play();MessageBox.Show("您已碰身,游戏结束");//强行关闭Environment.Exit(-1);}}}}
}

三、效果图



WPF实现贪食蛇小案例相关推荐

  1. 【第三篇:利用ChatGPT编写贪食蛇小游戏】

    好像现在最近对ChatGPT讨论越来越热,ChatGPT的出现应该会引发"一次新的社会变革",未来很多码农会失业啊!与其坐着被改变,不如尝试主动改变,我今天就利用ChatGPT编写 ...

  2. as 贪食蛇小游戏(一)

    刚想学as制作游戏,所以打算先写个贪食蛇小游戏练习下.. 说明:使用的开发工具为 flash builder4.6 首先创建一个as项目. 然后我们先来添加一个config as类将游戏的所有设置都存 ...

  3. 用Java开发贪食蛇小游戏

    用Java开发贪食蛇小游戏 一.实验内容 1.实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子,上下左右控制"蛇"的移动,吃到"豆子&qu ...

  4. 使用WPF+MVVM模式的小案例

    WPF+MVVM模式的小案例案例主要的目录结构 下面一步一步建立整个小程序的目录和相应的代码程序. 1.打开VS, 新建项目WPFDemo.Client.CustType(自己可以写自己的程序名称,这 ...

  5. 原生js实现贪食蛇小游戏

    先不多说先上图 下面是代码部分(这里你可以根据需要改变蛇头和身体还有食物的图片,然后默认的样式是使用纯颜色的如果没有更改我的背景图片的话------改这些图开始是想搞笑一下朋友哈哈哈,请不要在意哈), ...

  6. 使用C++设计贪食蛇小游戏

    说明:所有代码均可在Visual Studio 2013上编译执行.并未测试在其它编译器上编译情况. 游戏规则 贪食蛇游戏要求玩家控制方向键(或WSAD键)来控制小蛇的前进方向,以使蛇吃掉面板上随即位 ...

  7. 嵌入式 贪食蛇小游戏

    (一)程序所包含的的模块 1)用图示的方式展示贪食蛇运行的过程. (二)系统设计过程 贪食蛇详细实现过程: (1)该游戏,首先进入欢迎界面,该技术使用的sdl的动画效果,用事件完成,用SDL_Blit ...

  8. Android 贪食蛇

    初级贪食蛇 文章目录 初级贪食蛇 效果展示: 界面设计 算法设计 游戏面板类 蛇身类 蛇类 方向类 主函数类 效果展示: 界面设计 游戏界面的设计布局我们采用"相对布局中嵌套线性布局&quo ...

  9. [原]Console小技巧——Console版贪食蛇

    这一篇是我的Console小技巧的最后一篇文章,以下是索引: 1.[原]Console小技巧--七彩输出 2.[原]Console小技巧--字符涂鸦 3.[原]Console小技巧--Console版 ...

最新文章

  1. 网络工程师转售前的条件
  2. 【转载】Wireshark基本介绍和学习TCP三次握手
  3. Matlab处理JSON数据
  4. 平庸技术流,用 WebApi +AngularJS 实现网络爬虫
  5. python与机械教育初探_Python公开课-机械学习之手写识别
  6. 杭电ACM--2004成绩转换
  7. clickhouse官方文档_clickhouse分析:zookeeper减压概述
  8. IT女性必备——5个方法变身小腰精
  9. 树莓派搭建物联网服务器
  10. iOS wifi开发
  11. JDE(Towards Real-Time Multi-Object Tracking)代码测试——小白必看
  12. 干货!APP推广全周期解决方案 只需做好这6步
  13. Spark性能优化之-资源调优
  14. 从0到1 激活函数(一)sigmod函数
  15. 个人永久性免费-Excel催化剂功能第22波-Excel文件类型、密码批量修改,补齐PowerQuery短板...
  16. 虚拟机一直光标闪,进不去,解决方法之一。
  17. Java MultipartFile实现文件上传(一)
  18. python爬虫源码附注解_Python爬虫遇到验证码的几种处理方式,文章末尾有源码
  19. LD3320语音识别模块:LDV7模块使用详解
  20. scada java_SCADA开源项目lite版本

热门文章

  1. action中实现对批量文件上传的封装
  2. VM虚拟机 运行openglES egl崩溃的问题
  3. 航海王燃烧意志如何修改服务器,航海王燃烧意志借号-航海王燃烧意志怎么改密码?ios版本手机账号...
  4. 成为未来几年最炙手可热的机器学习人才,基本功、秘密武器和弹药补给
  5. Springboot用HttpServletRequest作为controller入参后接收不到请求
  6. 用计算机打青春不打烊,我们的青春不打烊散文
  7. 「JOISC 2018 Day 3」比太郎的聚会
  8. PytestUnknownMarkWarning: Unknown pytest.mark.T1 - is this a typo? You can register custom marks to
  9. 关于鸿蒙与凤蒙,鸿蒙天道
  10. BinaryEditor:用ListView实现编辑二进制文件