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

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

[复制链接]
门派:大轮寺
发表于 2019-3-24 16:55:25 | 显示全部楼层
同样是九年义务教育

门派:明教
 楼主| 发表于 2019-3-24 16:57:05 | 显示全部楼层
kuer@tj 发表于 2019-3-24 16:24
辛苦辛苦,看着意思是不是有点像黄河很多什么的问题有点像啊。

对!就是一样的问题walk_wait调用了错误的path_start,因为黄河大渡口频繁换渡口,里边用了很多的path_consider,有时候就乱套了,walk_wait在渡河之后,不一定就调用哪一个了?

一般都是宋远桥到黄河这段,然后走到永登客栈,开始yell boat;dazuo,然后因为得不到响应,就会在永登附近发呆。
门派:明教
 楼主| 发表于 2019-3-24 17:56:32 | 显示全部楼层
kkfromch@tj 发表于 2019-3-24 16:02
梅林第四坑——locl.exit不完整!

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

刚才去解决这第四个坑了,刚刚才解决掉,接着来分析——

这个坑真是太坑了,完全是lua自身的问题,或者说是mush的问题。

是啥呢?

> 梅林 -
    这是梅林中的一条小路。举目望去,四处遍地都是梅树,枝叶茂密地连天
空都被遮住了,很难看清周围的情况。
  这是一个初秋的正午时分,遮天蔽日的尘土飞得老高,天色黄黄的。
    这里明显的出口是 west、east 和 south。
l_exit=west、east 和 south
p=west
p=east


-------
这里我解释一下,mush机器人判断出口的话,调用的是函数——

local_exit=function(n,l,w)

然后在这个函数里,又调用了exit_set,它把出口字段“ west、east 和 south”进行处理,然后用string.gmatch(l_exit, "(%a+)"),把里边的字母都提取出来,装入数组l_set里,然后返回return l_set。

所以这个出口信息进行处理后,就是——
l_set[1]='west'
l_set[2]='east'
l_set[3]='south'
门派:明教
 楼主| 发表于 2019-3-24 18:07:53 | 显示全部楼层
kkfromch@tj 发表于 2019-3-24 17:56
刚才去解决这第四个坑了,刚刚才解决掉,接着来分析——

这个坑真是太坑了,完全是lua自身的问题,或 ...

现在我们抓到了3个出口,然后把它返回之前的函数

local_exit=function(n,l,w)
……
exit.locl=exit_set(w[3])
……

这样,exit.locl就等于之前的l_set,它里边应该就装着west,east,south了。

再接下来,要对这三个出口赋予true,在其它的函数调用中,如果发现west=true,就说明往西的出口是开放的。

反之,如果没有找到west=true,则说明在当前房间,west的出口是不存在的。

还是——

local_exit=function(n,l,w)
……
for _,p in pairs(exit.locl) do
       locl.exit[p]=true
           print('p='..p)
    end

……

这个比较难懂,我解释一下,就是说,in pairs,逐个比较exit.locl,也就是比较里边存的west,east,south,找到一个,则将这个方向赋予true。

那么这段程序执行完毕后,就是——

locl.exit[west]=true
locl.exit[east]=true
locl.exit[south]=true


------

还记得之前梅林函数的判断吗?那个while not do,就是在用这个判断。

例如:下一步应该走east,就判断locl.exit[east]=true吗?等于就是有这个方向,能走通,木有就说明此路不同,需要换下一个方向。

真绕,估计能看到这里的,都是有一定基础的机器高手了,我自己写到这里也担心能看懂的有多少人呢?

继续。。。。

我为了判断是否取得了完整的locl.exit,我就在上边赋值的时候,打印那个p变量,也就是这个——

for _,p in pairs(exit.locl) do
       locl.exit[p]=true
           print('p='..p)
    end

门派:明教
 楼主| 发表于 2019-3-24 18:17:25 | 显示全部楼层
本帖最后由 kkfromch@tj 于 2019-3-27 14:27 编辑

结果呢?

> 梅林 -
    这是梅林中的一条小路。举目望去,四处遍地都是梅树,枝叶茂密地连天
