stevenson
发表于 2010-6-24 14:39:51
原帖由 bluse 于 2010-6-24 02:32 PM 发表 http://pkuxkx.com/forum/images/common/back.gif
乱入解决了,就不需要全地图数据了,你信不信
乱入其实解决起来不难,好程序和笨办法都能解决,其实再我没认真学zmud和map前,我就用我的一个很笨的办法也能解决绝大多少的乱入了。
把这个问题提出来,其实是想交流交流一些解决问题的思路,不仅仅是这个乱入问题。刚学习写复杂的机器人程序,想向各位大神学些思路是主要目的。
即使乱入解决了,如果想保证效率,做其他任务还是需要全地图数据的,你信不信,大狗熊
seagate
发表于 2010-6-24 14:56:09
我就没有用任何map功能,问我map相关的我也是一点都不懂!
其实对于护镖来说只要有地名,方向,邻居,描述就足够了,其他都没有必要!
stevenson
发表于 2010-6-24 14:56:25
原帖由 killunix 于 2010-6-24 10:21 AM 发表 http://pkuxkx.com/forum/images/common/back.gif
http://pkuxkx.com/forum/thread-14370-1-1.html去这里看
看到了,非常感谢!
seagate
发表于 2010-6-24 14:57:17
基本上护镖要用上60-70%左右的地图数据,和全地图差距不是特别明显!尤其是是找伙计遍历的时候在那个地图那个地图的房间几乎用遍了。
stevenson
发表于 2010-6-24 15:00:54
原帖由 seagate 于 2010-6-24 02:56 PM 发表 http://pkuxkx.com/forum/images/common/back.gif
我就没有用任何map功能,问我map相关的我也是一点都不懂!
其实对于护镖来说只要有地名,方向,邻居,描述就足够了,其他都没有必要!
呵呵,你应该就不用问了吧。。。。呵呵,从你的文章中学了好多。
原理上我明白,通过地名、方向、描述和邻居就可以准确定位了,在加上护镖路线相对固定,定位只是为了解决乱入,其实就足够了。
我主要还不知道怎么在技术上实现通过邻居来定位,不会写这段程序,呵呵
seagate
发表于 2010-6-24 15:40:03
技术上非常简单:
#forall @locate_directlist {
set action 邻居定位%i
look %i
}
#if %numitems(@locate_directlist)>4||@fight_start_flag=1 {
#alarm +1 {set action 行走判定}
} {
set action 行走判定
}
就是先取出方向放到变量@locate_directlist ,然后循环遍历look就行,look完以后加一个action触发乱入判定。
stevenson
发表于 2010-6-24 23:05:14
原帖由 seagate 于 2010-6-24 03:40 PM 发表 http://pkuxkx.com/forum/images/common/back.gif
技术上非常简单:
#forall @locate_directlist {
set action 邻居定位%i
look %i
}
#if %numitems(@locate_directlist)>4||@fight_start_flag=1 {
#alarm +1 {set action 行走判定}
} {
set act ...
赞!明白了!
mister
发表于 2010-6-24 23:46:39
hawks手边有较全的地图数据,所以利用起来当然是方便的,但bluse和seagate说得对,地图数据不是必须的,我也没用
luohh每走一步都look all exits我觉得有点浪费,刷得头晕
实际上只需要在大官道或大驿道处look all exits即可,也就是当条件满足 %match(@roomname,^大??道)=1时才需要看一下全部出口
此外,我用zmud721,有几处地点抓地名有点问题(如南村口),造成两次look不能完全吻合,这也好办,把乱入前后roomname,roomdesc,roomexits相等赋给不同值,取其最大值来判定返回出口.我用这种方法还没有发现走错了的.
[ 本帖最后由 mister 于 2010-6-24 11:50 PM 编辑 ]
mister
发表于 2010-6-24 23:57:49
我look是用multistate trigger来实现的,速度和准确率都很好
state 0 的trigger是乱入提示
state 1的trigger是乱入后的地点出口那行,当这行被触发时,乱入所到的房间的所有信息已经收集完整,并开始look
state 2 的trigger仍然是房间出口的trigger,这是抓look 之后各个房间信息.如果look后的房间信息完全等于乱入前的,则返回的出口确定,state调回到0;否则state调回到3,look 一下个出口.
这一设置的好处是不需要等待,某一个出口房间的信息收集后马上开始look下一个出口,如果等待时间较长,比如一秒look一次,这过程如果发生再次乱入就杯具了.
[ 本帖最后由 mister 于 2010-6-25 12:12 AM 编辑 ]
seagate
发表于 2010-6-25 08:31:12
我是比较懒惰的处理,每一次都look exits,就不用考虑乱入一套处理机制,非乱入一套处理机制。我乱入定位源码那块也不区分乱入与否,只要出问题都是一种机制处理。逻辑上比较简单,处理上增加一些代价。不过代价也不是特别多。