请教如何在zmud721下用map方法解决护镖乱入问题
最近开始练小号推车,半自动护镖,别的都还可以,就是被乱入搞烦了。一乱入就屏幕乱滚,然后就不知道自己在哪儿了,晕。发狠决定苦学zmud721的map功能,希望能自动解决乱入问题。已经用721画好了部分护镖线路的地图,大部分的乱入可以通过判断乱入后的房间号来定位解决了。但现在的问题是对于一些非唯一的房间的处理
1)一种解决办法是对于非唯一的房间,随机取一个出口,推一步,然后再定位,直到找到一个唯一的房间。
2)另一种就是look周边房间,通过周边房间来定位所在位置。
这两种办法是否可行?请问哪种方式更好些(可扩展性更强些)?初学map,技术上还搞不太定,哪位大侠有现成的模块给参考一下? 这两种方法,好象是一回事吧?
个人觉得2好..
借用maper的一句话,---北大街有好几个个,但s方向是中央广场的北大街只有一个
[ 本帖最后由 lzkd 于 2010-6-23 06:12 PM 编辑 ] look周边房间可以解决绝大多数一步乱入,多步乱入就悲剧了,需要记录乱入的步数,然后进行遍历,不过如果画好了map,用大米follow着,乱入后确定自己和大米的位置,马上就能回去 利用多行触发,根据小地图来定位,这是最简单有效的办法 原帖由 killunix 于 2010-6-23 10:26 PM 发表 http://pkuxkx.com/forum/images/common/back.gif
利用多行触发,根据小地图来定位,这是最简单有效的办法
好主意!那就不用map了? 原帖由 zgbl 于 2010-6-23 07:53 PM 发表 http://pkuxkx.com/forum/images/common/back.gif
look周边房间可以解决绝大多数一步乱入,多步乱入就悲剧了,需要记录乱入的步数,然后进行遍历,不过如果画好了map,用大米follow着,乱入后确定自己和大米的位置,马上就能回去
有大米做辅助,乱入是可以解决的,大米抓取每一步的出口,同时对18个方向的中文进行英文解析,由此判定主号究竟乱入了哪一个出口,不过唯一杯具的情形是某个ROOM同时拥有一个方向的UP和DOWN两个出口,比如泰山天街有EU和ED,这个非得过去之后再抓取出口,反向比较。计算较复杂。如果护镖路线没有这种出口,则万事大吉。 原帖由 stevenson 于 2010-6-23 11:39 PM 发表 http://pkuxkx.com/forum/images/common/back.gif
好主意!那就不用map了?
多行触发理论上可行,实际上你会被累死的,况且同名地点的小地图也有许多重复的,比如牙山驿道或者襄阳官道。 原帖由 bluse 于 2010-6-23 11:53 PM 发表 http://pkuxkx.com/forum/images/common/back.gif
多行触发理论上可行,实际上你会被累死的,况且同名地点的小地图也有许多重复的,比如牙山驿道或者襄阳官道。
虚无还是不要用map推车了,文若的多行定位是一种办法,我看他的全自动推车就是这样的。
我做胡一刀机器人时画了比较全的map,但推车还是用遍历加固定路线的唯一点的方式。
不管用上面哪种方式,其实都有比较简单的解决重复地名的方法
其实首先要解决的误区是不要怕重复地点,有重复的地点没关系,要想想这些重复的是不是影响你的护镖路线。。。。
具体来说要区分的是地图上的重复地点,在你的推车路线上是否重复(更进一步说其实是推车的剩余路线),不重复就没关系了,这个观察一下路线就很容易做出来。
如果遇到实在连固定路线上都重复的无法定位的地点,就先选一个点试验(这和走迷宫有类似的地方,走到头撞了墙再折回),然后当走错位置(报这个方向过不去)的时候再当乱入处理
因为整个机器人post出来会给purge的,就简单贴几个上面思路的函数,其实这个不难做,不含地图数据,不含自动机制,犯规的吧,呵呵。
下面这个是每轮护镖取唯一点的函数
;; 生成护镖路上的唯一标志点位
unique_points={}
unique_points_pos={}
#FORALL %find(@address,unique_point,dbroute) {
#dbget %i
unique_points=%additem(&dbplace, @unique_points)
unique_points_pos=%additem(&dbstep, @unique_points_pos)
}
我比较懒,所以这些唯一点也不是手输入数据库的,是用下面的函数写入的,这个和自动画地图类似,你自己推车就写了
#var temp_step_route %concat("'",%concat(@go_num,@address))
#var temp_place_route %concat("'",%concat(@now_place,@address))
#vartemp_db_cursor %find(@temp_step_route,ALL,step_route)
#IF (%null( @temp_db_cursor)) {
#new dbroute=@address dbstep=@go_num dbplace=@now_place step_route=@temp_step_route place_route=@temp_place_route
#dbput {dbroute=@address|dbstep=@go_num|dbplace=@now_place|step_route=@temp_step_route|place_route=@temp_place_route}
}
这是推车途中取下一个检查点的函数,因为我们只需要剩余路线上的唯一点
now_place=%1
//过了检查点时取下一个检查点,渡船的话暂停取一次
#if ((@go_num>@last_go_num) AND (@now_place!=渡船) ) {
temp_next_unique=%ismember(@last_place,@unique_points)
#if (@temp_next_unique >0) {
//唯一点是顺序排序的,取下一个。
#if (@temp_next_unique < %numitems(@unique_points)) {
#add temp_next_unique 1
}
last_place=%item(@unique_points,@temp_next_unique)
last_go_num=%item(@unique_points_pos,@temp_next_unique)
//从唯一点列表中删掉当前点之前的唯一点
#var temp_i (@temp_next_unique-1)
#loop 1,@temp_i {
unique_points=%delnitem(@unique_points,1)
unique_points_pos=%delnitem(@unique_points_pos,1)
}
}
} http://pkuxkx.com/forum/thread-14370-1-1.html去这里看 我也没有用地图,而用指定路线让镖车走
set brief 0,乱入时用look解决,把地名,房间描述和出口全面比较,二次乱入也不怕,用look的方式设定一个返回列表
现在稍有遗憾的是,大驿道和大官道有连续三处房间名出口和描述全部相同,有极小的概率乱入返回时走错房间