空都被遮住了,很难看清周围的情况。
  这是一个初秋的正午时分,遮天蔽日的尘土飞得老高,天色黄黄的。
    这里明显的出口是 west、east 和 south。
l_exit=west、east 和 south
p=west
p=east


……
……

看到了吗?p取得的方向有丢失,往往三个出口,只能抓到2个,或者两个出口,只抓到了1个。

这就会导致梅林的迷宫函数判断错误,开玩笑!本来三个出口,少了一个,走得路肯定不对啊!

而只要走错了一步,就是前功尽弃,基本上是没可能走出来了,这也就是梅林最坑最坑的地方!!!

--------

这个难题搞了我好久,反复查资料核实,确认函数没有问题,但是它就是有时候丢失,有时候不丢失!

最后推测,应该是频繁调用这个函数,不断创建数组

        exit.locl={}
        locl.exit={}

然后赋值的方式是=,而非table.insert,所以会导致数组赋值不完整,或者指针丢失的情况出现,也就是p丢了方向。

这个,也许就是mushclient,或者lua的不足了,如果有懂这个原理的机器大神,希望能解惑,为啥会出现这样的问题呢?实在是琢磨不透啊!

最后,我只能改写了local_exit函数,问题彻底解决,如下——

  1. local_exit=function(n,l,w)
  2.         EnableTimer('loclWait',false)
  3.     local cnt
  4.         localget=1
  5.         exit.locl={}
  6.         locl.exit={}
  7.     --exit.locl=exit_set(w[3])
  8.     local l_exit=Trim(w[3])
  9.     for w in string.gmatch(l_exit, "(%a+)") do
  10.         table.insert(exit.locl, w)
  11.     end
  12.        
  13.     local l_set=exit.locl
  14.     if roomNodir[locl.where] then
  15.        l_set=del_element(l_set,roomNodir[locl.where])
  16.     end
  17.     cnt=table.getn(l_set)
  18.     if cnt==0 or cnt==nil then
  19.        cnt=1
  20.     end
  21.     cnt=math.random(1,cnt)
  22.     locl.dir=l_set[cnt]
  23.     if locl.dir==nil then
  24.        locl.dir='east'
  25.     end
  26.         for i=1,table.getn(exit.locl) do
  27.                 locl.exit[exit.locl[i]]=true--[color=Blue]这个地方变斜体了,又把i给吞了,应该是exit.locl[ i  ][/color]
  28.         end
  29.     --[[for _,p in pairs(exit.locl) do
  30.        locl.exit[p]=true
  31.            print('p='..p)
  32.     end]]
  33.         if locate_finish~=0 then
  34.             return _G[locate_finish]()
  35.         end
  36. end
复制代码
门派:明教
 楼主| 发表于 2019-3-24 18:20:22 | 显示全部楼层
经过这样的修改后,梅林算是没有问题了,可以如履平地,随意进出了!

大家感兴趣的话,可以去更新一下,然后我们在梅林谈天说地,一起逍遥!
门派:神龙教
发表于 2019-3-27 07:15:36 | 显示全部楼层
感谢无法风前辈,我已经改了,你前面发的代码,后面的还要改吗?
门派:丐帮
发表于 2019-3-27 10:03:57 | 显示全部楼层
  1. Room {
  2.         id = "meizhuang/plum_maze",
  3.         name = "梅林",
  4.         ways = {
  5.                 ["#mlOutt"] = "meizhuang/road2",
  6.         },
  7. }
复制代码


最后的为啥是斜体字,又丢符号之类的了么?我顺便测试一下贴代码。
门派:明教
 楼主| 发表于 2019-3-27 14:29:41 | 显示全部楼层
honglian@tj 发表于 2019-3-27 10:03
最后的为啥是斜体字,又丢符号之类的了么?我顺便测试一下贴代码。

我才知道这个功能,多谢啦!汗!
门派:明教
 楼主| 发表于 2019-3-27 14:31:05 | 显示全部楼层
lkjxmqz@tj 发表于 2019-3-27 07:15
感谢无法风前辈,我已经改了,你前面发的代码,后面的还要改吗?

都要改!                        
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-7 18:43 , Processed in 0.038566 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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