找回密码
 注册
搜索
楼主: kkfromch@tj

重大发现,彻底修复误入梅林问题!

[复制链接]
门派:明教
 楼主| 发表于 2019-3-24 15:29:21 | 显示全部楼层
梅林这个坑真是超级大啊!写了这么多,才刚刚说清楚第一个问题,后边还有N个问题呢!要不怎么说巨坑呢!

下边来说说第二个问题,mush死机原因!

在分析这个原因之前,我们来看看梅林迷宫的行走原理,先看zmud版,比较好理解——

#**梅庄青石板大路;#al w_back {w_ml}
#**梅庄庄院大门;#al w_back {w_ml}

#FUNC step {n}
#TRIGGER {^??梅林 - } {#if @step=s {next_step=w};#if @step=w {next_step=n};#if @step=n {next_step=e};#if @step=e {next_step=s};step=@next_step;#t- meizhuang;alias action 走出梅林!} {meizhuang} 548
#TRIGGER {^??小路 - } {#t- meizhuang;#t- meizhuang1;step=s;bb {n;w;w;w;ne;se;dw}} {meizhuang} 548
#TRIGGER {^??这个方向没有} {#if @step=n {next_step=w};#if @step=w {next_step=s};#if @step=s {next_step=e};#if @step=e {next_step=n};step=@next_step;#t- meizhuang;alias action 走出梅林!} {meizhuang} 548
#TRIGGER {^??青石板大路 - } {#t- meizhuang;n;n;w;e;alias action 走出梅林!} {meizhuang} 548
#TRIGGER {^??这片梅林幽深曲折,你还是不要使用行走时的简短描述模式吧。} {step=n;#wa 2000;#t+ meizhuang;#t+ meizhuang1;look} {} 519
#ALIAS w_ml {#t- meizhuang;#t- meizhuang1;n;n;e;w;n;bbb {step=n;#t+ meizhuang;#t+ meizhuang1;look}}
#TRIGGER {^??你把 "action" 设定为 "走出梅林!" 成功完成。} {#t+ meizhuang;@step} {meizhuang1} 548

-------

大致原理很简单——

先走n;然后判定是梅林的话,如果之前走了s,那么接下来走w;如果之前走了w,接下来走n;如果之前走了n,接着走e;如果之前走了e,那么接着走s!

如果没有方向怎么办?也很简单!

如果之前走了n,没方向,那么接着走w;走w再没方向,走s;走s没方向,走e;走e没方向,则走n。

然后没走一步,都要look一下,如果发现小路,则说明走出来了;如果发现青石板大路,则走到梅庄大门前了;如果这些都不是,则说明已经走出来了!
门派:明教
 楼主| 发表于 2019-3-24 15:35:26 | 显示全部楼层
转换成mush程序,大概就是这么个东东——

    local ways = {
                ["north"] = "east",
                ["east"]  = "south",
                ["south"] = "west",
                ["west"]  = "north",
        }
        local wayt = {
                ["north"] = "west",
                ["east"]  = "north",
                ["south"] = "east",
                ["west"]  = "south",
        }

ways里边装着有路走的关系,例如["north"] = "east",就是之前走了north,那么下一步就是走east,很简单吧?

wayt里则装着没路走的关系,例如["north"] = "west",就是如果走north走不通,下一步走west。

然后每走一步,循环调用一次这个函数wayMl()

        tmp.way = ways[tmp.way]--有路走的话,让下一步行走方向,遵循ways
        while not locl.exit[tmp.way] do--然后让上一步取得的方向,去做判断,是否有路,没有则用wayt判断下一步的方向,直到找到出口为止,这是个循环程序!
            Note(tmp.way)
            tmp.way = wayt[tmp.way]
        end
门派:明教
 楼主| 发表于 2019-3-24 15:47:33 | 显示全部楼层
且先不说,这个mush程序有没有问题?我们来看看mush死机的原因,就是因为不断地在梅林里走啊。。走啊。。走啊。。。一直走到死机也走不出来!

而mush死机的唯一原因,就是调用资源过多,尤其死循环程序,特别容易导致死机。

比如——

        locate()
        return checkWait(wayMl,0.2)

在定位之后,checkWait 0.2秒之后,再次调用wayMl,这个走一次调用一次,一连走上100次,就是创建了100个0.2秒的计时器,循环了100次的wayMl函数,谁的机器也受不了啊!

