北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
楼主: 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[1])
                                sta.hp.jingxue_max=tonumber(w[2])
                                sta.hp.jingxue_pst=tonumber(w[3])
                                sta.hp.jingli=tonumber(w[4])
                                sta.hp.jingli_max=tonumber(w[5])
                                sta.hp.jingli_all=tonumber(w[6])
                                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[1])
                                sta.hp.qixue_max=tonumber(w[2])
                                sta.hp.qixue_pst=tonumber(w[3])
                                sta.hp.neili=tonumber(w[4])
                                sta.hp.neili_max=tonumber(w[5])
                                sta.hp.jiali=tonumber(w[6])
                                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[1]=="正" then
                                        sta.hp.shen=tonumber(w[2])
                                else
                                        sta.hp.shen=-tonumber(w[2])
                                end
                                sta.hp.neili_all=tonumber(w[3])
                                sta.hp.neili_allm=tonumber(w[4])
                                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[1])
                                sta.hp.pot=tonumber(w[2])
                                sta.hp.pot_max=tonumber(w[3])
                                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[1])
                                sta.hp.expe=tonumber(w[2])
                                sta.hp.expe_pst=tonumber(w[3])
                                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[1])
                                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
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-5-1 20:15:11 | 显示全部楼层
本帖最后由 littleknife 于 2015-5-1 08:17 PM 编辑

引自【武林MUD】的一段代码,这里就是要说一下,不要着急的用wait.make框架。因为很多时候并不是一定用要协程解决问题,顺序执行即可。

  1. Me.check_state = function(f)
  2.         Execute("hp;set keep_idle hp");
  3.         local l, w = wait.regexp("^【 精 气 】\\s*(\\d+)\\/\\s*(\\d*)\\s*\\(\\s*(\\d*)\\%\\)\\s*【 精 力 】\\s*(\\d*)\\s*\\/\\s*(\\d*) \\(\\+(\\d*)\\)$")
  4.         Me.mp, Me.maxmp, Me.pmp, Me.mana, Me.maxmana = tonumber(w[1]), tonumber(w[2]), tonumber(w[3]), tonumber(w[4]), tonumber(w[5])
  5.         l, w = wait.regexp("^【 气 血 】\\s*(\\d+)\\/\\s*(\\d*)\\s*\\(\\s*(\\d*)\\%\\)\\s*【 内 力 】\\s*(\\d*)\\s*\\/\\s*(\\d*) \\(\\+(\\d*)\\)$")
  6.         Me.hp, Me.maxhp, Me.php, Me.force, Me.maxforce, Me.enforce = tonumber(w[1]), tonumber(w[2]), tonumber(w[3]), tonumber(w[4]), tonumber(w[5]), tonumber(w[6])
  7.         l, w = wait.regexp("^【 食 物 】\\s*(\\d*)\\/\\s*(\\d*)\\s*【 潜 能 】\\s*(\\d*)\\s*$")
  8.         Me.food, Me.maxfood, Me.pot = tonumber(w[1]), tonumber(w[2]), tonumber(w[3])
  9.         l, w = wait.regexp("^【 饮 水 】\\s*(\\d*)\\/\\s*(\\d*)\\s*【 体 会 】\\s*(\\d*)\\s*$")
  10.         Me.water, Me.maxwater, Me.tihui = tonumber(w[1]), tonumber(w[2]), tonumber(w[3])
  11.         l, w = wait.regexp("^【 等 级 】\\s*(\\d*)\\s*【 经 验 】\\s*(\\d*)\\s*$")
  12.         Me.level, Me.exp = tonumber(w[1]), tonumber(w[2])
  13.         wait.regexp ("^(> )*设定环境变数:keep_idle = "hp"$")
  14.         if f then f() end
  15. end
复制代码
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2015-5-1 21:42:06 | 显示全部楼层
回复 112# littleknife


总体思路跟我的类似,但他的有一个问题:
如果在输入hp;set XXX的命令之后,恰好出现了其他问题,怎么办?
比如,船这时候恰好来了
又比如,出现了乱码,wait没等到
又或者某个触发器没考虑周全,等待的某个wait没有抓到指令,就一直在那里发呆

所以,我写得很长......
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2015-5-1 21:44:14 | 显示全部楼层
回复 112# littleknife


我是这么想的哈
在主线程之内,全是任务,比如吃饭做任务跑路等船之类的
如果在主线程之内加入“看状态”,那就麻烦了......
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-5-1 23:16:25 | 显示全部楼层
回复  littleknife


总体思路跟我的类似,但他的有一个问题:
如果在输入hp;set XXX的命令之后,恰好 ...
ltblue 发表于 2015-5-1 09:42 PM

你先要明确一点。

你的机器人要做什么是以什么来驱动的。

主要问题解决了。其他都是小问题。

比如我的机器人是状态驱动的。甚至我会改写客户端来符合这一点。

比如可以流程驱动,强制一套流程,记录现在处在流程的那一步。

还可以触发+定时器驱动。很多简单的job机器人都是这样做的。

技术是为流程服务的。

个人觉得,自动化的机器人的重点是怎么解决补给问题。

其他都是细枝末节。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2015-5-2 00:47:33 | 显示全部楼层
你先要明确一点。

你的机器人要做什么是以什么来驱动的。

主要问题解决了。其他都是小问题。

比 ...
jarlyyn 发表于 2015-5-1 11:16 PM


我的想法
总体是以状态驱动的,即我随时知道自己在干什么
但是,绝大部分情况下,我是以流程驱动的,即我目前正在做我做的事情,只要没有突发情况,我就一直做下去,直到这件事情做完。
也就是一个函数结束
但是,为了解决突发情况,肯定有其他的或者触发器或者协程来随时准备突发情况
一旦发生突发情况,我首先把突发情况的函数调用起来(用协程),然后由于状态改变了,所以我主协程知道当前任务暂停,回归等待状态。
等突发事件处理完毕,我整个人处于发呆状态,重新开始计算任务。
依靠任务榜系统,知道最紧急的工作是什么
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-28 09:51 AM , Processed in 0.008564 second(s), 12 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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