北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 24111|回复: 57

还得求助啊,异步果然是大坑......

[复制链接]
发表于 2015-5-24 20:13:28 | 显示全部楼层 |阅读模式
仍然是wait.regexp的问题......

已经写了差不过15k的代码了,不算数据文件

目前最大问题是异步问题

我现在有个主进程,然后想通过修改属性的办法,让主进程知道自己该做什么

这应该算“状态机”吧?

但目前存在“什么时候判断状态“的问题

某任务做着做着,发生一些情况,”当前状态“被改变,但主进程自己不知道,所以必须在主进程当中,设置一个一个的判断点:当前状态是否正确?不正确返回。而何时判断,我只能选择在每一个可能”wait“的情况后判断,包括wait.time和wait.regexp,因为在等待的情况下,状态可能变化(即其他协程改变了状态)。
但要知道,我做的每一个动作,基本都需要反馈,也就是说,几乎没做一个动作,我都得加上
if o==”abort“ then
  return
end

这样还不是最可怕的,我主进程里当然需要调用一些其他的函数,比如查看状态啦,等等,而那些函数有很多也需要反馈,而只要有反馈,就得wait,有wait,就得确定状态是否修改,而状态修改了就必须告诉主函数,所以所有的函数,都得专门加一个返回值,来确定状态是否被修改

而且,我的”状态“还不止一个,至少有两个状态,一个是”主要任务“状态,一个是”打坐(包括吐纳什么的)“状态,换句话说,我要知道是”打坐被终止“还是”任务被终止“。这还只是目前,下一步还不一定有啥东西呢......

所以我现在的程序里,到处充满了
函数1:状态丫的改了吗?改了赶快终止,返回上一级函数啊。
函数2:哦,函数1的状态被终止了?那别继续了,赶快返回上一级函数啊。
函数3:函数2被终止了?别忙活了,赶快返回上一级函数。
主函数:哦,被终止了啊?那赶快换个活干吧

请问,是不是框架设计有问题啊?真正的状态机是啥样的呢?

北大侠客行MUD,中国最好的MUD
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-5-24 20:24:31 | 显示全部楼层
哦,错了,是105k代码
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-5-24 21:05:19 | 显示全部楼层
好高端
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-5-24 21:39:34 | 显示全部楼层
好高端
when 发表于 2015-5-24 01:05 PM



    楼上是诈尸的!!!!

chat* ghost when
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-5-24 22:13:03 | 显示全部楼层
我也仔细考虑的解决办法,应该有两个,而且两者都应该可行,只是我不会写


对于改变任务状态的情况,我目前的方法是一路return回主函数,这样就可以通过主函数的判断,去执行新的任务(当然这是不正常的情况,正常情况下是代码都写完回主函数,其实真正”改变任务状态“都是非正常情况,但不得不考虑)。这样的问题在于,每个地方都得检查状态,都得看是否if XXX then return

解决办法有两种:
1.结束主协程,并通过其他临时协程,去再次开启主协程
因为我的目的是返回主函数,而主函数是主协程的入口(也是中枢),所以只要我把主协程关了,主函数自然就消失了,也不用return了,一切都消失。然后再通过临时的协程重新运行主协程,这样自动返回了主函数,也就可以再次分配了。
问题在于,我不会关协程......我只会在某协程的所有代码执行之后关闭他,那就需要一路return......能否有命令直接关闭某个协程呢?不管其他任何代码和函数。return是回上一个函数,但上一个函数仍然在协程里,上一个函数的其他代码还得执行啊......我考虑过用协程挂起命令,但是挂起毕竟不是关闭,长期发生会导致内存不足吧?

2.一步直接回主函数
我现在是一路return,能否直接一个return就回到某函数呢?
举例子:
fun a()
b()
print(1)
end

fun b()
c()
print(2)
end

fun c()
return
end
这样的函数的话,肯定是输出(原谅我语法简写)
2
1

我能否
fun c()
return a    --这类的意思,语法肯定不是这么写
end

然后直接返回a,不通过b,直接只输出了
1
呢?

有这样的命令吗?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-5-25 00:18:20 | 显示全部楼层
回复 3# when


我的水平一直是踩在门槛上
对不懂的人来说,觉得我说的很高大上
对懂的人来说,我就是一小白
关键现在要么是懂的,要么是不懂的,像我这样明明不懂还非得努力去搞懂的人太少了......
我的代码,如果给懂的人看,就是个笑话......
别人写1行,我得写10行,还解决不了问题......
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-5-25 09:10:58 | 显示全部楼层
贴一下打坐模块吧
仅仅是打坐罢了......隶属于sit模块,sit模块分为:主体、打坐、吐纳、练功、练内功、判断是否需要练功、判断是否需要练内功,共7部分

