还得求助啊,异步果然是大坑......
仍然是wait.regexp的问题......已经写了差不过15k的代码了,不算数据文件
目前最大问题是异步问题
我现在有个主进程,然后想通过修改属性的办法,让主进程知道自己该做什么
这应该算“状态机”吧?
但目前存在“什么时候判断状态“的问题
某任务做着做着,发生一些情况,”当前状态“被改变,但主进程自己不知道,所以必须在主进程当中,设置一个一个的判断点:当前状态是否正确?不正确返回。而何时判断,我只能选择在每一个可能”wait“的情况后判断,包括wait.time和wait.regexp,因为在等待的情况下,状态可能变化(即其他协程改变了状态)。
但要知道,我做的每一个动作,基本都需要反馈,也就是说,几乎没做一个动作,我都得加上
if o==”abort“ then
return
end
这样还不是最可怕的,我主进程里当然需要调用一些其他的函数,比如查看状态啦,等等,而那些函数有很多也需要反馈,而只要有反馈,就得wait,有wait,就得确定状态是否修改,而状态修改了就必须告诉主函数,所以所有的函数,都得专门加一个返回值,来确定状态是否被修改
而且,我的”状态“还不止一个,至少有两个状态,一个是”主要任务“状态,一个是”打坐(包括吐纳什么的)“状态,换句话说,我要知道是”打坐被终止“还是”任务被终止“。这还只是目前,下一步还不一定有啥东西呢......
所以我现在的程序里,到处充满了
函数1:状态丫的改了吗?改了赶快终止,返回上一级函数啊。
函数2:哦,函数1的状态被终止了?那别继续了,赶快返回上一级函数啊。
函数3:函数2被终止了?别忙活了,赶快返回上一级函数。
主函数:哦,被终止了啊?那赶快换个活干吧
请问,是不是框架设计有问题啊?真正的状态机是啥样的呢?
北大侠客行MUD,中国最好的MUD 哦,错了,是105k代码 好高端 好高端
when 发表于 2015-5-24 01:05 PM http://pkuxkx.com/forum/images/common/back.gif
楼上是诈尸的!!!!
chat* ghost when 我也仔细考虑的解决办法,应该有两个,而且两者都应该可行,只是我不会写
对于改变任务状态的情况,我目前的方法是一路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
呢?
有这样的命令吗? 回复 3# when
我的水平一直是踩在门槛上
对不懂的人来说,觉得我说的很高大上
对懂的人来说,我就是一小白
关键现在要么是懂的,要么是不懂的,像我这样明明不懂还非得努力去搞懂的人太少了......
我的代码,如果给懂的人看,就是个笑话......
别人写1行,我得写10行,还解决不了问题...... 贴一下打坐模块吧
仅仅是打坐罢了......隶属于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 你用一个模块干了太多事情了,分解开比较好。
比如wait1,wait2,wait3
回复 7# ltblue 你用一个模块干了太多事情了,分解开比较好。
比如wait1,wait2,wait3
回复ltblue
oolong 发表于 2015-5-25 01:22 PM http://pkuxkx.com/forum/images/common/back.gif
没法分开写啊
比如打坐模块,是“sit”模块的一部分,是因为需要“sit”模块来判断是打坐,是吐纳,是练功还是发呆?
不用sit模块,每个wait都是只管自己,那什么时候判断是打坐还是吐纳还是发呆呢?
总不能每次调用,都判断一次吧?那代码得写多少?也不好改啊 用zmud。。。