北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 20400|回复: 28

lua 面向对象开发写机器人

[复制链接]
发表于 2011-1-17 18:46:39 | 显示全部楼层 |阅读模式
lua 可以模拟面向对象
面向对象开发可以提高代码重用度。减少重复代码,方便理解程序
我自己用lua 面向对象方法写的一个walk 对象
对象声明
walk={
  target=nil,
  new=function()
    local w={}
    setmetatable(w, {__index = walk})   --返回新的实例
    return w
  end,
  Max_Step=10,
  output_path= nil,
  delay=1.2,
}

function walk:walkoff()
  --设置延迟
  local f=function()
    world.Send("yun refresh")
    coroutine.resume(walk.output_path)
  end
  wait(f,walk.delay)
end

function walk:walkover()  --接口函数 interface 回调函数 等待在实例中去实现
  
end

function walk:step()
   walk.output_path=coroutine.create(function (path)
      local p=Split(path,";")
      local count=0
      local tmp_P=""
      local result={}
      --print(table.getn(p))
      for i,v in ipairs(p) do
        if v~="" then
          count=count+1
          if count>self.Max_Step then
            count=0
            tmp_P=tmp_P..v..";"
            --print(tmp_P)
            table.insert(result,tmp_P)
            tmp_P=""
          else
            tmp_P=tmp_P..v..";"
            --print(tmp_P)
          end
       end
      end
      if tmp_P~="" then
        table.insert(result,tmp_P)
      end
      -------------输出路径--------------
     for i,p in ipairs(result) do
        local result_path=""
        result_path=result\[i\].."set walk off"      ---这里是result【i】 发布时候莫名其妙去掉了 是表类型
         world.Execute(result_path)
        --print("挂起")
        coroutine.yield() --挂起
     end
      --print("结束")
      self:walkover()
  end)
end

function walk:go(targetRoomNo)
   self.target=targetRoomNo
   local _R={}
   _R=Room.new()
   _R.CatchEnd=function()
     local count,roomno=Locate()
      print("当前房间号",roomno[1])
     if count==1 then
        local path=""
        path=Search(roomno[1],targetRoomNo)
        --触发器
        --world.AddTriggerEx ("walkover", "^(> |)设定环境变量:walk \\= \\\"over\\\"$", "walk.walkover()", trigger_flag.RegularExpression +trigger_flag.Enabled + trigger_flag.Replace, custom_colour.NoChange, 0, "", "", 12, 99)
        world.AddTriggerEx ("walkoff", "^(> |)设定环境变量:walk \\= \\\"off\\\"$", "walk.walkoff()", trigger_flag.RegularExpression +trigger_flag.Enabled + trigger_flag.Replace, custom_colour.NoChange, 0, "", "", 12, 99)
        self:step()
        coroutine.resume(walk.output_path,path)
     end
   end
   _R:CatchStart()
end

------------------------------------对象使用
local w=walk.new()
w.walkover=function()   --走到目的地以后要做的动作
     Send("say hello world")
end
w:go(433) --433房间号
使用起来很简单一目了如


[ 本帖最后由 ptouch 于 2011-1-18 03:55 PM 编辑 ]
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-1-17 19:11:51 | 显示全部楼层

楼主的代码,排版实在那个啥,看起来累.代为重新排版

对象声明

  1. walk={
  2.   target=nil,
  3.   new=function()
  4.     local w={}
  5.     setmetatable(w, {__index = walk})   --返回新的实例
  6.     return w
  7.   end,
  8.   Max_Step=10,
  9.   output_path= nil,
  10.   delay=1.2,
  11. }
复制代码
设置延迟

  1. function walk:walkoff()
  2.   --设置延迟
  3.   local f=function()
  4.     world.Send("yun refresh")
  5.     coroutine.resume(walk.output_path)
  6.   end
  7.   wait(f,walk.delay)
  8. end
复制代码
接口函数 interface 回调函数 等待在实例中去实现

  1. function walk:walkover()
  2.   --接口函数 interface 回调函数 等待在实例中去实现
  3.   
  4. end
复制代码
步进函数--这个作者米这么说,是代排版的人这么理解的

  1. function walk:step()
  2.    walk.output_path=coroutine.create(function (path)
  3.       local p=Split(path,";")
  4.       local count=0
  5.       local tmp_P=""
  6.       local result={}
  7.       --print(table.getn(p))
  8.       for i,v in ipairs(p) do
  9.         if v~="" then
  10.           count=count+1
  11.           if count>self.Max_Step then
  12.             count=0
  13.             tmp_P=tmp_P..v..";"
  14.             --print(tmp_P)
  15.             table.insert(result,tmp_P)
  16.             tmp_P=""
  17.           else
  18.             tmp_P=tmp_P..v..";"
  19.             --print(tmp_P)
  20.           end
  21.        end
  22.       end
  23.       if tmp_P~="" then
  24.         table.insert(result,tmp_P)
  25.       end
  26.       -------------输出路径--------------
  27.      for i,p in ipairs(result) do
  28.         local result_path=""
  29.         result_path=result.."set walk off"
  30.         world.Execute(result_path)
  31.         --print("挂起")
  32.         coroutine.yield() --挂起
  33.      end
  34.       --print("结束")
  35.       self:walkover()
  36.   end)
  37. end
