littleknife
发表于 2015-5-31 06:08:13
本帖最后由 littleknife 于 2015-5-31 06:12 AM 编辑
1、不要太拘泥于细节,以结果为导向。即如果认为某些地方需要深入研究,可以先记录下来等有时间了在研究,把主要几个支撑模块(打坐吐纳模块、行走模块、学习修炼模块、战斗模块、任务总控制模块)做好,这样基本自己的框架就做好了。然后特定的某个任务模块(应用层),就依据上面的几个已经做好的模块进行设计(先进行流程设计,然后进行代码书写)即可。
2、一个函数在Lua里就是一个值,只不过这个值是用算法算出来后返给函数名而已。因为是个值,所以可以做各种参数。比如函数的参数function a(b,c,d,e)....end ;function b() print("okok") end 等等。
3、wait是个书写协程的模块。我认为最好的应用机器还是尊重任务顺序,即任务流程来进行。同时考虑各种状态的监控来完成特殊的需要。
就想到这么多,希望能对楼主有些参考。
至于对我的那个帖子(一个脚本)如何看,请不要拘泥,因为好多的Mush高手都有自己的思路来写机器。所谓条条大路通罗马,我的这个思路也许很笨甚至很没效率,越深入也许发现自己的好多方法来得更效率,请果断抛弃。此贴只是一个思路和自身学习笔记罢了。。呵呵。。祝楼主玩好~~~。
ltblue
发表于 2015-5-31 12:00:59
1、不要太拘泥于细节,以结果为导向。即如果认为某些地方需要深入研究,可以先记录下来等有时间了在研究,把 ...
littleknife 发表于 2015-5-31 06:08 AM http://pkuxkx.com/forum/images/common/back.gif
啊,亲自来了啊,哈哈
1.目前模块部分,地图画完了,行走、打坐吐纳模块完毕了,战斗模块框架起来了,简单的战斗已经能运行了,任务模块目前刚搭起来半个任务,主控制区域基本写完了(任务主控制模块没几句话),目前已经能完成半个任务了,后面的还没写。主要在自身懒,比如昨天玩起来欧陆风云4,就没写,呵呵。
2.函数名作为一个变量?可以直接调用是吧?
比如
function aaa(text)
print(text)
end
function b(bbb)
bbb("ok")
end
function c()
b(aaa)
end
这样运行c(),就能打印“ok”了是吧?
就是函数c中,以函数aaa作为参数,调用了b函数,在b函数中,bbb参数就意味着aaa函数,然后bbb("ok")意味着aaa("ok"),然后打印出“ok”来,是吧?
如果这样的话,我的主控函数可以稍微改一下了,可以把“当前任务函数”作为变量进行运行,而不用“当前任务名称”作为变量了。
3.老实说,真写起来,我才发现一直用wait的确很坑啊......我又努力控制自己make协程的数量,能不用协程就不用,这样相当于zmud里严格控制每一个触发器的开关,有些可以冗余的东西都用不了了。
还是觉得,每一个wait.regexp都代表一个“触发器”,我相当于不停的新建触发器,关闭触发器等等。
其实我这个帖子的核心问题就在于:zmud的触发器可以互相关闭,比如被pk了,被pk的触发器可以瞬间关闭其他所有的“触发器组”,专心处理pk。
但mush的wait就不行,协程只能自己关闭自己,不能关闭别人,yield这东西又不靠谱,所以一旦被pk,我得让其他所有的协程,至少是主协程,必须瞬间return回主函数,并等待才行,所以这样的问题才有问题啊......
cappuccino
发表于 2015-5-31 13:33:10
什么叫“有些可以冗余的东西都用不了了”
ltblue
发表于 2015-5-31 17:38:36
什么叫“有些可以冗余的东西都用不了了”
cappuccino 发表于 2015-5-31 01:33 PM http://pkuxkx.com/forum/images/common/back.gif
最简单的,比如hp抓变量吧
zmud里用触发,比如hp一共6行数据,写6个触发,ok了
mush用wait.regexp来做,难道能用6个协程吗?
如果你只用一个协程,那是用|吗?那还相当于6个......
反正总觉得,zmud里可以同时存在很多个开着的触发,而mush里同时运行的wait.regexp数量应该少得多,都是用什么拿什么,不用的就关掉,这样zmud里就有更多的冗余,而mush则必须精确
kaillera
发表于 2015-5-31 20:06:01
最简单的,比如hp抓变量吧
zmud里用触发,比如hp一共6行数据,写6个触发,ok了
mush用wait.regexp来 ...
ltblue 发表于 2015-5-31 05:38 PM http://pkuxkx.com/forum/images/common/back.gif
呃,没必要用6个wait.regexp啊
wait.make(function()
run("hp;set no_more checkhp end")
local l,w=wait.regexp('≡─────────────────────────────────≡')
while true do
local l,w=wait.regexp(".*")
if string.find(l,'no_more = "checkhp end"') then break end
table.insert(r,l)
end
local re = rex.new("^【 精 气 】\\s+(\\d+)\\s*/\\s+(\\d+)\\s+\\(\\s*(\\d+)\\%\\)\\s+【 精 力 】\\s+(\\d+)\\s*/\\s+(\\d+)\\s+\\(\\s*\\+(\\d+)\\)【 气 血 】\\s+(\\d+)\\s*/\\s+(\\d+)\\s+\\(\\s*(\\d+)\\%\\)\\s+【 内 力 】\\s+(\\d+)\\s*/\\s+(\\d+)\\s+\\(\\s*\\+(\\d+)\\)【 食 物 】\\s+(\\d+)\\s*/\\s+(\\d+)\\s+【 潜 能 】\\s+(\\d+)【 饮 水 】\\s+(\\d+)\\s*/\\s+(\\d+)\\s+【 体 会 】\\s+(\\d+)【 等 级 】\\s+(\\d+)\\s*/\\s+(\\d+)\\s+【 经 验 】\\s+(\\d+).*$")
hp_str = table.concat(r)
_, _, m = re:match(hp_str)
......
end)
silvent
发表于 2015-6-1 10:35:50
最简单的,比如hp抓变量吧
zmud里用触发,比如hp一共6行数据,写6个触发,ok了
mush用wait.regexp来 ...
ltblue 发表于 2015-5-31 05:38 PM http://pkuxkx.com/forum/images/common/back.gif
把hp放入模块化思考 你就明白其实很简单了 不用什么都非要触发
silvent
发表于 2015-6-1 10:37:10
没看懂,我想想哈
qu_gold的参数里,gold和bank无所谓了,f是一个函数名,换句话说是以一个函数为参 ...
ltblue 发表于 2015-5-29 01:10 PM http://pkuxkx.com/forum/images/common/back.gif
这个就是最简单的模块化封装,比如你书剑过河没钱,那么可以去取钱然后继续完成过河
ltblue
发表于 2015-6-1 15:13:14
这个就是最简单的模块化封装,比如你书剑过河没钱,那么可以去取钱然后继续完成过河
silvent 发表于 2015-6-1 10:37 AM http://pkuxkx.com/forum/images/common/back.gif
虽然我书剑都是渡江的,不过大体意思我应该理解了
比如去神龙岛,我需要钱,如果没钱的话,我就会首先把取钱函数打开,优先级做大,然后走路任务return掉,回到任务分配函数(主函数,用于分配任务),然后根据优先级,就会去取钱,取钱结束后,取钱模块关闭,回到任务分配函数,由于去神龙岛任务还在,所以会分配再次去神龙岛,任务就跟上了。
我目前就是这么做的