|
目前在论坛上还没看到全自动的护镖机器人,以下是我对全自动护镖机器人的一点想法。
护镖的流程是在镖局领镖,然后护送到目的地,中途有不同门派的劫匪打劫。做全自动护镖机器人最难的两点是:1、镖车会被劫匪随机移动一步,这样预设的送镖路径就不可靠;2、接镖的伙计位置不确定,这样会造成送镖的时候困难和不能通过预设路径自动返回镖局。以上两点困难可以使用zmud的map功能配合自动定位和区域搜索进行化解。
关于Zmud中绘制地图请看http://advent.pkuxkx.com:1234/forum/viewthread.php?tid=3959&highlight=%2Bmaper
一、自动定位
自动定位就是当人物所处的房间和Zmud地图上当前房间不一致时,自动在Zmud地图上标示正确的当前房间。只有当前房间正确才能够使用#walk命令进行自动行走。
自动定位的思路很简单,通过房间名和房间描述来查找房间编码,然后使用#te命令来标示当前房间。不过在实际运用过程中发现效果并不好,所以这里采用房间名和房间出口来定位。以下是自动定位的过程:
1、抓取房间名和房间出口,其中房间出口通过转换成“e|w|s|n”这样的格式;
2、在地图数据库中检索房间名,得到的结果存入变量room_to_find;
3、如果room_to_find的结果为空,那就从走到下一个房间,然后look一下,再从第1步开始;
如果room_to_find的结果只有一个那就#te @room_to_find,定位结束;
如果room_to_find的结果超过一个,通过比较room_to_find的每一个房间出口和抓取的房间出口是否相等,如果相等则#add check_num 1;最后检查check_num的值如果等于1则定位结束,否则走到下一个房间,然后look一下,再从第1步开始;
以下是我写的一个trigger:
#trigger {\s+这里明显的出口是\s+(\w+)\s+和\s+(\w+)。}
{dir1=%1;
dir2=%2;
check_num=0;
room_num=0;
chukoulist=@dir1|@dir2;
changechukou; //把出口转换成e|w|s|n这种格式
room_to_find=%mapquery( %concat( "Name LIKE '", @diming, "'")); //检索map数据库
#if (%null( @room_to_find)) {
#wa 10;@dir1
} {
#if (%numitems( @room_to_find)==1) {
check_num=1;
room_num=@room_to_find;
#te @room_to_find} {
#forall @room_to_find {
#if %sort( %roomexit( %i))==@chukoulist {
room_num=%i;#add check_num 1}}}}; //比较room_to_find中每一个房间的出口
#if @check_num==1 {
#te @room_num} {
#wa 10;@dir1}}
二、区域搜索
区域搜索就是以一个房间为中心搜索其各个方向一定步数以内的所有房间。区域搜索的trigger我还没搞定,不过可以参考这两个帖子:
1、一个区域搜索的思路
2、定点按指定层次展开搜索指定目标,完成后返回原点
三、全自动护镖机器人的思路
在镖局接到镖之后,比如提示要送到北京宝源钱庄,通过触发可以得到镖局和宝源钱庄两个房间的号码,然后使用%pathfrom(num1,num2)可以得到护镖路径path,再截取第一个方向dir,然后gang che to @dir;并且使用%roomlink(num,dir)可以得到@dir进入房间的号码,用#te进行标记;
如果中途镖车被移动了,可以使用自动定位在Zmud地图上找到正确的房间,再进行下一步直到护镖到指定位置;
如果在指定位置没有找到伙计就开启区域搜索功能,自动在附近房间进行搜索直到找到伙计为止;
返回镖局是最简单的了,#walk就可以了。
相信搞定了以上两个难题,一个全自动护镖机器人就可以呼之欲出了! |
|