一. 游戏界面
首先,按照惯例,编辑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(四)——贪吃蛇小游戏的简易实现(上)的更多相关文章

  1. 练手WPF(四)——贪吃蛇小游戏的简易实现(下)

    八.生成新的单节蛇身我们这里先说说游戏小原理好了,游戏运行后,通过计时器事件不断生成新的单节蛇身类SnakeNode,添加到List中的0位置,原来的蛇头变成了第二节.该节新蛇头的坐标通过蛇头前进方向 ...

  2. 练手WPF(二)——2048游戏的简易实现(上)

    1.创建游戏界面编辑MainWindow.xaml,修改代码如下: <Window.Resources> <Style TargetType="Label"> ...

  3. 练手WPF(二)——2048游戏的简易实现(下)

    接着上一篇继续~~~ 6.动画显示增加分数 /// <summary> /// 动画显示增加得分 /// </summary> /// <param name=" ...

  4. C++ 简单的控制台贪吃蛇小游戏

    由于比较懒,所以不怎么写,觉得这样不应该.我应该对自己学的做出整理,不管是高端低端,写出来是自己的. // 贪吃蛇.cpp : 定义控制台应用程序的入口点. // #include "std ...

  5. 贪吃蛇小游戏-----C语言实现

    1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...

  6. JS高级---案例:贪吃蛇小游戏

    案例:贪吃蛇小游戏 可以玩的小游戏,略复杂,过了2遍,先pass吧 先创建构造函数,再给原型添加方法.分别创建食物,小蛇和游戏对象. 食物,小蛇的横纵坐标,设置最大最小值,运动起来的函数,按上下左右键 ...

  7. Java GUI学习,贪吃蛇小游戏

    JAVA GUI练习 贪吃蛇小游戏 前几天虽然生病了,但还是跟着狂神学习了GUI的方面,跟着练习了贪吃蛇的小项目,这里有狂神写的源码点我下载,还有我跟着敲的点我下载,嘿嘿,也就注释了下重要的地方,这方 ...

  8. 用GUI实现java版贪吃蛇小游戏

    项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFr ...

  9. Java 用java GUI写一个贪吃蛇小游戏

    目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...

随机推荐

  1. File 删除给定的文件或目录

    package seday03; import java.io.File; /*** 创建一个多级目录* @author xingsir*/public class MkDirsDemo { publ ...

  2. int[]里数的个数怎么由输入决定?-----动态数组。

    java中如何创建动态数组?(摘自百度知道) Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util ...

  3. 易优CMS:type的基础用法

    [基础用法] 名称:type 功能:获取指定栏目信息 语法: {eyou:type typeid='栏目ID' empty='暂时没有数据'} <a href="{$field.typ ...

  4. Google在情报搜集中的基础技巧

    Google在情报搜集中的基础技巧 作者:王宇阳 时间:2019-06-06 作者笔记 ​ Google Hacking 是指使用特定的高级的google搜索语法,收集渗透测试目标的信息,查找目标的配 ...

  5. MD5哈希算法及其原理

    - MD5功能 MD5算法对任意长度的消息输入,产生一个128位(16字节)的哈希结构输出.在处理过程中,以512位输入数据块为单位. - MD5用途及特征 MD5通常应用在以下场景: 1.防篡改,保 ...

  6. 炫彩字and鼠标爱心

    <!DOCTYPE html> <style type="text/css"> body{ background-color: black; } #zx { ...

  7. centos 7下配置阿里yum源

    1.打开centos的yum文件夹 cd /etc/yum.repos.d/ 2.用wget下载repo文件 wget http://mirrors.aliyun.com/repo/Centos-7. ...

  8. 安全类和远程类shell脚本

    批量杀php小马脚本 find /home/hatdot/ -name "*.php" |xargs egrep "phpspy|c99sh|milw0rm|eval\( ...

  9. golang数据结构和算法之CircularBuffer环形缓冲队列

    慢慢练语法和思路, 想说的都在代码及注释里. CircularBuffer package CircularBuffer const arraySize = 10 type CircularBuffe ...

  10. 4. jenkins 构建任务

    这边说一下 ,服务器的分布.  因为我这边 测试环境的项目比较多,不能修改主机名 1号机器 节点机器(node) 最终项目发布到这台机器 2号机器  jenkins jenkins的部署,发布 3号机 ...