本帖最后由 iam 于 2011-11-9 11:15 PM 编辑
续 本人上篇帖子《天龙新手任务 第三阶段全自动机器人实现探索》。
开写之前首先感谢糖果,我是在看了他的帖子后,学习了些技术,然后加上自己的思索,完成的机器人创作。糖果才是真正的技术党!
慑于天神的神威,本文基本只写思路,完整的代码恕不提供,不过我相信,只要你具备基本的zmud编程知识,利用我提供的思路,一定能自己做出漂亮的机器人,而且我的这些思路还有优化之处,抛砖引玉,欢迎指点,共同提高。
一、天龙新手任务第三阶段简介
该阶段会出现化缘和送经任务,送经任务比较简单,目标NPC基本不动,至少在你给他送经的时候他不会乱跑。而化缘目标NPC是不那么情愿出钱的,除非你忽悠神功老到,不然他会跑的,而且目标NPC无法follow,表现为下follow命令,提示已经成功follow,但目标NPC移动时,你是不会跟着走的,我没想明白为什么,但这是现实情况,也是个难题。
二、三个关键过程
1、寻找NPC
2、跟踪NPC
3、原路返回
三、实现方法
1、使用慢速行走遍历某区域寻找NPC。
第一、合理划分区域。任务区域为天龙、大理、昆明、成都,四地有大有小,天龙、昆明比较小,分别确定为一个区域即可,大理分为6个区域,成都分为3个区域。区域太小,目标NPC有可能会在你找到他之前移动出该区域,导致无法找到。区域太大,每次遍历耗时太长,自己斟酌吧。
第二、定义方向代码。共20个方向,东|西|南|北|上|下|东上|东下|西上|西下|南上|南下|北上|北下|东南|东北|西南|西北|里|外,不要小看方向代码的定义,它能完成大事,个人感觉,zmud中的方向代码是一柄利器,很多功能有待发掘。在此讲一下本机器人中用到的一个窍门,举例说明,定义L代表northwest;#say 反向southeast|southeast|se,注意northwest;#say 反向southeast一定要放在定义的开始,因为在慢速行走时,zmud是用方向代码定义的“或”运算的第一个方向发往服务器的,而#say 反向southeast是用来做触发的,看到这里我想很多同学都明白了它的妙处,可以在每走一步后,触发存下当前步的反向代码,存放到一个list变量中,等返回时一个一个取出就能一步一步返回了,存放方法下文会讲到。其他方向定义,请自行解决。
第三、录制区域路径。按照划分的区域,走一遍录下来即可。
第四、区域划分好了,路径也录制好了,接到任务,就可以遍历寻找目标NPC了,找到后使用#stop停下。有两点需要注意,一是遍历开始到遍历发现NPC的反向路径,在此期间是要存放在list变量中的,使用刚才提到的触发。二是关于每步行走时限的,我觉得最好把时限设置成无限大,显示负数是为宜,另外取消时限到时取消行走的钩钩(不过事先设置成无限大后,这个钩钩去不去都没关系),这样能保证发现NPC后不会走过头。配合慢速行走还要做个#ok的触发,以*的出口*为触发条件,命令行填写#ok,这样能保证慢速行走是到了一个房间确认后再到下一个房间。当然这样会在网速不好时,导致机器人很慢,但稳定性第一,而且该任务的CD时间是3分钟,完成的太快也是苦等。
2、抓取房间出口跟踪NPC。
第一、抓取房间出口。向糖果致敬,采用糖果的成果,呵呵。表达式如下,#tri {这里*的出口是(*)$} {#var exit "%1";#var exit %replace(@exit,"、","|");#var exit %replace(@exit,"和","|");#var exit %replace(@exit,"。","|。");#while (%item(@exit,1)!="。") {#var exit %additem(%trim(%item(@exit,1)),@exit);#delnitem exit 1};#delnitem exit 1} {exit} 。不过有几点需要说明,糖果使用的是Zmud7.21,一些函数和参数发生了变化,不能完全照搬到Zmud4.62里来。比如%item在462里是没有的,与其相对应的是%word,而且参数也不同,还有一个该表达式中没用到的%ismember,我没用过721,但从糖果使用该函数的情况来看,721里该函数能返回具体位置,而在462里只会返回0或者1。再比如#delnitem,不知是不是糖果手误,在462里是#delitem。不过糖果给我们提供了很棒的抓取房间出口的方法,我修改后的表达式如下,#var exit "%1";#var exit %replace(@exit,"、","|");#var exit %replace(@exit,"和","|");#var exit %replace(@exit,"。","|end");#while (%word(@exit,1,|)!="end") {#var exit %delitem(%word(@exit,1,|),%additem(%trim(%word(@exit,1,|)),@exit))}。我的表达式用end取代了糖果的“。”,而且由于本人懒没有在字串中删除end,不过带着他不影响什么,而且显得个性,吼吼。。。。。
第二、跟踪NPC。NPC离开会有提示,以此提示为触发,比如向西南,就where=sw;rewhere=ne;@where。rewhere里存放的是返回的方向,利用前面讲的方法,将返回的路径再存到一个list变量里。表达式为:#var backfollow %additem(@refollow,@backfollow);【这里又一个手误,@refollow应该是@rewhere。】这样返回路径就存放到变量backfollow里了。至此你就应该能一个缠着冤大头让他出钱修天龙寺了,话说天龙寺不是皇家的吗,也会缺钱?
3、依次取出返回变量的值按原路返回。表达式为:#wa @wa;%word(@backfollow,@jishu,|);#add jishu -1;#if (@jishu>0) {#say 完成收工} {l},说明:@wa里的wa可以赋予其数字,500就是等0.5秒走一步,1000就是1秒。变量计数存放的是走了多少步,取一个,jishu就减1,直到成为0。
以上就是机器人制作的总体思路,有很多细节需要完善,但是我很懒,呵呵,细枝末节的不想去完善了。关键环节攻关成功了就失去了动力。我觉得玩MUD很大的乐趣在于做机器人,呵呵。fear 天神……
如果大家想知道我期间失败的思路,主要是使用#ma录制返程路径没有成功的,请跟帖说明,以后奉上,如果不需要我就不写了。
最后,欢迎大家一起讨论,如果你有其他思路,请不吝赐教,共同提高。如果有什么问题,欢迎在游戏里直接tell我,谢谢!
北大侠客行MUD,中国最好的MUD |