一. 游戏界面
首先,按照惯例,编辑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. ReSharper激活方法

    激活方式选择License Keys. 激活码: MTW881U3Z5-eyJsaWNlbnNlSWQiOiJNVFc4ODFVM1o1IiwibGljZW5zZWVOYW1lIjoiTnNzIElt ...

  2. FileFilter(),文件过滤器操作

    package seday03; import java.io.File;import java.io.FileFilter; /*** listFiles的重载方法允许我们传入一个文件过滤器:Fil ...

  3. CSS animation 属性

    定义和用法 animation属性是下列属性的一个缩写属性: animation-name animation-duration animation-timing-function animation ...

  4. DQL---连接查询(内连接、外连接)、子查询、分页查询

    一.连接查询 1.连接查询建立在有相互关系的两个表间,进行两个及两个以上的表或视图的查询. 2.对n张表进行查询,至少需要n-1个连接表的条件. 二.笛卡尔积(容易造成数据库宕机) 1.指表中每行元素 ...

  5. iOS安全攻防(一):Hack必备的命令与工具

    转自:http://blog.csdn.net/yiyaaixuexi/article/details/8288077 你的应用正在被其他对手反向工程.跟踪和操作!你的应用是否依旧裸奔豪不防御? 郑重 ...

  6. Python使用APScheduler实现定时任务

    APScheduler是基于Quartz的一个Python定时任务框架.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.在线文档:https://apscheduler. ...

  7. Shell脚本(1)

    在创建Shell脚本时,必须在文件的第一行指定要使用的shell.格式为:#!/bin/bash 除了第一行外,在shell脚本中井号(#)用作注释行 若出现错误:command not found ...

  8. 【转】Redis常见面试题

    介绍:Redis 是一个开源的使用 ANSI C 语言编写.遵守 BSD 协议.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的 API的非关系型数据库. 传统数据 ...

  9. [C12] 大规模机器学习(Large Scale Machine Learning)

    大规模机器学习(Large Scale Machine Learning) 大型数据集的学习(Learning With Large Datasets) 如果你回顾一下最近5年或10年的机器学习历史. ...

  10. template指针小测试

    测试结论: 1 函数指针 -- 使用形参固定的一系列函数作为某个函数的形参 -- callback机制 2 模板指针 -- 使用形参可变的一系列函数作为某个函数的形参 -- 3 typename -- ...