深入浅出制作全自动Mud机器人-移动模块拆解
Script脚本
1
帖子
1
发布者
7
浏览
-
在移动模块介绍时我们说过,整个移动模块是Mud机器中最复杂的模块。
同时,移动模块又是Mud机器人中最底层最常用的模块,所以,怎么合适的设计移动模块是整个全自动机器人的核心问题之一。
我在不同时代的机器中使用了不同的架构模式(helllua,pkuxkx.noob,newhelljs)
最后采用的是 一个基于组合模式和选项模式的架构。
- 将移动的需求拆解为不同的处理函数,用默认值组合成一个标准移动
- 通过同一的选项模式进行设置,这样可以通过预设置的配置,迅速组建成一个可用的复杂移动
拆解
首先,我将所有移动统一,拆解为基础功能,以及关键点的处理函数。
把所有的处理函数综合起来,就是一个移动
class Move { StartCommand = "" Data = {} Retry = DefaultMoveRetry Next = DefaultMoveNext OnRoom = DefaultMoveOnRoom OnArrive = DefaultMoveOnArrive Vehicle = DefaultVehicle OnFinish = module.DefaultOnFinish OnCancel = module.DefaultOnCancel OnInitTags = DefaultOnInitTags OnStepTimeout = DefaultOnStepTimeout OnStepFinsih = DefaultMoveOnStepFinish MapperOptionCreator = DefaultMapperOptionCreator Option = new Option() ... }非常明显,我将所有的方法的默认方法,汇总成了一个 Move类。这样只要替换对应的方法,就能实现不同的移动了。
整个 Move类相当于一个乐高积木,通过不同的积木进行拼装,然后我的Map类有一个StartMove方法
StartMove(move) { this.Move = move this.MovePosition.StartNewTerm() this.ChangeMode("") move.Walk(this) }将拼装好的Move类传入,就能开始移动了
配置
在配置上,我采用了Go语言中十分流行的选项(Option)设计模式
也就是,通过一个选项列表对Move进行设置,每个选项代表一套预定义的函数包,应用完后就是我们需要的Move对象。
对于选项列表,我创建一个路书(Route)对象来保存。
这样,所有的移动,就是一套预设的路书,初始化为移动,交由Map对象执行。
我预设的移动选项包括
- To 定点移动
- Path 固定路线遍历
- Ordered 顺序遍历房间
- Rooms 房间遍历
- SingleStep 单步移动
- StartCommand 开始指令
- Option 地图选项
- Tag 移动标签
这些就能决定移动的 类型/形态
然后在消费的模块,加入目的型的选项
比如core/zone.js的 App.Zone.SearchRooms
let move = wanted.Ordered ? App.Move.NewOrderedCommand(rooms, App.Zone.Finder) : App.Move.NewRoomsCommand(rooms, App.Zone.Finder)就很简单的拼装出了一个便利搜索的移动。
通过 基础模块(生产端)的 移动形态/类型 选项,和任务(消费端),快速的组合出需要的移动模块。
-
J jarlyyn 被引用 于这个主题