creat 发表于 2016-6-11 23:19:23

mushclient中的speed walking(快速行走)

speedwalk是mushclient中的一个强大的功能,不过用得人似乎不多。
首先,speedwalk字面上的意思是快速行走。至于能走多快,取决于你和服务器双方的设置。
1:快速行走不同于我们常用的单行多命令:

单行多命令:在你按下回车的瞬间把所有输入的命令发送给服务器,这样做的好处在于只要服务器支持就能够瞬间处理所有问题。

单行多命令形如:e;e;e;e;e;e;e;e;s;s;s;s;s;s;s;s;n;n;n;n;n;n;n;n;w;w;w;w;w;w;w;w;eat gold;eat gold;eat gold;eat gold;eat gold;eat gold;eat gold;eat gold

或者:e\ne\ne\ne\ne\ne\ne\ne\ns\ns\ns\ns\ns\ns\ns\ns\nn\nn\nn\nn\nn\nn\nn\nn\nw\nw\nw\nw\nw\nw\nw\nw\neat gold\neat gold\neat gold\neat gold\neat gold\neat gold\neat gold\neat gold

快速行走:在你按下回车后,要输入的命令进入客户端队列,并按照预设的间隔把命令逐条发送给服务器。处理速度上快速行走不会比单行多命令更快,好处是只要延迟设置合理,不会出现服务器吞命令的情况。

快速行走命令形如:8e8s8n8w8(eat gold)

在上面的例子中我们看到了一个括号,这是快速行走的中经常会出现的格式。

快速行走只支持6个内建方向:N:north, S:south, E:east, W:west, U:up, D:down、4个内建动作:C:close; O:open; L:lock; K:unlock、还有一个自定义动作:F:filler。

其中基本上我们能用得上的只有6个内建方向和各种自定义动作(eat gold)
2:快速行走的优势:

支持0-30000毫秒的发送间隔

同一命令重复多达99次(很少用到这么多次吧)

支持命令中断,对未发送命令可抛弃或者回收以备再次使用

写法格式统一兼容性好,不需要额外的设置(单行多命令也可以用\n来统一,不过看起来好费劲啊)

如果说单行多命令是单程车票,那么快速行走就是往返票,它支持反向行走。

比如:

单行多命令:path="s\ne\ns\ne\ns\nw\nnu\nd\open door\nenter" --定义路径

Send (path)--去

path="open door\nout\nu\nsd\ne\nn\nw\nn\nw\nn" --定义路径

Send (path)--回

快速行走:path="sesesw(nu/sd)d(open door/out)(enter/open door)" --定义路径

Send (EvaluateSpeedwalk (path))--去

Send (EvaluateSpeedwalk (ReverseSpeedwalk(path)))--回



3:以下是快速行走相关的函数
延迟命令:
Note (GetSpeedWalkDelay ()) -- 显示延迟时间
SetSpeedWalkDelay (5000) -- 设置为5秒延迟
等待后发送:
DoAfterSpeedWalk (10, "5e 4s w") --10秒后开始执行快速行走
格式转换:
Note(EvaluateSpeedwalk ("4n3esuwdLW")) --转换为单行单命令格式
方向转换:
Note(ReverseSpeedwalk ("4n3esuwdLW(ne/sw)"))--反转路径
立即发送命令到服务器:
SendImmediate ("go north") ---这个虽然不是快速行走命令,不过在需要插队的时候会用到
清除命令队列:
DiscardQueue()
---清除命令队列,所有在队列中的指令失效
加入命令队列:
Queue (EvaluateSpeedwalk("4n"), true)
---加入快速行走命令到队列中,并回显
Queue (EvaluateSpeedwalk("4n"), false)
---加入快速行走命令到队列中,不回显
显示当前命令队列:
---显示当前命令队列中的命令。可以回收再利用
for k, v in pairs (GetQueue()) do
Note (v)
end

以上是我对快速行走的一些看法,欢迎拍砖,欢迎讨论

北大侠客行MUD,中国最好的MUD

sunpepe 发表于 2016-6-12 01:13:38

