北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 12426|回复: 31

天龙新手任务 第三阶段全自动机器人实现方法

[复制链接]
发表于 2011-11-2 14:55:47 | 显示全部楼层 |阅读模式
本帖最后由 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
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-11-2 15:20:17 | 显示全部楼层
好贴!
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-11-2 21:45:24 | 显示全部楼层
技术贴 要顶一个 我辈致力于zmud462使用 坚决支持462
虽然不能数据库 没有map 当时我们还是要用462
lz多谢你的技术分享!
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-11-2 21:51:50 | 显示全部楼层
mark
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-11-2 21:57:18 | 显示全部楼层
成都的蜀道如何合理通过考虑否?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2011-11-2 22:46:14 | 显示全部楼层
成都蜀道有一个笨但是行之有效的办法,接受去成都蜀道任务后,单独做个触发,直接放弃,额,不是,直接去蜀道,然后,把行走蜀道的方向存到一个变量里,例如shudao,该变量是个list变量,然后利用上文说的依次取出,如果出现busy的情况,就重复取当前变量,直到发现NPC,回来类似。至于回来还有一个办法,就是在寻找NPC的时候丢铜钱,第一步丢1个铜钱,第二步丢2个铜钱……,回来的时候看地上几个铜钱就知道是第几步了。另外,如果觉得设置list变量不适应,也可以每走一步蜀道做一个触发,反正蜀道没几步,第几个蜀道该走哪个方向也很简单,也可以的。希望能帮上你。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-11-3 00:11:41 | 显示全部楼层
谢谢楼主的指点 我打算用你的方法做一个天龙的试试看 等我做完 我再和你继续交流
如果可能请留下qq
我最近正在着手做gb的机器人
必要时候
请你指导一下!
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-11-3 08:37:36 | 显示全部楼层
721有delitem和delnitem两个函数,后者可以删除list中指定位置的元素
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-11-3 08:39:08 | 显示全部楼层
从上一篇贴子的log看,follow无效的原因是当时自身处于busy状态
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-11-3 08:51:50 | 显示全部楼层
对 可以follow 当时要钱失败会busy 所以跟不上 所以说zmud462的map蛋疼啊 不然拿个小号follow 直接用map的房间号 直接goto过去就ok
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-17 09:24 AM , Processed in 0.012355 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表