游戏人生Silverlight(6) - 贪吃蛇[Silverlight 3.0(c#)]
作者:webabcd
介绍
使用 Silverlight 3.0(c#) 开发一个贪吃蛇游戏
玩法
W/S/A/D 或 ↑/↓/←/→ 控制蛇的移动
在线DEMO
思路
1、贪吃蛇的每一段为 16×16 像素,场景为 640×480 像素,也就说网格为 40×30 个,每个网格的边长为 16
2、食物的出现位置以及贪吃蛇的运动方向的改变都要在相关的网格内进行
3、贪吃蛇的运动用即时运算的方法计算,当贪吃蛇运动到网格内(蛇某一段的像素位置%网格的边长<蛇在某时间单位下的移动偏移量)时做如下工作:修正蛇的位置使其正好在网格内,更新蛇的每一段的运动方向,判断是否吃到了食物、是否发生了碰撞等
4、贪吃蛇的每一段的运动方向的修改:蛇头的运动方向根据用户的操作改变,蛇的每一段的运动方向设置为此段的前一段的运动方向(计算时要从尾部向头部逐段计算)(注:运动方向的改变要在蛇移动到网格内时进行。其中如果蛇的某一段移动到了网格内,则表明其它各段都在网格内)
关键代码
* 游戏的核心算法
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Media.Imaging;
using System.Threading;
namespace YYSnake.Core
{
public partial class Main : UserControl
{
private int _columns; // 网格列数
private int _rows; // 网格行数
private Dictionary<Body, CellPoint> _bodies = new Dictionary<Body, CellPoint>(); // 贪吃蛇每一段的集合
private Dictionary<Bean, CellPoint> _beans = new Dictionary<Bean, CellPoint>(); // 豆的集合
private Dictionary<Skin, CellPoint> _skins = new Dictionary<Skin, CellPoint>(); // 蜕下来的皮的集合
private List<CellPoint> _emptyCells = new List<CellPoint>(); // 空网格的集合
private bool _enabled = false; // 游戏是否运行
private double _dt = 0.01; // 多少毫秒计算一次
private int _decimals = 1; // 计算小数时所保留的小数位
private double _speed = 80; // 蛇的运行速度
private Direction _moveDirection = Direction.Up; // 蛇的运行方向
private int _selfLength = 5; // 蛇的最小长度
private int _beansCount = 5; // 豆的最大出现数量
private int _ateCapacity = 10; // 食量(超过则蜕皮)
private bool _needRaiseAteEvent = false; // 在“蛇头所处位置进入了网格点区域内”时是否需要触发吃豆事件
private int _needBeansCount = 0; // 还需要增加的豆的数量
Random _random = new Random();
public Main()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(Main_Loaded);
}
void Main_Loaded(object sender, RoutedEventArgs e)
{
this.Width = App.Width; // 640
this.Height = App.Height; // 480
_columns = (int)(Width / App.CellSize); // 40
_rows = (int)(Height / App.CellSize); // 30
// 防止动画飞出去
RectangleGeometry rg = new RectangleGeometry();
rg.Rect = new Rect(0, 0, App.Width, App.Height);
LayoutRoot.Clip = rg;
bg.Width = App.Width;
bg.Height = App.Height;
ripple.RippleBackground = bg;
CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
}
/// <summary>
/// 初始化
/// </summary>
public void Init()
{
_enabled = false;
canvasBean.Children.Clear();
canvasSnake.Children.Clear();
canvasSkin.Children.Clear();
_beans.Clear();
_bodies.Clear();
_skins.Clear();
_emptyCells.Clear();
for (int i = 0; i < _columns; i++)
{
for (int j = 0; j < _rows; j++)
{
_emptyCells.Add(new CellPoint(i, j));
}
}
_moveDirection = Direction.Up;
InitSnake();
}
/// <summary>
/// 蛇的初始化
/// </summary>
private void InitSnake()
{
InitHead();
for (int i = 0; i < _selfLength - 1; i++)
AddTail();
for (int i = 0; i < _beansCount; i++)
AddBean();
}
/// <summary>
/// 蛇头的初始化
/// </summary>
private void InitHead()
{
Body head = new Body(BodyType.Head);
head.MoveDirection = _moveDirection;
CellPoint point = new CellPoint((int)(_columns / 2), (int)(_rows / 2));
head.SetValue(Canvas.LeftProperty, point.X * App.CellSize);
head.SetValue(Canvas.TopProperty, point.Y * App.CellSize);
_bodies.Add(head, point);
canvasSnake.Children.Add(head);
}
/// <summary>
/// 增加一个尾巴
/// </summary>
private void AddTail()
{
var prevBody = _bodies.Last().Key;
var prevBodyPoint = _bodies.Last().Value;
Body tail = new Body(BodyType.Tail);
tail.MoveDirection = prevBody.MoveDirection;
CellPoint tailPoint = new CellPoint(prevBodyPoint.X, prevBodyPoint.Y);
switch (prevBody.MoveDirection)
{
case Direction.Up:
tail.SetValue(Canvas.LeftProperty, (double)prevBody.GetValue(Canvas.LeftProperty));
tail.SetValue(Canvas.TopProperty, (double)prevBody.GetValue(Canvas.TopProperty) + App.CellSize);
tailPoint.Y++;
break;
case Direction.Down:
tail.SetValue(Canvas.LeftProperty, (double)prevBody.GetValue(Canvas.LeftProperty));
tail.SetValue(Canvas.TopProperty, (double)prevBody.GetValue(Canvas.TopProperty) - App.CellSize);
tailPoint.Y--;
break;
case Direction.Left:
tail.SetValue(Canvas.LeftProperty, (double)prevBody.GetValue(Canvas.LeftProperty) + App.CellSize);
tail.SetValue(Canvas.TopProperty, (double)prevBody.GetValue(Canvas.TopProperty));
tailPoint.X++;
break;
case Direction.Right:
tail.SetValue(Canvas.LeftProperty, (double)prevBody.GetValue(Canvas.LeftProperty) - App.CellSize);
tail.SetValue(Canvas.TopProperty, (double)prevBody.GetValue(Canvas.TopProperty));
tailPoint.X--;
break;
}
tailPoint = CorrectCellPoint(tailPoint);
_bodies.Add(tail, tailPoint);
canvasSnake.Children.Add(tail);
}
/// <summary>
/// 增加一个豆
/// </summary>
private void AddBean()
{
if (_needBeansCount < _beansCount)
_needBeansCount++;
}
private DateTime _prevAddBeanDateTime = DateTime.Now;
游戏人生Silverlight(6) - 贪吃蛇[Silverlight 3.0(c#)]相关推荐
- 纯C语言实现贪吃蛇游戏(VC6.0)
转自C语言网 今天笔者为大家展示C语言写的贪吃蛇游戏,让大家玩一玩自己写的游戏~ 是纯C语言哦~VC6.0开发 无问题 首先,开始界面: 游戏界面如下: 代码如下: 笔者VC6.0下编写,测试无问题, ...
- c语言vc6.0编写贪吃蛇,基于VC6.0的贪吃蛇游戏源码
//******************************************************* //**************************************** ...
- c语言写贪吃蛇什么水平_C语言实现贪吃蛇游戏(VC6.0)
#include#include#include#include #define U 1#define D 2#define L 3#define R 4//蛇的状态,U:上 :D:下:L:左 R:右 ...
- c语言版贪吃蛇《课程设计》
主要运用了光标的移动-.- 教程会在一个月内发布-.-最近考试好多...... 看代码应该能看懂.... 3.1 规则模块与动画模块 1)函数原型:void gui( );void dong( ); ...
- C++ 开发贪吃蛇游戏总结
一.思考贪吃蛇的思路: 1.在一个窗口绘制贪吃蛇,肯定少不了绘制的API,所以必不可少需要引入graphics.h这个图形界面库(里面封装了WIN 32大部分绘制API,如果没有的话,可以用GDI). ...
- 贪吃蛇项目面试C语言,【游戏数组面试题】面试问题:c语言版贪吃蛇… - 看准网...
主要运用了光标的移动-.- 教程会在一个月内发布-.-最近考试好多...... 看代码应该能看懂.... 3.1 规则模块与动画模块 1)函数原型:void gui( );void dong( ); ...
- 超简单的C语言贪吃蛇 不闪屏 双缓冲
C语言贪吃蛇 今天把以前自己写的贪吃蛇总结了一下,发到博客上,怕放在电脑上哪天丢失了都不知道, 有不当之处还望指教 (*・ω< ) ヾ(◍°∇°◍)ノ゙ 贪吃蛇中, 我们看到的蛇在不断的移动,其 ...
- 原生JS 实现小游戏 贪吃蛇
文章目录 (1) 游戏场景搭建 (2) 获取标签.准备数据 (3)贪吃蛇移动 (4) 控制贪吃蛇移动 (5) 随机生成食物 (6) 完成食物消化 (7) 边界判断 (8) 积分判断 (9) 暂停继续 ...
- Linux编程 --- 贪吃蛇小游戏
如何使用ncurse #include <curses.h>int main() {initscr();//ncurse 界面的初始化函数printw("This is curs ...
最新文章
- SAP WM中阶Storage Type的Capacity Check – Check based on maximum quantity per bin in storage type.
- 算力不是王道,强化学习之父Rich Sutton的六点错误
- 【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 )
- Dataset之Knifey-Spoony:Knifey-Spoony数据集的简介、下载、使用方法之详细攻略
- html导航下拉菜单js点击显示不出来,使用JS做下拉菜单,子菜单不显示
- we need to have frequent contact for relationships for transferring from aca to career
- 【深度学习】在PyTorch中使用 LSTM 自动编码器进行时间序列异常检测
- Error:fatal: Not a git repository (or any of the parent directories): .git
- 二维数组排序 行与列分别升序_6个经典排序技巧,尤其是最后一个,绝对的个性化...
- 牛客第三场多校 H Diff-prime Pairs
- 产品配件删除,内容保存
- 使用 IntraWeb (26) - 基本控件之 TIWMenu
- matlab噪声 方差_产生多种分布的热噪声信号
- Java实战之管家婆记账系统(24)——项目总结
- element-ui tree全部展开和全部折叠
- 紫荆花开之say love to the girl you love
- 飞行员态势感知的机理研究
- 用ros中apriltag码进行定位(记录一下)
- nacl溶解度_氯化钠溶解度 氯化钠的溶解度
- MDN Web Docs
热门文章
- Sysbench 性能压测-MySQL
- c语言实现的optics算法,基于深度学习的光学系统设计方法
- oppo怎么广告接入_OPPO游戏创游无境 构建强大的游戏生态
- python中split的用法-python中的split()函数的用法
- java 定义全局变量_都说变量有七八种,到底谁是 Java 的亲儿子
- grafana监控oracle11g,Grafana展示zabbix监控数据
- php+mysql开发实战 pdf_《PHP + MySQL 开发实战》怎么样_目录_pdf在线阅读 - 课课家教育...
- 联调测试是什么意思_功能模块提测前注意这几件事,再也不怕被测试diss了
- MyBatis映射器出错,已解决(Multiple annotations found at this line:)
- java中long的包装类_Java中基本数据的包装类