很有用。解决了一连串动作中个别动作要延后一段时间做的问题,不过貌似这些问题通过script中的DoAfterSpecial命令也可以解决。路径的来与回,中间插入命令,这种设置比较方便。

hypnos 发表于 2016-6-12 02:29:54

本帖最后由 hypnos 于 2016-6-12 02:40 AM 编辑

北侠的路况比较复杂,比如丐帮暗道的梁长老那,进暗道的两个指令应该一气呵成,中间如果有延迟,会增大(虽然幅度可能不是很大)被T的概率;再就是很多地方可能正向有n个指令、反向有m(n≠m)个指令,不知道有没有针对这种特定场景的解决方案?如果没有,用废指令来代替的话,也许后期在程序扩展的时候可能会遇到麻烦?

网络延迟非常高的情况下,指令防吞好像无法100%避免……

感觉zmud/mush提供的一些原生高级功能(比如快速行走、地图)更适用于英文MUD,对中文MUD还是需要辅以一些技巧才能玩得溜,而这些高级功能如果无法做到接近完美的开箱即用的话,强迫症的我表示更愿意自己整一套轮子=.=

不过mush的快速行走已经做得相当成熟,的确是快速开发的利器。命令队列的设计也非常开拓(俺这种没见过世面的小菜鸟的)思路。mush入门之后,掌握快速行走可以为自己的机器人锦上添花,也就离月袋大侠(楼主)的飞花摘叶皆可伤人的mush大成境界更近一步了{:7_279:}

——以上,半瓶水mush用户的一点乱评

misfit 发表于 2017-5-13 12:02:31

大师。。有没有mush的机器人教学帖子啊   从零开始 从无到有 那种 我是新人选择了mush因为好看。。。输出内容 好看。。。zmud简单一些 但我还是 选择了 高大上的mush 但是。。。我需要从零开始的 mush机器人 教学。第一次接触文字mud

mathematics 发表于 2019-10-8 17:05:46

yct43.好贴,收藏之~

ajump 发表于 2021-6-14 09:41:16

DiscardQueue()
---清除命令队列,所有在队列中的指令失效.

有没有能够将未执行的命令缓存,等杀完npc再实现继续行走的指令?类似zmud的#step。
这个东西看起来要比zmud的path功能好。因为它可以给每条path规定自己的反方向。而且不需要自己去脚本里面写迭代器那种我看不懂的东西。
但是这个speedwalking的最长间隔只有30秒,30秒内我杀不死npc。如何能够实现它无限期挂起,等我杀完npc再设置delay0快速行走完剩下的路呢

ajump 发表于 2021-6-14 09:45:31

哦,好像是这段,但以我的智商我没看懂
显示当前命令队列:
---显示当前命令队列中的命令。可以回收再利用
for k, v in pairs (GetQueue()) do
Note (v)
end

具体如何回收这个我真的……k是什么?v是什么?它都是自动的吗?

suwuji 发表于 2021-6-14 10:51:29

ajump 发表于 2021-6-14 09:45 AM
哦,好像是这段,但以我的智商我没看懂
显示当前命令队列:
---显示当前命令队列中的命令。可以回收再利用


k,v是自定义的,但是自动被pairs枚举赋值的,table中的每个key和value,table==value

ajump 发表于 2021-6-14 11:51:36

suwuji 发表于 2021-6-14 10:51 AM
k,v是自定义的,但是自动被pairs枚举赋值的,table中的每个key和value,table==value ...

哦,那明白了。就是挨个显示一遍。该怎么实现回收再利用呢

creat 发表于 2021-6-15 19:53:45

本帖最后由 creat 于 2021-6-15 08:00 PM 编辑

能显示即能赋值,能赋值即可再次使用
举个栗子Queue_temp_t={}
for k, v in pairs (GetQueue()) do
Queue_temp_t=v
end此处可选择DiscardQueue()
for i=1,#Queue_temp_t
do
Queue(Queue_temp_t)
print (Queue_temp_t)
end

页: [1]
查看完整版本: mushclient中的speed walking(快速行走)