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]
查看完整版本: 我好像误入歧途了