这是“使用
C# 开发智能手机软件:推箱子
”系列文章的第三篇。在这篇文章中,介绍 Common/Block.cs 源程序文件。

  1 namespace Skyiv.Ben.PushBox.Common

  2 {

  3   /// <summary>

  4   /// 基本单元格: 地 槽 墙 砖 箱子 工人

  5   /// </summary>

  6   static class Block

  7   {

  8     public const byte Land = 0; // 地

  9     public const byte Slot = 1; // 槽

 10     public const byte Wall = 2; // 墙

 11     public const byte Brick = 3; // 砖: 等同于墙,一般放在墙的外围

 12     public const byte Box0 = 4; // 箱子放在地上

 13     public const byte Box1 = 5; // 箱子放在槽上

 14     public const byte Man0 = 6; // 工人站在地上

 15     public const byte Man1 = 7; // 工人站在槽上

 16 

 17     const string mask = "-+#%xX()"; // (*.bxa)文件用,依次代表以上各项

 18 

 19     public static string GetPenName(byte block)

 20     {

 21       return "地槽墙砖箱箱人人"[block & 0x07].ToString();

 22     }

 23 

 24     public static char GetChar(ushort block)

 25     {

 26       return mask[block & 0x07];

 27     }

 28 

 29     public static byte GetByte(char block)

 30     {

 31       return (byte)mask.IndexOf(block);

 32     }

 33 

 34     public static bool IsOk(ushort block)

 35     {

 36       return block <= Man1;

 37     }

 38 

 39     public static void CleanAllMark(ushort[,] bb)

 40     {

 41       for (int i = 0; i < bb.GetLength(0); i++)

 42         for (int j = 0; j < bb.GetLength(1); j++)

 43           bb[i, j] &= 0x07;

 44     }

 45 

 46     public static void Mark(ref ushort block, int value)

 47     {

 48       block |= (ushort)(value << 3);

 49     }

 50 

 51     public static int Value(ushort block)

 52     {

 53       return block >> 3;

 54     }

 55 

 56     public static void Update(ref ushort block, byte pen)

 57     {

 58       if (IsSlot(block) && pen == Block.Man0) pen = Block.Man1;

 59       if (IsSlot(block) && pen == Block.Box0) pen = Block.Box1;

 60       block = pen;

 61     }

 62 

 63     public static void ManIn(ref ushort block)

 64     {

 65       block += (Man0 - Land);

 66     }

 67 

 68     public static void ManOut(ref ushort block)

 69     {

 70       block -= (Man0 - Land);

 71     }

 72 

 73     public static void BoxIn(ref ushort block)

 74     {

 75       block += (Box0 - Land);

 76     }

 77 

 78     public static void BoxOut(ref ushort block)

 79     {

 80       block -= (Box0 - Land);

 81     }

 82 

 83     public static bool IsSlot(ushort block)

 84     {

 85       return block == Slot || block == Box1 || block == Man1;

 86     }

 87 

 88     public static bool IsBlank(ushort block)

 89     {

 90       return block == Land || block == Slot;

 91     }

 92 

 93     public static bool IsBox(ushort block)

 94     {

 95       return block == Box0 || block == Box1;

 96     }

 97 

 98     public static bool IsMan(ushort block)

 99     {

100       return block == Man0 || block == Man1;

101     }

102   }

103 }

104 