复制代码
走路的主体函数--这个作者米这么说,是代排版的人这么理解的

  1. function walk:go(targetRoomNo)
  2.    self.target=targetRoomNo
  3.    local _R={}
  4.    _R=Room.new()
  5.    _R.CatchEnd=function()
  6.      local count,roomno=Locate()
  7.       print("当前房间号",roomno[1])
  8.      if count==1 then
  9.         local path=""
  10.         path=Search(roomno[1],targetRoomNo)
  11.         --触发器
  12.         --world.AddTriggerEx ("walkover", "^(> |)设定环境变量:walk \\= \\"over\\"$", "walk.walkover()", trigger_flag.RegularExpression +trigger_flag.Enabled + trigger_flag.Replace, custom_colour.NoChange, 0, "", "", 12, 99)
  13.         world.AddTriggerEx ("walkoff", "^(> |)设定环境变量:walk \\= \\"off\\"$", "walk.walkoff()", trigger_flag.RegularExpression +trigger_flag.Enabled + trigger_flag.Replace, custom_colour.NoChange, 0, "", "", 12, 99)
  14.         self:step()
  15.         coroutine.resume(walk.output_path,path)
  16.      end
  17.    end
  18.    _R:CatchStart()
  19. end
复制代码
一个简单的运用实例--这个作者米这么说,是代排版的人这么理解的(顺便修整错字)

  1. ------------------------------------对象使用
  2. local w=walk.new()
  3. w.walkover=function()   --走到目的地以后要做的动作
  4.      Send("say hello world")
  5. end
  6. w:go(433) --433房间号
  7. --使用起来很简单一目了然
复制代码

[ 本帖最后由 lzkd 于 2011-1-17 07:21 PM 编辑 ]

评分

参与人数 1精华 +10 +10 收起 理由
zgbl + 10 + 10

查看全部评分

北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-1-17 19:15:52 | 显示全部楼层
一二楼加起来值一个精华了
不过考虑到精华是lz的,所以本着共同富裕的原则,给小刀加分处理
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-1-17 19:16:17 | 显示全部楼层
靠...我正在代楼主排版中,不亮就把精华加上了.
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-1-17 19:27:29 | 显示全部楼层
原帖由 zgbl 于 2011-1-17 07:15 PM 发表
一二楼加起来值一个精华了
不过考虑到精华是lz的,所以本着共同富裕的原则,给小刀加分处理


不错,不错.还给我加分了,谢谢不亮哈.
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-1-17 19:33:44 | 显示全部楼层

对本文看法之一

  最近比较累,又在等某人给我一个结论(话说,那谁怎么还不给我回复)。所以,什么都不想做,懒懒的说。趁这个机会,写一下,对这个帖子的一些想法,还是老习惯,大家随意看看就好。

  楼主是有程序底子的,至少对怎么写代码很清楚的说。从楼主的注册时间,发帖等数据来看,楼主才到北侠不久。一般来说,新到一个地方,往往热情是比较高的。所以,各位对mush+lua感兴趣的兄弟们注意了。这位身上可以学到不少东西。
  当然,怎么让楼主很开心的把自己的本事拿出来,就要看大家的了。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-1-17 19:37:15 | 显示全部楼层
前七楼加起来值得7个精华
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-1-17 19:38:16 | 显示全部楼层
这玩意看不懂 解释下
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-1-17 19:42:18 | 显示全部楼层
经过小刀排版以后应该很好理解了
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-1-17 19:44:18 | 显示全部楼层

对本文的看法之二

  我们来看代码本身,我一边排版的时候,一边大体的看了一遍。本着小刀一贯的唠叨的态度,说一下自己的理解。

  楼主的模块划分很清晰。顺便说一下,初写程序的人,往往一脑袋伸到代码中去,一堆代码写出来以后,想修改的时候,自己都无从下手,更不要说什么重复利用了。其实,想做到这一点也不难,要搞清楚功能如何细分,就可以。说的再通俗一些——要把自己的代码写成七巧板中的一块,许多块拼出来,就成了一个完整功能。一下子完成一个功能是很那啥的做法。
  呃,好象又扯远了。

  除了学习楼主的模块划分之外,我们要注意到一点,楼主把lua中一些比较高端的东西也拿出来用了。这个也好也不好。
  其实,一个纯粹走路的完成,没必要使用这么复杂的功能。大家可以参考我的mush中级教程配套的那个侠客岛机器人。我没用这么花的功能,也完成了walk。
  但,初学看可以把这个当成一个模版来学习,我看里面各种方法都涉及到了一些,拿来当成范文学习也不错。而且,好的是,这个功能是单一的,完全剥离出来了,比直接看大型机器人要简单多了。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 01:38 PM , Processed in 0.010102 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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