function sit_dazuo()
        printd(debug_sit,"开始打坐")
        local dzmovea="^>* *\\s*你还是专心拱猪吧!\\s*$"
        local dzmoveb="^>* *\\s*此地不宜修练!\\s*$"
        local dzmovec="^>* *\\s*卧室不能打坐,会影响别人休息。\\s*$"
        local dzmoved="^>* *\\s*这里不准战斗,也不准打坐。\\s*$"
        local dzbusya="^>* *\\s*你现在正忙着呢。\\s*$"
        local dzbusyb="^>* *\\s*你刚施用过内功,不能马上打坐。\\s*$"
        local dzbusyc="^>* *\\s*你感到体内气息乱窜,无法聚气打坐!\\s*$"
        local dzfight="^>* *\\s*战斗中不能练内功,会走火入魔。\\s*$"
        local dzjifa="^>* *\\s*你必须先用 enable 选择你要用的特殊内功。\\s*$"
        local dzcosta="^>* *\\s*你要花多少气练功?\\s*$"
        local dzcostb="^>* *\\s*你至少需要.*点的气来打坐!\\s*$"
        local dznoqi="^>* *\\s*你没有那么多的气来产生内息运行全身经脉。\\s*$"
        local dznojing="^>* *\\s*你现在精不够,无法控制内息的流动!\\s*$"
       
        Execute("mush_dz")
        local l,w,o=wait_quest(dzmovea .. "|" .. dzmoveb .. "|" .. dzmovec .. "|" ..dzmoved .. "|" .. dzbusya .. "|" .. dzbusyb .. "|" .. dzbusyc .. "|" .. dzfight .. "|" .. dzjifa .. "|" .. dzcosta .. "|" .. dzcostb .. "|" .. dznoqi .. "|" .. dznojing .. "|" .. config.sit.dazuo_b,vil,"yes")
        print(l)
        print(o)
        if o~= "ok" then
                return o
        end
        if string.find(l,"拱猪") or string.find(l,"不宜修练") or string.find(l,"卧室不能打坐") or string.find(l,"也不准打坐") then
                return "move"
        end
       
        if string.find(l,"你现在正忙着呢") or string.find(l,"不能马上打坐") or string.find(l,"无法聚气打坐") then
                local o=wait_time(1,"yes")
                printd(debug_sit,"有点忙")
                if o~="ok" then
                        sta.quest.sit=""
                        return o
                end
                return "ok"
        end
       
        if string.find(l,"战斗中不能练内功") then
                local o=wait_time(1,"yes")
                printd(debug_sit,"有战斗?那怎么还打坐?有问题")
                if o~="ok" then
                        sta.quest.sit=""
                        return o
                end
                return "ok"
        end
       
        if string.find(l,"你要花多少气练功") or string.find(l,"你至少需要") then
                local o=wait_time(1,"yes")
                printd(debug_sit,"打坐信息设置出错")
                quest_list.go_reset.can="yes"
                if o~="ok" then
                        sta.quest.sit=""
                        return o
                end
                return "abort"
        end
       
        if string.find(l,"你没有那么多的气来产生内息运行全身经脉") then
                local o=wait_time(1,"yes")
                printd(debug_sit,"打坐气血不够")
                if o~="ok" then
                        sta.quest.sit=""
                        return o
                end
                if sta.hp.qixue*2*sta.hp.qixue_pst>sta.hp.qixue_max*100 then
                        quest_list.go_reset.can="yes"
                        return "abort"
                else
                        return "ok"
                end
        end
       
        if string.find(l,"选择你要用的特殊内功") then
                local o=wait_time(1,"yes")
                printd(debug_sit,"重新激发内力再试")
                if o~="ok" then
                        sta.quest.sit=""
                        return o
                end
                Execute("jifa force " .. config.jifa.force)
                return "ok"
        end
       
        if string.find(l,"你现在精不够") then
                local o=wait_time(1,"yes")
                printd(debug_sit,"精血不足?回头再看一下状态好了")
                if o~="ok" then
                        sta.quest.sit=""
                        return o
                end
                return "ok"
        end
        printd(debug_sit,"开始打坐了")
        local l,w,o=wait_quest(config.sit.dazuo_o,vil,"yes")
        printd(debug_sit,"打坐完毕了")
        if o~="ok" then
                sta.quest.sit=""
                return o
        end
        return "ok"
end
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-5-25 13:22:50 | 显示全部楼层
你用一个模块干了太多事情了,分解开比较好。

比如wait1,wait2,wait3


回复 7# ltblue
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-5-25 17:48:08 | 显示全部楼层
你用一个模块干了太多事情了,分解开比较好。

比如wait1,wait2,wait3


回复  ltblue
oolong 发表于 2015-5-25 01:22 PM



没法分开写啊
比如打坐模块,是“sit”模块的一部分,是因为需要“sit”模块来判断是打坐,是吐纳,是练功还是发呆?
不用sit模块,每个wait都是只管自己,那什么时候判断是打坐还是吐纳还是发呆呢?
总不能每次调用,都判断一次吧?那代码得写多少?也不好改啊
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-5-25 18:05:36 | 显示全部楼层
用zmud。。。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-14 11:28 PM , Processed in 0.012578 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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