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 编辑 ]
楼主的代码,排版实在那个啥,看起来累.代为重新排版
对象声明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 编辑 ] 一二楼加起来值一个精华了
不过考虑到精华是lz的,所以本着共同富裕的原则,给小刀加分处理 靠...我正在代楼主排版中,不亮就把精华加上了. 原帖由 zgbl 于 2011-1-17 07:15 PM 发表 http://www.pkuxkx.net/forum/images/common/back.gif
一二楼加起来值一个精华了
不过考虑到精华是lz的,所以本着共同富裕的原则,给小刀加分处理
不错,不错.还给我加分了,谢谢不亮哈.
对本文看法之一
最近比较累,又在等某人给我一个结论(话说,那谁怎么还不给我回复)。所以,什么都不想做,懒懒的说。趁这个机会,写一下,对这个帖子的一些想法,还是老习惯,大家随意看看就好。楼主是有程序底子的,至少对怎么写代码很清楚的说。从楼主的注册时间,发帖等数据来看,楼主才到北侠不久。一般来说,新到一个地方,往往热情是比较高的。所以,各位对mush+lua感兴趣的兄弟们注意了。这位身上可以学到不少东西。
当然,怎么让楼主很开心的把自己的本事拿出来,就要看大家的了。 前七楼加起来值得7个精华 这玩意看不懂 解释下 经过小刀排版以后应该很好理解了
对本文的看法之二
我们来看代码本身,我一边排版的时候,一边大体的看了一遍。本着小刀一贯的唠叨的态度,说一下自己的理解。楼主的模块划分很清晰。顺便说一下,初写程序的人,往往一脑袋伸到代码中去,一堆代码写出来以后,想修改的时候,自己都无从下手,更不要说什么重复利用了。其实,想做到这一点也不难,要搞清楚功能如何细分,就可以。说的再通俗一些——要把自己的代码写成七巧板中的一块,许多块拼出来,就成了一个完整功能。一下子完成一个功能是很那啥的做法。
呃,好象又扯远了。
除了学习楼主的模块划分之外,我们要注意到一点,楼主把lua中一些比较高端的东西也拿出来用了。这个也好也不好。
其实,一个纯粹走路的完成,没必要使用这么复杂的功能。大家可以参考我的mush中级教程配套的那个侠客岛机器人。我没用这么花的功能,也完成了walk。
但,初学看可以把这个当成一个模版来学习,我看里面各种方法都涉及到了一些,拿来当成范文学习也不错。而且,好的是,这个功能是单一的,完全剥离出来了,比直接看大型机器人要简单多了。