静态类 Block 用来表示基本单元格: 空地、槽(箱子终于要存放的目的地)、墙、砖(在本程序中等同于“墙”。一般放在墙的外围,使图形看起来美丽些)、箱子、工人。当中“箱子”和“工人”都能够位于“空地”或“槽”上,所以总共同拥有八种状态,用 0 到 7 表示,总共仅仅须要三个二进位,能够放入一个字节中。在数据文件(*.bxb)中。每一个基本单元格就是用一个字节储存的,这在以后介绍的
Common/DataFile.cs 源程序文件里会看到。可是为什么静态类 Block 的大多数方法的參数都是 ushort 类型呢?这是为了寻找工人最短移动路线算法的须要,看了下一篇介绍
Common/FindPath.cs 源程序文件的文章就会明确了。

    这个类还是比較简单的。现简要说明例如以下:

    GetPenName 方法返回在设计关卡时所用画笔的名称。

    Update 方法用来在设计关卡时更新地图中的基本单元格。

    GetChar 方法返回将数据文件(data/*.bxb)导出为文本文件(text/*.bxa)所用的字符。

GetByte 方法返回将文本文件(text/*.bxa)导入为数据文件(data/*.bxb)所用的字节。

    IsOk 方法推断表示基本单元格的字节是否合法,也用在数据导入时。

    Mark 方法在寻找工人最短移动路线算法中用来标记已经搜索过的基本单元格。

CleanAllMark 方法在上述算法结束时用来清除地图中的全部基本单元格的标记。

Value 方法返回上述算法搜索过程中所作的标记。

ManIn、ManOut、BoxIn、BoxOut 方法用来更新推箱子过程中地图各基本单元格的状态。

    IsSlot、IsBlank、IsBox、IsMan 方法用来推断各基本单元格的类型。


    补充:寻找工人最短移动路线的算法已经作了改进。地图使用 byte
存储即可了,所以静态类 Block 中的全部“ushort”都要改动为“byte”。

使用 C# 开发智能手机软件:推箱子(三)的更多相关文章

  1. 使用 C# 开发智能手机软件:推箱子(四)

    这是"使用 C# 开发智能手机软件:推箱子"系列文章的第四篇. 在这篇文章中,介绍 Common/FindPath.cs 源程序文件. using System; using Sy ...

  2. 使用 C# 开发智能手机软件:推箱子(十二)

    这是"使用 C# 开发智能手机软件:推箱子"系列文章的第十二篇.在这篇文章中,介绍 Window/AboutDlg.cs 源程序文件. 这个源程序文件包括 AboutDlg 类,该 ...

  3. 使用 C# 开发智能手机软件:推箱子(十四)

    这是"使用 C# 开发智能手机软件:推箱子"系列文章的第十四篇.在这篇文章中,介绍 Window/ErrorMsgDlg.cs 源程序文件.这个源程序文件包括 ErrorMsgDl ...

  4. 使用 C# 开发智能手机软件:推箱子(二)

    在上篇文章"使用 C# 开发智能手机软件:推箱子(一)"中.我对推箱子程序作了整体介绍.这次,我先介绍 Common/Fcl.cs 源程序文件.  1 using System; ...

  5. 使用 C# 开发智能手机软件:推箱子(十八)

    这是"使用 C# 开发智能手机软件:推箱子" 系列文章的第十八篇.在这篇文章中.介绍 Window/SelectLevelDlg.cs 源程序文件. 这个源程序文件包括 Selec ...

  6. [转]Flash ActionScript2.0面向对象游戏开发-推箱子

    本文转自:http://www.alixixi.com/Dev/W3C/Flash/2007/2007070868666.html 概述: Flash ActionScript2.0是一种面向对向的编 ...

  7. C++学习(三十七)(C语言部分)之 链式栈(推箱子实现)

    用链表实现栈一开始在表头插入,就要一直在表头插入一开始在表尾插入,就要一直在表头插尾表头当栈底 也可以把表尾当栈底 实现的测试代码笔记如下: #include<stdio.h> #incl ...

  8. 嵌入式系统Linux内核开发工程师必须掌握的三十道题(转)

    嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核 ...

  9. 用C写一个简单的推箱子游戏(一)

    我现在在读大二,我们有一门课程叫<操作系统>,课程考查要求我们可以写一段程序或者写Windows.iOS.Mac的发展历程.后面我结合网上的资料参考,就想用自己之前简单学过的C写一关的推箱 ...

随机推荐

  1. 使用finalshll连接linux

    一.安装ubuntu: 我在window10上装了VMware,好像window10自带虚拟机吧;然后傻瓜式装机,装好后发现没网不知道什么原因,然后百度啪啦啪啦找了一堆,解决方法是: 然后重启下ubu ...

  2. 由Java实现Valid Parentheses

    一.题目 Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the ...

  3. python书籍推荐:量化投资:以Python为工具

    所属网站分类: 资源下载 > python电子书 作者:mimi 链接:http://www.pythonheidong.com/blog/article/451/ 来源:python黑洞网 内 ...

  4. LeetCode(80)Remove Duplicates from Sorted Array II

    题目 Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For ex ...

  5. 【HDU 6006】Engineer Assignment(状压DP)

    Problem Description In Google, there are many experts of different areas. For example, MapReduce exp ...

  6. 比较spring cloud和dubbo,各自的优缺点是什么

    dubbo由于是二进制的传输,占用带宽会更少springCloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大 dubbo的开发难度较大,原因是dubbo的 ...

  7. 【HTML/XML 4】实例分析HTML和XML的不同

    导读:上回书说到,XML和HTML有着各自的不同点,综合表现在:1,HTML只是Web显示数据的通用方法,而XML提供了直接处理Web数据的通用方法.2,HTML着重描述Web页面的显示格式,而XML ...

  8. ES6关于Promise的用法详解

    Node的产生,大大推动了Javascript这门语言在服务端的发展,使得前端人员可以以很低的门槛转向后端开发. 当然,这并不代表迸发成了全栈.全栈的技能很集中,绝不仅仅是前端会写一些HTML和一些交 ...

  9. 【贪心】codeforces B. Heidi and Library (medium)

    http://codeforces.com/contest/802/problem/B [题意] 有一个图书馆,刚开始没有书,最多可容纳k本书:有n天,每天会有人借一本书,当天归还:如果图书馆有这个本 ...

  10. react.js 高阶组件----很简单的实例理解高阶组件思想

    调试代码之前,我设置了两个缓存 分别是username和content 在控制台console设置两个缓存代码 localStorage.setItem('username','老王')localSt ...