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

lua 面向对象开发写机器人

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\.."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)
   if count==1 then
      local path=""
      path=Search(roomno,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 编辑 ]

lzkd 发表于 2011-1-17 19:11:51

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

对象声明
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接口函数 interface 回调函数 等待在实例中去实现

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.."set walk off"
      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)
   if count==1 then
      local path=""
      path=Search(roomno,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房间号
--使用起来很简单一目了然

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

zgbl 发表于 2011-1-17 19:15:52

一二楼加起来值一个精华了
不过考虑到精华是lz的,所以本着共同富裕的原则,给小刀加分处理

lzkd 发表于 2011-1-17 19:16:17

靠...我正在代楼主排版中,不亮就把精华加上了.

lzkd 发表于 2011-1-17 19:27:29

原帖由 zgbl 于 2011-1-17 07:15 PM 发表 http://www.pkuxkx.com/forum/images/common/back.gif
一二楼加起来值一个精华了
不过考虑到精华是lz的,所以本着共同富裕的原则,给小刀加分处理

不错,不错.还给我加分了,谢谢不亮哈.

lzkd 发表于 2011-1-17 19:33:44

对本文看法之一

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

  楼主是有程序底子的,至少对怎么写代码很清楚的说。从楼主的注册时间,发帖等数据来看,楼主才到北侠不久。一般来说,新到一个地方,往往热情是比较高的。所以,各位对mush+lua感兴趣的兄弟们注意了。这位身上可以学到不少东西。
  当然,怎么让楼主很开心的把自己的本事拿出来,就要看大家的了。

afact 发表于 2011-1-17 19:37:15

前七楼加起来值得7个精华

afact 发表于 2011-1-17 19:38:16

这玩意看不懂 解释下

seagate 发表于 2011-1-17 19:42:18

经过小刀排版以后应该很好理解了

lzkd 发表于 2011-1-17 19:44:18

对本文的看法之二

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

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

  除了学习楼主的模块划分之外,我们要注意到一点,楼主把lua中一些比较高端的东西也拿出来用了。这个也好也不好。
  其实,一个纯粹走路的完成,没必要使用这么复杂的功能。大家可以参考我的mush中级教程配套的那个侠客岛机器人。我没用这么花的功能,也完成了walk。
  但,初学看可以把这个当成一个模版来学习,我看里面各种方法都涉及到了一些,拿来当成范文学习也不错。而且,好的是,这个功能是单一的,完全剥离出来了,比直接看大型机器人要简单多了。
页: [1] 2 3
查看完整版本: lua 面向对象开发写机器人