X Tutup
Skip to content

Latest commit

 

History

History
119 lines (71 loc) · 4.66 KB

File metadata and controls

119 lines (71 loc) · 4.66 KB

教程:利用HellMapManager建立定位系统

在Mud机器人的编写中,定位是非常重要的一件事情。有两种经典的定位方式十分常见

  • 房间特征表
  • 规则匹配

本教程就是给出一个利用HellMapManager(HMM)来处理这两种信息进行定位的方式。

定位数据

定位(Landmark)是HMM中用来储存定位信息的一种数据结构。

他主要有4个属性组成

  • 主键。建议使用对应房间的主键
  • 类型。告诉脚本用什么代码去使用这个定位
  • 分组。无实际用途,建议和房间的分组设置成一样方便管理
  • 值。具体的程序要来匹配的数据。

定位每一组主键和类型不可重复。

这意味着,一个主键可以有多个类型的匹配值。

由于定位对于通过程序遍历更新数据极为重要,建议多使用几种不同的定位类型,防止Mud更新时整个机器的数据维护功能失效。

种子定位

种子定位指在手动画地图时,经过确认独一无二的定位。

种子定位对于整个定位的建立十分重要。

当所有定位方式都失效时,也可能需要手动更新一批种子定位来重新建立定位系统。

规则匹配

规则匹配最常见的是对描述进行正则匹配,极端情况下可以在值中存一段代码eval判断,但处于安全原因极不建议这么做。

规则匹配的特点是

  • 无法自动化处理,完全依赖手动判断
  • 因为手动判断,所以更为可靠
  • 效率低。很可能需要遍历所有的规则进行判断,当规则很多时可能有性能问题。

HMM建议建立地图时添加少量的规则匹配内容,作为种子定位。

每一种规则,在Landmark中应该对应一个独立的类型

规则匹配的话,在脚本加载时,可以放在一个数组/table里,在定位时通过for循环遍历的方式依次进行匹配。

整体的数据结构应该是 第一层是个字典/对象/table,第二层是数组

特征匹配

特征匹配指根据不同的规则,给房间订立多套特征体系,比如:

  • 房间名
  • 房间名+出口
  • 房间名+描述
  • 完整描述
  • 描述起始固定字数
  • 描述结束固定字数
  • 地图
  • 房间的区域和其他信息

把相应的信息生成对应的一个字符串。

很明显,特征很多时候是过的维度组合起来的。

到底有几个维度,怎么组合,这是根据Mud中的实际情况进行判断的。

维度越多,则定位越快,但也越脆弱。

有了特征组合后,我们可以通过给所有房间取特征,然后去掉有重复的,剩下的经过判断后就可以用来具体定位了。

具体使用时,每一个特征组合应该是一个独立的Landmark的类型

脚本加载时,同一组特征应该放在一个对象/字典/table里。

具体机构应该是一个二维表

进入房间后,把房间对应的特征值都计算出来,然后两次查表,确定是否有对应的定位记录。

通过快照计算特征

快照是HMM里的另一类数据结构。核心内容为

  • 主键,一般对应房间主键
  • 类型,代表快照的值记录的是什么
  • 分组。无实际用途,建议和房间的分组设置成一样方便管理
  • 值。具体的程序要来匹配的数据。
  • 重复次数。具体的唯一组合出现过几次

快照的值数据结构和定位十分一致。代表的是机器人遍历到某个房间时,房间某类属性(描述/地图/对象)的具体值。

由于部分信息可能是动态的,比如描述随着季节变化,或者npc可能有刷新或者移动,所以快照是以主键,类型,值为唯一组合。

如果再次采集遇到相同的组合,则不会创建新纪录,而是将重复次数累加一次。

很明显,快照就是通过机器采集数据时,收集到的用于定位的最原始的数据。

HMM提供了一些简单接口,可以方便快速的找到匹配的快照,以完成有些Mud里对需要环境信息进行检索的人物。

但从设计意图来说,快照是用来准备再次树立的原始数据。

体现在定位中,就是

  1. 通过接口取出所有快照。
  2. 为每个房间通过快照计算出所有的特征值。
  3. 将特征组合对应的房间分别以特征值存入一个表内。
  4. 遍历表,将包含多个房间的表元素删除。
  5. 遍历表中剩下的元素(只有唯一房间的特征),生成对应的定位数据。
  6. 将所有有效的定位数据通过接口进行更细。

同时通过一定的场合进行冗余。

这样,在每次Mud地图发生变化时,可以通过机器人自动对脚本进行维护。

更进一步话,可以通过程序对比数据,验证现有的定位,有哪些在更新后已经失效。

X Tutup