练手WPF(四)——贪吃蛇小游戏的简易实现(上)
一. 游戏界面
首先,按照惯例,编辑MainWindow.xaml,先将游戏界面制作好。非常简单:
(1)主游戏区依然使用我们熟悉的Canvas控件,大小为640X480像素,设定每小格子为20px,所以横坚坐标的格子数为32x24。见源代码的最后位置。
(2)定位控件我们使用DockPanel,方便放置主菜单。
(3)将按键事件PreviewKeyDown放在Window内。
<Window x:Class="MoonSnake.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:MoonSnake"
mc:Ignorable="d"
PreviewKeyDown="MyCanvas_PreviewKeyDown"
Title="Moon Snake Game" Height="540" Width="660" WindowStartupLocation="CenterScreen" ResizeMode="CanMinimize">
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="文件">
<MenuItem Name="MenuFile_NewGame" Header="新游戏" Click="MenuFile_NewGame_Click" />
<Separator/>
<MenuItem Name="MenuFile_Exit" Header="退出" Click="MenuFile_Exit_Click" />
</MenuItem>
<MenuItem Header="控制">
<MenuItem Name="MenuControl_Pause" Header="暂停" Click="MenuControl_Pause_Click" />
</MenuItem>
<MenuItem Header="帮助">
<MenuItem Name="MenuHelp_About" Header="关于..." Click="MenuHelp_About_Click" />
</MenuItem>
</Menu>
<Canvas x:Name="myCanvas" Height="480" Width="640" Background="#222222" Focusable="True"
PreviewKeyDown="MyCanvas_PreviewKeyDown" /> </DockPanel>
</Window>
二、添加水果Fruit类
因为我们不打算使用任何图片,所以为了简单起见,就只使用红色的实心圆代表水果好了。
看下面的代码:功能简单,主要通过两个属性指定水果的位置和图形。
public class Fruit
{
public Point _pos { get; set; }
public Ellipse _ellipse { get; set; }
public Canvas _canvas { get; set; } public Fruit(Point point, Canvas canvas)
{
_pos = point;
_canvas = canvas; _ellipse = new Ellipse
{
Width = ,
Height = ,
Fill = Brushes.Red
}; _ellipse.SetValue(Canvas.LeftProperty, _pos.X * );
_ellipse.SetValue(Canvas.TopProperty, _pos.Y * );
_canvas.Children.Add(_ellipse);
} public void SetPostion(Point pos)
{
_pos = pos; _ellipse.SetValue(Canvas.LeftProperty, _pos.X * );
_ellipse.SetValue(Canvas.TopProperty, _pos.Y * );
}
}
三、添加单节蛇身SnakeNode类
每个SnakeNode代表蛇身的一节,之后我们会通过List<SnakeNode>列表代表整条蛇。
看代码就知道了,与水果类非常相似,甚至比它更简单,构造函数没有传递Canvas参数,因为我们打算在主程序实现添加图形到主游戏区的功能,只要指定它的位置和形状即可,形状则使用了有边线的矩形代替。
public class SnakeNode
{
public Point _pos { get; set; }
public Rectangle _rect { get; set; } public SnakeNode(Point point)
{
_pos = point; _rect = new Rectangle
{
Width = ,
Height = ,
Stroke = new SolidColorBrush(Colors.DodgerBlue),
StrokeThickness = ,
Fill = Brushes.SkyBlue
}; _rect.SetValue(Canvas.LeftProperty, _pos.X * );
_rect.SetValue(Canvas.TopProperty, _pos.Y * );
}
}
四、定义四个常量和两个枚举
看注释:
const int CellSize = ; // 小格子大小
const int SnakeHead = ; // 蛇头位置(永远位于列表0)
const int CellWidth = / CellSize; // 游戏区横格数
const int CellHeight = / CellSize; // 游戏区纵格数 // 蛇身前进方向
enum Direction
{
UP,
DOWN,
LEFT,
RIGHT
}
Direction Direct = Direction.UP; // 游戏状态
enum GameState
{
NONE,
GAMEING,
PAUSE,
STOP
}
GameState CurrGameState = GameState.NONE;
五、很少的几个字段变量
List<SnakeNode> SnakeNodes = new List<SnakeNode>(); // 蛇身列表
Fruit fruit; // 水果
Random rnd = new Random((int)DateTime.Now.Ticks); // 随机数
System.Windows.Threading.DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer(); // 计时器
六、画游戏区暗格线
主要使用Path控件,通过循环每隔20px画一根横线和纵线。
private void DrawGrid()
{
Path gridPath = new Path();
gridPath.Stroke = new SolidColorBrush(Color.FromArgb(, , , ));
gridPath.StrokeThickness = ; StringBuilder data = new StringBuilder(); for (int x = ; x < ; x += CellSize)
{
data.Append($"M{x},0 L{x},480 ");
} for (int y = ; y<; y += CellSize)
{
data.Append($"M0,{y} L640,{y} ");
} gridPath.Data = Geometry.Parse(data.ToString());
myCanvas.Children.Add(gridPath);
}
七、我是构造方法
这里画底线和设置计时器。
public MainWindow()
{
InitializeComponent(); DrawGrid(); timer.Interval = new TimeSpan(, , , , );
timer.Tick += Timer_Tick;
}
可先注释掉最后一行,运行看看游戏界面了。

