这是“使用
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. 10. InnoDB表空间加密

    10. InnoDB表空间加密 InnoDB支持存储在单独表空间中的表的数据加密 .此功能为物理表空间数据文件提供静态加密. 详细信息见官方文档

  2. 关于nagios系统下使用shell脚本自定义监控插件的编写以及没有实时监控图的问题

    关于nagios系统下shell自定义监控插件的编写.脚本规范以及没有实时监控图的问题的解决办法 在自已编写监控插件之前我们首先需要对nagios监控原理有一定的了解 Nagios的功能是监控服务和主 ...

  3. 【linux 06】 linux中的用户权限、文件权限与目录权限

    1.用户及用户组的概念: 1.文件所有者 2.用户组 3.用户 以root登录Linux之后,执行ls -al,会看到有关文件属性的信息 -rw-r--r--,第1个字符代表这个文件是“目录,文件或链 ...

  4. 刁肥宅详解中缀表达式求值问题:C++实现顺序/链栈解决

    1. 表达式的种类 如何将表达式翻译成能够正确求值的指令序列,是语言处理程序要解决的基本问题,作为栈的应用事例,下面介绍表达式的求值过程. 任何一个表达式都是由操作数(亦称运算对象).操作符(亦称运算 ...

  5. Cannot delete or update a parent row: a foreign key constraint fails....

    在操作”小弟“这张表时候报错 想在“小弟”上面加入数据或者更新数据,就要听老大的, 这句话后面跟着的表就是“老大”,必须老大有数据索引,“小弟“才可以加入或者更新 查看“小弟”表的外键,会发现有对“老 ...

  6. Python编译错误总结

    1.TypeError: object() takes no parameters 如果你出现了这个报错,请检查你的__init__函数名或者其定义有没有写错.一般是把__init__写成了__int ...

  7. LR百分比模式

    1  场景模式切换 Vuser Group Mode转换为Percentage Mode:如下 Scenario->Convert Scenairio to the VuserGroup Mod ...

  8. C++中的左移、右移运算

    移位运算包含“逻辑移位”(logical shift)和“算术移位”(arithmetic shift). 逻辑移位:移出去的位丢弃,空缺位(vacant bit)用 0 填充. 算术移位:移出去的位 ...

  9. python3--算法基础:二维数组转90度

    python3--算法基础:二维数组转90度 [0, 1, 2, 3][0, 1, 2, 3][0, 1, 2, 3][0, 1, 2, 3] 二维数组转90度 [0, 0, 0, 0][1, 1, ...

  10. sequence(bzoj 1367)

    Description Input Output 一个整数R Sample Input 794820141518 Sample Output 13 HINT 所求的Z序列为6,7,8,13,14,15 ...