找回密码
 注册
搜索
查看: 4233|回复: 87

快到春节了,放一个福利,说一说护镖、护送的走路思路!

[复制链接]
门派:明教
发表于 2020-1-10 23:21:09 | 显示全部楼层 |阅读模式
刚刚李青兄问我护镖机器人的事,我觉得虽然不能免费赠送,但至少基本原理和思路还是可以说一说的。

就当普及机器人技术,让广大泥友可以研究一下,活跃咱大书剑的气氛。

书归正传——

护镖和护送的技术原理是一样的,都是计算出路径,然后把路径里的每一步给拆开执行。

评分

2

查看全部评分

门派:明教
 楼主| 发表于 2020-1-10 23:23:23 | 显示全部楼层
本帖最后由 reclus@tj 于 2020-1-13 07:59 编辑

function husongDashiStart()
    flag.idle = nil
      exe('少林护送任务中')
      exe('set env_msg')
    EnableTriggerGroup("husongDashiAsk",false)
        EnableTriggerGroup("husongFinish",true)
        local path, len = map:getPath(road.id,"hengshan/baiyunan")
        road.husong=utils.split(path,";")

        return checkWait(husongStep,2)
end

这个函数是公版护送机器人计算路径的函数,getPath(road.id,"hengshan/baiyunan"),就是得到A点(road.id)到B点"hengshan/baiyunan"的路径。


road.id是什么东西?就是房间的id,也就是类似"hengshan/baiyunan",翻译过来就是“恒山/白云庵”。
road.id在这里是起始房间,也就是说找到大师的房间,就从那个地方出发往白云庵走。
护镖的话就更简单了,领任务就在福威镖局林镇南那里,从那个地方到目的地,用这个函数就能自动生成路径。


road.husong=utils.split(path,";")

路径生成后,自动存入了变量path里,每一步都是用;号分割的,我们机器人走路就是exe(path)的,现在再用utils.split(path,";")拆分,看到一个;号就拆分一次,最终拆成east,norh...,一堆的走路stop,然后依次存入road.husong里。

function husongStep()
       flag.idle = nil
       EnableTriggerGroup("husongFinish",true)
       if locl.room=="白云庵" then
              return
           end
           if type(road.husong)~="table" then
              return husongWhere()
           end
           if table.getn(road.husong)==0 then
              return husongWhere()
           end
           if hp.qixue_per<60 then
              exe('fu dan')
           end
           road.step = road.husong[1]
           if isNil(road.step) or road.step=="halt" or road.step=="open gate" then
              table.remove(road.husong,1)
              return husongStep()
           end
           EnableTriggerGroup("husongJiaotu",true)
           flag.jiaotu=nil
           flag.lost=nil
           if locl.room=="山门殿" then
              exe('open gate')
           end
           if locl.room=="渡船" then
              return husongBoat()
           end
           if locl.room=="陕晋渡口" and road.id=="changan/road2" then
                  exe('yell boat;enter')
                  -- ain
                  return check_halt(husongBoat)
           end
           exe(road.step)
           exe('hp')
           return check_halt(husongLocate)
end

这个函数就是走路或者推车控制了,大概就是判定当前是推车,那就从road.step里读一次方向,比如护镖就是tui north(往北推车),判定车子往北走了,或者队友把车推到北了,自己紧接着exe('north'),推一步走一步。


road.step = road.husong[1]

road.step一次读road.husong里边的第一个数据,一直读取到路径为空为止。

遇到过门,坐船等特殊状况,跳到特殊函数处理,例如:

           if locl.room=="山门殿" then
              exe('open gate')
           end
           if locl.room=="渡船" then
              return husongBoat()
           end

以上就是过门和坐船的特殊处理,就不能施展轻功渡江了,因为推车需要坐船,护送大师也要坐船的。


以上就是护送和护镖的走路原理,看懂了后,其实是非常非常简单的,照猫画虎抄过来就能用。
大家感兴趣可以自己试试。
门派:丐帮
发表于 2020-1-11 00:07:21 | 显示全部楼层
大半夜的又在放毒     
门派:明教
 楼主| 发表于 2020-1-11 00:18:33 | 显示全部楼层
xiaogao@tj 发表于 2020-1-11 00:07
大半夜的又在放毒

这怎么是放毒呢?

你看不懂就困了,困了正好睡觉啊!
门派:明教
 楼主| 发表于 2020-1-11 00:19:24 | 显示全部楼层
kkfromch@tj 发表于 2020-1-11 00:18
这怎么是放毒呢?

你看不懂就困了,困了正好睡觉啊!

看懂了呢!就是好事情,学到东西喽!

再说这挖的是技术坑,水这个还能增长知识,多好呀!
门派:明教
发表于 2020-1-11 00:38:37 | 显示全部楼层
kkfromch@tj 发表于 2020-1-11 00:18
这怎么是放毒呢?

你看不懂就困了,困了正好睡觉啊!

反正看天书,就当学习把
门派:丐帮
发表于 2020-1-11 06:28:29 | 显示全部楼层
kkfromch@tj 发表于 2020-1-11 00:19
看懂了呢!就是好事情,学到东西喽!

再说这挖的是技术坑,水这个还能增长知识,多好呀!

你说的有道理,我再看一会儿,争取睡个回笼觉
门派:丐帮
发表于 2020-1-11 06:53:06 | 显示全部楼层
这对我们来说是对牛弹琴啊~
门派:丐帮
发表于 2020-1-11 06:53:41 | 显示全部楼层
有思路的自己已经搞出机器人了。
没思路的说了思路我们也不会弄。
门派:古墓派
发表于 2020-1-11 08:24:41 | 显示全部楼层
xiaogao@tj 发表于 2020-1-11 00:07
大半夜的又在放毒

这多好的帖子你太走心了      
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|书剑永恒MUD ( 闽ICP备14012032号|闽公网安备 35050202000162号 )

GMT+8, 2025-8-14 10:45 , Processed in 0.026402 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表