练手WPF(四)——贪吃蛇小游戏的简易实现(上)的更多相关文章
- 练手WPF(四)——贪吃蛇小游戏的简易实现(下)
八.生成新的单节蛇身我们这里先说说游戏小原理好了,游戏运行后,通过计时器事件不断生成新的单节蛇身类SnakeNode,添加到List中的0位置,原来的蛇头变成了第二节.该节新蛇头的坐标通过蛇头前进方向 ...
- 练手WPF(二)——2048游戏的简易实现(上)
1.创建游戏界面编辑MainWindow.xaml,修改代码如下: <Window.Resources> <Style TargetType="Label"> ...
- 练手WPF(二)——2048游戏的简易实现(下)
接着上一篇继续~~~ 6.动画显示增加分数 /// <summary> /// 动画显示增加得分 /// </summary> /// <param name=" ...
- C++ 简单的控制台贪吃蛇小游戏
由于比较懒,所以不怎么写,觉得这样不应该.我应该对自己学的做出整理,不管是高端低端,写出来是自己的. // 贪吃蛇.cpp : 定义控制台应用程序的入口点. // #include "std ...
- 贪吃蛇小游戏-----C语言实现
1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...
- JS高级---案例:贪吃蛇小游戏
案例:贪吃蛇小游戏 可以玩的小游戏,略复杂,过了2遍,先pass吧 先创建构造函数,再给原型添加方法.分别创建食物,小蛇和游戏对象. 食物,小蛇的横纵坐标,设置最大最小值,运动起来的函数,按上下左右键 ...
- Java GUI学习,贪吃蛇小游戏
JAVA GUI练习 贪吃蛇小游戏 前几天虽然生病了,但还是跟着狂神学习了GUI的方面,跟着练习了贪吃蛇的小项目,这里有狂神写的源码点我下载,还有我跟着敲的点我下载,嘿嘿,也就注释了下重要的地方,这方 ...
- 用GUI实现java版贪吃蛇小游戏
项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFr ...
- Java 用java GUI写一个贪吃蛇小游戏
目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...
随机推荐
- java基础(11):接口、多态
1. 接口 1.1 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成. ...
- MySQL,必须掌握的6个知识点
本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...
- java主函数
相信很多初次接触java的同学,在遇见主函数的时候,听到最多的就是主函数的格式是固定的,不能进行修改等等.这就让人疑惑了,主函数为啥就那么特殊呢?接下来博主会为大家解释主函数.大家先看看下面这个程序: ...
- CDN加速静态文件访问
CDN加速静态文件访问 全局调度 缓存技术 内容分发 带宽优化 CDN是Content Delivery Network的缩写,意思是内容分发网络.CDN的作用是把用户需要的内容分发到离用户近的地方, ...
- JavaWeb之servlet(2)
servlet(2) ServletContext servlet的上下文 每个jvm的虚拟机中的每个web工程都只有一个ServletContext工程,即在一个web工程中,无论写了多少个Java ...
- DevOps 工程师成长日记系列五:部署
原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-part-5-deploy ...
- Odoo12 之主题创建或扩展
初次使用 Odoo 来制作网站,因Odoo自带代码块效果单一,无法满足当前网站展示效果,需要对当前代码块进行添加或扩展.而这个代码块是属于网站中的布局设计这一块,Odoo 将所有的布局以及逻辑行为,都 ...
- requests---requests发送xml数据类型
上一篇简单的介绍了post常见的4种数据类型,今天我们一起学习通过requests发送xml数据类型 xml数据类型 下方数据为xml数据,我们就通过这段数据学习如果通过requests发送xml数据 ...
- TCP协议如何保证可靠传输
TCP协议如何保证可靠传输 概述: TCP协议保证数据传输可靠性的方式主要有: (校 序 重 流 拥) 校验和: 发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化.如果收到段的检 ...
- 无依赖单文件http-ftp文件服务器(py2)
网上看到的东东,居然在很合适堡垒机上传下载文件的场景. 这个只能在python2版本上跑, 我更改了自定义端口. 下次再改写个py3版本的. #!/usr/bin/env python "& ...