跳转至内容
  • 欢迎
  • 版块
  • 最新
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
品牌标识

Hellclient 社区

  1. 主页
  2. Script脚本
  3. 深入浅出制作全自动Mud机器人-移动模块拆解

深入浅出制作全自动Mud机器人-移动模块拆解

已定时 已固定 已锁定 已移动 Script脚本
mud机器人全自动架构
1 帖子 1 发布者 7 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • jarlyynJ 离线
    jarlyynJ 离线
    jarlyyn
    编写于 最后由 编辑
    #1

    在移动模块介绍时我们说过,整个移动模块是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)
    

    就很简单的拼装出了一个便利搜索的移动。

    通过 基础模块(生产端)的 移动形态/类型 选项,和任务(消费端),快速的组合出需要的移动模块。

    1 条回复 最后回复
    • jarlyynJ jarlyyn 被引用 于这个主题
    回复
    • 在新帖中回复
    登录后回复
    • 从旧到新
    • 从新到旧
    • 最多赞同


    • 登录

    • 没有帐号? 注册

    • 登录或注册以进行搜索。
    Powered by Herbrhythm.
    • 第一个帖子
      最后一个帖子
    0
    • 欢迎
    • 版块
    • 最新
    • 标签
    • 热门
    • 用户
    • 群组