北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
123
返回列表 发新帖
楼主: ptouch

lua 面向对象开发写机器人

[复制链接]
发表于 2011-1-18 17:08:59 | 显示全部楼层
在这个walk对象里,关键的
  wait(f,walk.delay)
其意思是等待walk.delay秒以后,执行函数f。但我并没有看到其实现。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2011-1-18 17:15:18 | 显示全部楼层
基本对的
self 代表对象实例 lua in programming 里面metatable 里面有具体说明
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 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[name]
  if thread~=nil then
    assert(coroutine.resume (thread))
  else
    print(name," 不存在")
  end -- if
  wait_table[name]={}  --垃圾回收
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[id] =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[status])
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]]
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 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 编辑 ]
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2011-1-18 19:16:11 | 显示全部楼层
你这个写法也可以。
区别不大。
不过你这样和服务器之间通讯频繁高,连续通讯。
我是喜欢减少数据提交次数。尽量一次性提交。

[ 本帖最后由 ptouch 于 2011-1-18 07:43 PM 编辑 ]
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 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[1])
     end
     
     --等待2秒
    wait.time(2)

    print("继续")

[ 本帖最后由 myu 于 2011-1-18 07:47 PM 编辑 ]
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2011-1-18 20:08:34 | 显示全部楼层
我看明白了
类似try结构。
是蛮方便的。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2012-3-24 21:54:44 | 显示全部楼层
学习一下,谢谢
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2012-3-26 19:18:00 | 显示全部楼层
回复 1# ptouch


    这么好的帖子才发现,嗯嗯,收藏
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-11 02:16 AM , Processed in 0.009437 second(s), 12 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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