ltblue
发表于 2015-4-30 17:07:21
回复 110# littleknife
多谢
目前努力在写,可是,真心很难啊......
一个hp命令,让我弄成这奶奶样......
function sta_hp()
wait.make(function()
Send("hp")
Send("alias mush_sta hp")
sta.hp.ing = "doing";
local l,w=wait.regexp("^>* *[\\s]*·精血·\\s*(\\d*)\\s*\\/\\s*(\\d*)\\s*\\(\\s*(\\d*)\\%\\)\\s*·精力·\\s*(\\d*)\\s*\\/\\s*(\\d*)\\((\\d*)\\)$" .. "|" .. '你把 \\"mush_sta\\" 设定为 \\"hp\\" 成功完成。',300)
if l then
if string.find(l,"设定为") then
sta.hp.ing = "fail";
return "fail"
end
if string.find(l,"精血") then
sta.hp.jingxue=tonumber(w)
sta.hp.jingxue_max=tonumber(w)
sta.hp.jingxue_pst=tonumber(w)
sta.hp.jingli=tonumber(w)
sta.hp.jingli_max=tonumber(w)
sta.hp.jingli_all=tonumber(w)
printd(sta.hp.jingxue)
printd(sta.hp.jingxue_max)
printd(sta.hp.jingxue_pst)
printd(sta.hp.jingli)
printd(sta.hp.jingli_max)
printd(sta.hp.jingli_all)
end
else
sta.hp.ing = "fail";
return "fail"
end
local l,w=wait.regexp("^>* *[\\s]*·气血·\\s*(\\d*)\\s*\\/\\s*(\\d*)\\s*\\(\\s*(\\d*)\\%\\)\\s*·内力·\\s*(\\d*)\\s*\\/\\s*(\\d*)\\(\\+(\\d*)\\)$" .. "|" .. '你把 \\"mush_sta\\" 设定为 \\"hp\\" 成功完成。',300)
if l then
if string.find(l,"设定为") then
sta.hp.ing = "fail";
return "fail"
end
if string.find(l,"气血·") then
sta.hp.qixue=tonumber(w)
sta.hp.qixue_max=tonumber(w)
sta.hp.qixue_pst=tonumber(w)
sta.hp.neili=tonumber(w)
sta.hp.neili_max=tonumber(w)
sta.hp.jiali=tonumber(w)
printd(sta.hp.qixue)
printd(sta.hp.qixue_max)
printd(sta.hp.qixue_pst)
printd(sta.hp.neili)
printd(sta.hp.neili_max)
printd(sta.hp.jiali)
end
else
sta.hp.ing = "fail";
return "fail"
end
local l,w = wait.regexp("^>* *[\\s]*·(.*)气·\\s*(.*)\\s*·内力上限·\\s*(\\d*)\\s*\\/\\s*(\\d*)\\s*$" .. "|" .. '你把 \\"mush_sta\\" 设定为 \\"hp\\" 成功完成。',300)
if l then
if string.find(l,"设定为") then
sta.hp.ing = "fail";
return "fail"
end
if string.find(l,"内力上限·") then
if w=="正" then
sta.hp.shen=tonumber(w)
else
sta.hp.shen=-tonumber(w)
end
sta.hp.neili_all=tonumber(w)
sta.hp.neili_allm=tonumber(w)
printd(sta.hp.shen)
printd(sta.hp.neili_all)
printd(sta.hp.neili_allm)
end
else
sta.hp.ing = "fail";
return "fail"
end
local l,w = wait.regexp("^>* *[\\s]*·食物·\\s*(.*)\\%\\s*·潜能·\\s*(\\d*)\\s*\\/\\s*(\\d*)\\s*$" .. "|" .. '你把 \\"mush_sta\\" 设定为 \\"hp\\" 成功完成。',300)
if l then
if string.find(l,"设定为") then
sta.hp.ing = "fail";
return "fail"
end
if string.find(l,"食物·") then
sta.hp.food=tonumber(w)
sta.hp.pot=tonumber(w)
sta.hp.pot_max=tonumber(w)
sta.score.level=sta.hp.pot_max-100
printd(sta.hp.food)
printd(sta.hp.pot)
printd(sta.hp.pot_max)
end
else
sta.hp.ing = "fail";
return "fail"
end
local l,w = wait.regexp("^>* *[\\s]*·饮水·\\s*(.*)\\%\\s*·经验·\\s*(.*)\\s*\\((.*)\\%\\)\\s*$" .. "|" .. '你把 \\"mush_sta\\" 设定为 \\"hp\\" 成功完成。',300)
if l then
if string.find(l,"设定为") then
sta.hp.ing = "fail";
return "fail"
end
if string.find(l,"饮水·") then
sta.hp.water=tonumber(w)
sta.hp.expe=tonumber(w)
sta.hp.expe_pst=tonumber(w)
printd(sta.hp.water)
printd(sta.hp.expe)
printd(sta.hp.expe_pst)
end
else
sta.hp.ing = "fail";
return "fail"
end
local l,w = wait.regexp("^>* *[\\s]*·合气度·\\s*(\\d)\\s*$" .. "|" .. '你把 \\"mush_sta\\" 设定为 \\"hp\\" 成功完成。',300)
if l then
if string.find(l,"设定为") then
sta.hp.ing = "fail";
return "fail"
end
if string.find(l,"合气度·") then
sta.hp.powor=tonumber(w)
printd(sta.hp.powor)
end
else
sta.hp.ing = "fail";
return "fail"
end
local l,w = wait.regexp('你把 \\"mush_sta\\" 设定为 \\"hp\\" 成功完成。',300)
if l then
if string.find(l,"设定为") then
sta.hp.ing = "done";
return "done"
end
else
sta.hp.ing = "fail";
return "fail"
end
end)
end
littleknife
发表于 2015-5-1 20:15:11
本帖最后由 littleknife 于 2015-5-1 08:17 PM 编辑
引自【武林MUD】的一段代码,这里就是要说一下,不要着急的用wait.make框架。因为很多时候并不是一定用要协程解决问题,顺序执行即可。
Me.check_state = function(f)
Execute("hp;set keep_idle hp");
local l, w = wait.regexp("^【 精 气 】\\s*(\\d+)\\/\\s*(\\d*)\\s*\\(\\s*(\\d*)\\%\\)\\s*【 精 力 】\\s*(\\d*)\\s*\\/\\s*(\\d*) \\(\\+(\\d*)\\)$")
Me.mp, Me.maxmp, Me.pmp, Me.mana, Me.maxmana = tonumber(w), tonumber(w), tonumber(w), tonumber(w), tonumber(w)
l, w = wait.regexp("^【 气 血 】\\s*(\\d+)\\/\\s*(\\d*)\\s*\\(\\s*(\\d*)\\%\\)\\s*【 内 力 】\\s*(\\d*)\\s*\\/\\s*(\\d*) \\(\\+(\\d*)\\)$")
Me.hp, Me.maxhp, Me.php, Me.force, Me.maxforce, Me.enforce = tonumber(w), tonumber(w), tonumber(w), tonumber(w), tonumber(w), tonumber(w)
l, w = wait.regexp("^【 食 物 】\\s*(\\d*)\\/\\s*(\\d*)\\s*【 潜 能 】\\s*(\\d*)\\s*$")
Me.food, Me.maxfood, Me.pot = tonumber(w), tonumber(w), tonumber(w)
l, w = wait.regexp("^【 饮 水 】\\s*(\\d*)\\/\\s*(\\d*)\\s*【 体 会 】\\s*(\\d*)\\s*$")
Me.water, Me.maxwater, Me.tihui = tonumber(w), tonumber(w), tonumber(w)
l, w = wait.regexp("^【 等 级 】\\s*(\\d*)\\s*【 经 验 】\\s*(\\d*)\\s*$")
Me.level, Me.exp = tonumber(w), tonumber(w)
wait.regexp ("^(> )*设定环境变数:keep_idle = \"hp\"$")
if f then f() end
end
ltblue
发表于 2015-5-1 21:42:06
回复 112# littleknife
总体思路跟我的类似,但他的有一个问题:
如果在输入hp;set XXX的命令之后,恰好出现了其他问题,怎么办?
比如,船这时候恰好来了
又比如,出现了乱码,wait没等到
又或者某个触发器没考虑周全,等待的某个wait没有抓到指令,就一直在那里发呆
所以,我写得很长......
ltblue
发表于 2015-5-1 21:44:14
回复 112# littleknife
我是这么想的哈
在主线程之内,全是任务,比如吃饭做任务跑路等船之类的
如果在主线程之内加入“看状态”,那就麻烦了......
jarlyyn
发表于 2015-5-1 23:16:25
回复littleknife
总体思路跟我的类似,但他的有一个问题:
如果在输入hp;set XXX的命令之后,恰好 ...
ltblue 发表于 2015-5-1 09:42 PM http://pkuxkx.com/forum/images/common/back.gif
你先要明确一点。
你的机器人要做什么是以什么来驱动的。
主要问题解决了。其他都是小问题。
比如我的机器人是状态驱动的。甚至我会改写客户端来符合这一点。
比如可以流程驱动,强制一套流程,记录现在处在流程的那一步。
还可以触发+定时器驱动。很多简单的job机器人都是这样做的。
技术是为流程服务的。
个人觉得,自动化的机器人的重点是怎么解决补给问题。
其他都是细枝末节。
ltblue
发表于 2015-5-2 00:47:33
你先要明确一点。
你的机器人要做什么是以什么来驱动的。
主要问题解决了。其他都是小问题。
比 ...
jarlyyn 发表于 2015-5-1 11:16 PM http://pkuxkx.com/forum/images/common/back.gif
我的想法
总体是以状态驱动的,即我随时知道自己在干什么
但是,绝大部分情况下,我是以流程驱动的,即我目前正在做我做的事情,只要没有突发情况,我就一直做下去,直到这件事情做完。
也就是一个函数结束
但是,为了解决突发情况,肯定有其他的或者触发器或者协程来随时准备突发情况
一旦发生突发情况,我首先把突发情况的函数调用起来(用协程),然后由于状态改变了,所以我主协程知道当前任务暂停,回归等待状态。
等突发事件处理完毕,我整个人处于发呆状态,重新开始计算任务。
依靠任务榜系统,知道最紧急的工作是什么
页:
2
3
4
5
6
7
8
9
10
11
[12]