而且之前岛主的梅林code,有的地方是0.07秒的等待,基本上fastlocate没等抓到地点信息,就再次调用wayMl函数了。

所以避免死机的第一个改动——

checkWait(wayMl,0.5)

所有的checkwait都改成0.5秒等待,相当于搜索模式下的等待间隔,如果大家不放心,还可以改成1秒等待,总之给机器一个暂缓,休息一下!不要太频繁调用系统资源。

(昨晚为了测试最佳方案,还尝试了doafterspecial,结果发现更坑,没跑几步就死机了,所以还是checkwait更靠谱一些!)

第二个改动——

function wait_seconds()
        wait.make(function()
         wait.time(5)
        return wayMl()
    end)
end
function wayMl()
        tmp.cnt=tmp.cnt+1
        if tmp.cnt>50 then
           tmp.cnt=0
           return wait_seconds()
        end


啥意思呢?很简单!

利用计数器tmp.cnt计数,每调用wayMl一次,tmp.cnt +1,如果累积调用50次后,跳转去wait_seconds休息5秒,然后再返回wayMl接着干!

这种走走停停地方式很有效果,我昨晚开着机器人,在梅林跑了30分钟,也没见死机过!
门派:明教
 楼主| 发表于 2019-3-24 15:56:18 | 显示全部楼层
好了,梅林第二个坑,mush死机问题说完了!

