myu 发表于 2011-1-18 17:08:59

在这个walk对象里,关键的
wait(f,walk.delay)
其意思是等待walk.delay秒以后,执行函数f。但我并没有看到其实现。

ptouch 发表于 2011-1-18 17:15:18

基本对的
self 代表对象实例 lua in programming 里面metatable 里面有具体说明

ptouch 发表于 2011-1-18 17:17:17

应楼上要求贴出来 wait 代码
-- 线程表,储存正在暂停的线程
local wait_table = {}
--setmetatable(wait_table, {__mode = "v"}) --weak table
-- 被定时器调用以恢复一个暂停的线程
function wait_timer_resume(name)
--print(table.getn(wait_table))
print("wait_id: ",name)
thread = wait_table
if thread~=nil then
    assert(coroutine.resume (thread))
else
    print(name," 不存在")
end -- if
wait_table={}--垃圾回收
end -- function wait_timer_resume

-- 在脚本中调用这个函数来暂停当前的线程
function wait(address, seconds)
id = "wait_timer_" .. GetUniqueNumber ()

hours = math.floor(seconds / 3600)
seconds = seconds - (hours * 3600)
minutes = math.floor(seconds / 60)
seconds = seconds - (minutes * 60)
print("等待",seconds,"s"," ",id)
wait_table =coroutine.create(function()
   print("执行")
   address()
end)
status = AddTimer (id, hours, minutes, seconds, "",
            timer_flag.Enabled + timer_flag.OneShot +
            timer_flag.Temporary + timer_flag.Replace,
            "wait_timer_resume")
assert(status == error_code.eOK, error_desc)
end -- function wait
--[[function test()
print("hello world")
end
wait(test,3)]]
--[[local function wait(s)
    print("等待",s)
        world.AddTimer ("delay", 0, 0, s, "process.resume()", timer_flag.OneShot+timer_flag.Replace , "")
        world.SetTimerOption ("delay", "send_to", "12")
        world.SetTimerOption ("delay", "group", "process")
        world.EnableTimer("delay",true)
        world.ResetTimer("delay")
end]]

myu 发表于 2011-1-18 17:21:03

如果使用gammon的wait,walk:go就可写成这样
function walk:go(targetRoomNo)
    --前面是取得path,略

   --将path字串以分号为分隔符分解,放到一个名为p的table里面
   local p=Split(path,";")

   local count=0
   for k,v in pairs(p) do
          --单步执行
          Execute(v)

          --下面这段代码实现停顿
          count=count+1
          if count>self.Max_Step then
             Execute("set walk off")
             --下面这句,等待出现set walk off提示,确保前面指令已执行完
             wait.regexp("设定环境变量:walk = off",60)
             --下面这句,等待规定的秒数
            wait.time(self.delay)
            count=0
         end

   end
end

一段代码处理完,简单得多了

[ 本帖最后由 myu 于 2011-1-18 05:35 PM 编辑 ]

ptouch 发表于 2011-1-18 19:16:11

你这个写法也可以。
区别不大。
不过你这样和服务器之间通讯频繁高,连续通讯。
我是喜欢减少数据提交次数。尽量一次性提交。

[ 本帖最后由 ptouch 于 2011-1-18 07:43 PM 编辑 ]

myu 发表于 2011-1-18 19:45:26

回复25楼:
       看来你并没有研究过mushclient里自带的wait.lua,很强大啊。
       wait.regexp("正则表达式1",最大时限)
       这函数的意思是等待出现指定的提示,如果超过最大时限,反回nil;否则返回匹配的句子、匹配的通配符、颜色样式。
       wait.time(number)
       这函数的意思是等待指定的时间。

示范如下:
      Execute("get blade")
      local l,w=wait.regexp("你捡起一柄(.*)。|你附近没有这样东西|你上一个动作还没有完成!",2)
   if l==nil then
      return "网络太慢或是发生了一个非预期的错误"
   end
   if string.find(l,"附近没有") then
      return "你附近没有刀可捡"
   end
   if string.find(l,"没有完成") then
      return "你忙着呢"
   end
      if string.find(l,"捡起") then
         print("你捡起了一柄"..w)
   end
   
   --等待2秒
    wait.time(2)

    print("继续")

[ 本帖最后由 myu 于 2011-1-18 07:47 PM 编辑 ]

ptouch 发表于 2011-1-18 20:08:34

我看明白了
类似try结构。
是蛮方便的。

xspe 发表于 2012-3-24 21:54:44

学习一下,谢谢

feixiong 发表于 2012-3-26 19:18:00

回复 1# ptouch


    这么好的帖子才发现,嗯嗯,收藏
页: 1 2 [3]
查看完整版本: lua 面向对象开发写机器人