我们接着说第三个坑——while do(梅林坑太多,大家一定要小心

--------

梅林倒走问题解决了,死机问题解决了,可是如果走得很深的话,机器人还是走不出来,这是为啥呢?

我昨晚彻夜对那个坑爹的while not locl.exit[tmp.way] do 进行了研究!

发现它会多循环一次,是的,幸亏我记得20年前大学时老师讲的,while do的循环,会多循环一次,导致本来都找到了出口,又坑爹地多判断了一次,结果给了错误的出口。

具体log就不贴了,总之可以用以下两个方式修复——

        repeat
       if not locl.exit[tmp.way] then
              Note(tmp.way)
              tmp.way = wayt[tmp.way]
       end
        until(locl.exit[tmp.way])


也就是说,先判断条件,然后决定是否进行下边循环,并直到条件满足为止!

如果大家不放心这个,那干脆把这个循环用土办法实现好了——

        if not locl.exit[tmp.way] then
           Note(tmp.way)
           tmp.way = wayt[tmp.way]
        end
        if not locl.exit[tmp.way] then
           Note(tmp.way)
           tmp.way = wayt[tmp.way]
        end
        if not locl.exit[tmp.way] then
           Note(tmp.way)
           tmp.way = wayt[tmp.way]
        end
        if not locl.exit[tmp.way] then
           Note(tmp.way)
           tmp.way = wayt[tmp.way]
        end


同样的判断写四遍,相当于循环了四次,如果在前边找到出口,就直接出去了,不会再执行后边的判断了!
门派:明教
 楼主| 发表于 2019-3-24 16:02:09 | 显示全部楼层
梅林第四坑——locl.exit不完整!

这个坑隐藏得最深,我要配合log来说明——

<!-- Produced by MUSHclient v 4.84 - www.mushclient.com -->


梅林 -
    这是梅林中的一条小路,小路往北就出了梅林,在远处似乎折向了西边。
四处遍地都是梅树,枝叶茂密地连天空都被遮住了,很难看清周围的情况。
  
这是一个初秋的正午时分,遮天蔽日的尘土飞得老高,天色黄黄的。
    这里明显的出口是 northeast
  
河北山贼 皮瑛艳(Pi yingyan)
  
长乐帮熊敏堂属下帮众 范可(Fan ke)
> 梅林 - east、north、south、west
  河北山贼 皮瑛艳(Pi yingyan)
  
长乐帮熊敏堂属下帮众 范可(Fan ke)
> 这个方向没有出路。
> 你把 "action" 设定为 "正在定位" 成功完成。
> 设定环境变量:look = "YES"
> 梅林 -
    这是梅林中的一条小路。举目望去,四处遍地都是梅树,枝叶茂密地连天
空都被遮住了,很难看清周围的情况。
  
这是一个初秋的正午时分,遮天蔽日的尘土飞得老高,天色黄黄的。
    这里明显的出口是 west、eastsouth
l_exit=west、east 和 south
p=west
p=east
  河北山贼 皮瑛艳(Pi yingyan)
  
长乐帮熊敏堂属下帮众 范可(Fan ke)
>
alias action 等待一下
你把 "
action" 设定为 "等待一下" 成功完成。
east
alias action 正在定位
set look
l
> 梅林 - east、north、south、west
  河北山贼 皮瑛艳(Pi yingyan)
  
长乐帮熊敏堂属下帮众 范可(Fan ke)
> 你把 "action" 设定为 "正在定位" 成功完成。
> 设定环境变量:look = "YES"
> 梅林 -
    这是梅林中的一条小路。举目望去,四处遍地都是梅树,枝叶茂密地连天
空都被遮住了,很难看清周围的情况。
  
这是一个初秋的正午时分,遮天蔽日的尘土飞得老高,天色黄黄的。
    这里明显的出口是 west、eastsouth
l_exit=west、east 和 south
p=west
p=east
  河北山贼 皮瑛艳(Pi yingyan)
  
长乐帮熊敏堂属下帮众 范可(Fan ke)
>
alias action 等待一下
你把 "
action" 设定为 "等待一下" 成功完成。
south
east
alias action 正在定位
set look
l
> 梅林 - east、north、south、west
  河北山贼 皮瑛艳(Pi yingyan)
  
长乐帮熊敏堂属下帮众 范可(Fan ke)
> 你把 "action" 设定为 "正在定位" 成功完成。
> 设定环境变量:look = "YES"
> 梅林 -
    这是梅林中的一条小路。举目望去,四处遍地都是梅树,枝叶茂密地连天
空都被遮住了,很难看清周围的情况。
  
这是一个初秋的正午时分,遮天蔽日的尘土飞得老高,天色黄黄的。
    这里明显的出口是 westsouth
l_exit=west 和 south
p=west
  河北山贼 皮瑛艳(Pi yingyan)
  
长乐帮熊敏堂属下帮众 范可(Fan ke)
>
alias action 等待一下
你把 "
action" 设定为 "等待一下" 成功完成。
south
east
north
west
alias action 正在定位
set look
l
> 梅林 - east、north、south、west
  河北山贼 皮瑛艳(Pi yingyan)
  
长乐帮熊敏堂属下帮众 范可(Fan ke)
> 你把 "action" 设定为 "正在定位" 成功完成。
> 设定环境变量:look = "YES"
> 梅林 -
    这是梅林中的一条小路。举目望去,四处遍地都是梅树,枝叶茂密地连天
空都被遮住了,很难看清周围的情况。
  
这是一个初秋的正午时分,遮天蔽日的尘土飞得老高,天色黄黄的。
    这里明显的出口是 west、eastsouth
l_exit=west、east 和 south
p=west
p=east
  河北山贼 皮瑛艳(Pi yingyan)
  
长乐帮熊敏堂属下帮众 范可(Fan ke)
>
alias action 等待一下
你把 "
action" 设定为 "等待一下" 成功完成。
north
west
alias action 正在定位
set look
l
> 梅林 - east、north、south、west
  河北山贼 皮瑛艳(Pi yingyan)
  
长乐帮熊敏堂属下帮众 范可(Fan ke)
> 你把 "action" 设定为 "正在定位" 成功完成。
> 设定环境变量:look = "YES"
> 梅林 -
    这是梅林中的一条小路。举目望去,四处遍地都是梅树,枝叶茂密地连天
空都被遮住了,很难看清周围的情况。
  
这是一个初秋的正午时分,遮天蔽日的尘土飞得老高,天色黄黄的。
    这里明显的出口是 west、eastsouth
l_exit=west、east 和 south
p=west
p=east
  河北山贼 皮瑛艳(Pi yingyan)
  
长乐帮熊敏堂属下帮众 范可(Fan ke)
>
alias action 等待一下
你把 "
action" 设定为 "等待一下" 成功完成。
north
west
alias action 正在定位
set look
l
> 梅林 - east、north、south、west
  河北山贼 皮瑛艳(Pi yingyan)
  
长乐帮熊敏堂属下帮众 范可(Fan ke)
> 你把 "action" 设定为 "正在定位" 成功完成。
> 设定环境变量:look = "YES"
> 梅林 -
    这是梅林中的一条小路,小路往北就出了梅林,在远处似乎折向了西边。
四处遍地都是梅树,枝叶茂密地连天空都被遮住了,很难看清周围的情况。
  
这是一个初秋的正午时分,遮天蔽日的尘土飞得老高,天色黄黄的。
    这里明显的出口是 northeast
l_exit=north 和 east
p=north
p=east
  河北山贼 皮瑛艳(Pi yingyan)
  
长乐帮熊敏堂属下帮众 范可(Fan ke)
>
alias action 等待一下
你把 "
action" 设定为 "等待一下" 成功完成。
north
alias action 正在定位
set look
l
> 小路 - north、south
> 你把 "action" 设定为 "正在定位" 成功完成。
> 设定环境变量:look = "YES"
> 【你现在正处于梅庄
                            小路               
                             |     
                           
小路               
                             |     
                            梅林               
小路 -
unset look
小路|小路|梅林小路
    这里已经到了梅林前面,只见遍地都是梅树,枝叶茂密。想象初春梅花盛
开之时,香雪如海,定然观赏不尽。北面的一条小路折向西方。
  
这是一个初秋的正午时分,遮天蔽日的尘土飞得老高,天色黄黄的。
    这里明显的出口是 northsouth
l_exit=north 和 south
p=north
> Ok.
>
alias action 等待一下
你把 "
action" 设定为 "等待一下" 成功完成。
出来了
n
halt
> 小路 - south、west
> 你现在不忙。
halt
west
west
west
northeast
southeast
east
north
north
north
north
north
north
north
northeast
north
north
north
north
north
north
north
north
north
northwest
north
> 你现在不忙。
>
alias action 正在赶路中
石级 -
east、west
> 西湖边 - east、west
  二位游客(You ke)
> 孤山 - east、north、northeast、south、west
  西南保镖 孙美(Sun mei)
  张夫人(Beauty)
> 白堤 - north、northeast、northwest、southeast、southwest、west
  二位游客(You ke)
> 岳王庙 - east、enter、northwest、southeast、west
> 鸿昌客栈 - east、north、up、west
  店小二(Xiao er)
  古墓派弃徒 佟琴(Tong qin)
>
alias action 正在赶路中
青石大道 -
east、north、south、west
> 青石大道 - east、north、south、west
  腐烂的男尸(Nan shi)
> 青石大道 - east、north、south、west
  昨夜雨疏风骤「美女在杭州城白堤」绿肥红瘦(Justsoso)
  
古墓派神雕侠侣传人「武当任务梅庄西湖边」米笑(Tzhulei)
  
大理国平北王「武当任务福州城南门」於菟(Wutu)
> 北门 - north、south
  武将(Wu jiang)
  二位官兵(Guan bing)
> 青石大道 - north、south
> 山路 - east、north、south、west
> 山路 - east、northeast、south、west
> 青石官道 - north、northeast、southeast、southwest
  二只野兔(Ye tu)
> 南门 - north、south
  武将(Wu jiang)
  二位官兵(Guan bing)
> 南大街 - east、north、south、west
> 南大街 - east、north、northeast、south、southwest、west
  武当派第二代弟子「美女在福州城武夷山路」大仙儿(Taoism)
> 宝带桥 - north、northeast、northwest、south
  小贩子(Xiao fan)
> 韦小宝色迷迷地盯着你,陶醉地低声唱道,“一呀摸,摸到金庸姐姐的头发边……”。
沧浪亭 - north、south、southeast、southwest
  鹿鼎公小白龙」韦小宝(Wei xiaobao)
  丐帮帮众 青年乞丐(Qi gai)
> 北大街 - east、north、south、southwest、west
> 北大街 - east、north、south、west
> 北门 - north、south、west
  武将(Wu jiang)
  二位官兵(Guan bing)
  长剑(Changjian)
  艳兰风的尸体(Corpse)
> 苏州北郊 - northwest、south、southwest、west
> 江南官道 - north、southeast
> 长江南岸 - east、south、west


门派:天龙寺
发表于 2019-3-24 16:14:09 | 显示全部楼层
已更新,无法兄辛苦了。
门派:丐帮
发表于 2019-3-24 16:24:53 | 显示全部楼层
辛苦辛苦,看着意思是不是有点像黄河很多什么的问题有点像啊。
门派:古墓派
发表于 2019-3-24 16:33:32 | 显示全部楼层
小风神的研究精神真棒,赞一个
门派:古墓派
发表于 2019-3-24 16:34:17 | 显示全部楼层
我是不去梅林,太麻烦了。
门派:天龙寺
发表于 2019-3-24 16:43:51 | 显示全部楼层
我的lujing.lua没有你放上来的路径。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-7 18:45 , Processed in 0.031912 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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