背景:
阅读文章

ZMUD机器人制作(精)

variable和alias的进一步应用

[日期:2013-12-11] 来源:mud游戏网  作者: [字体: ]
以后将主要介绍我在胡一刀和推车机器人中用到的遍历方法,会出现大量的嵌套alias,也会大量的应用list变量,如果你阅读的比较吃力,请多翻翻前面的章节.

阅读前请确认你已经熟练掌握了以下命令:%item(),%additem(),%delitem(),%numitems(),%ismember(),%dups(),%sort()以及对应的#additem,#delitem,#delnitem

本章用list变量实现path的全部功能,教你做出属于自己的遍历机器人

有些人回帖说看不懂,补充紫色部分,看不懂的话在zmud里试验这5个例子吧
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#var abc 20|19|18|17|16|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1
%item(n,@abc)表示abc的第n项,比如%item(14,@abc)就是7,  %item(2,@abc)是19
先定义一个变量abc来试验,下面来遍历abc这个变量
A     先遍历2步
#alias bianli {#if @n {%item(@n,@abc);#add n -1;bianli}}
#var n 2
然后输入bianlin,结果就是先执行第2项19,n减1,接着执行第1项20,n再减1,执行了这2项之后n已经被减成0了,#if @n判断不为真,遍历结束
要小心,#alias a {north;;#add n -1;a}这个alias是无限次嵌套,永远不会停止,命令行里输入a的话在将会死机崩溃,因为没有语句让它停止,谨慎!!

B     遍历20步
#alias bianli {#if @n {%item(@n,@abc);#add n -1;bianli}}
#var n 20
在命令行里输入bianli,结果就是1;2;3;4;5;6;7;...;20

C    每遍历2步停止1秒,一直遍历20步
多用一个命令%mod(),是数学里的模,%mod(@n,10)意思是@n除以10后的余数,如果#var n 18,那么%mod(@n,10)的值是8
#if (%mod(@n,2)=0) {say n是偶数} {say n是奇数}
一个判断n是偶数还是奇数的办法
#alias bianli {#if @n {#if (%mod(@n,2)=0) {%item(@n,@abc)} {#wa 1000;%item(@n,@abc)};#add n -1;bianli}}
#var n 20
跟例子B不同的是,直接执行第n项被替代成了先判断奇偶,n是偶数直接执行,n是奇数就wait 1000然后执行
命令行里输入bianli,结果等同于#wa 1000;1;2;#wa 1000;3;4;#wa 1000;5;...18;#wa 1000;19;20

D    执行到第5项的时候中止遍历,用trigger来让它继续
#var abc 20|19|18|17|kill zhang|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1
第5项被替换成了kill zhang
#alias bianli {#if @n {#if (@n=5) {%item(@n,@abc)} {%item(@n,@abc);bianli};#add n -1}}
#var n 20
#trigger 张死了 {bianli}
命令行里输入bianli,结果就是1;2;3;4;5;......;13;14;15;kill zhang,等张死了,继续17;18;19;20

E   执行到第5项时等待10秒再执行,其他的直接执行,用这个方法来坐船
#var abc 20|19|18|17|16|enter boat|14|13|12|11|10|9|8|7|6|5|4|3|2|1
第6项被替换成了enter boat
#alias bianli {#if @n {#if (@n=5) {#wait 10000;%item(@n,@abc)} {%item(@n,@abc)};#add n -1;bianli}}
#var n 20
命令行里输入bianli,结果就是1;2;3;4;...;13;14;enter boat;#wait 10000;16;17;18;19;20


---------------------------------------------------------------------------------------------------------------------------------------------------------


11.1 给出一个路径.从ct出发到无量山溜一圈回到ct的所有方向组成的list,用一个变量保存起来.

#var wuliang {s|s|s|s|s|s|s|s|s|sw|w|w|nw|w|e|sw|sw|sw|n|n|n|s|s|s|s|sw|sw|ne|ne|n|sw|wu|nu|sd|ed|nw|n|s|nu|nu|nu|climb stiff|up|climb yafeng|e|se|sw|n|s|sw|sw|sw|s|e|n|w|n|w|e|s|ne|ne|ne|s|push stone|s|e|ed|ed|push men|e|n|s|e|w|s|out|guo qiao|d|s|se|ne|ne|ne|ne|se|e|e|ne|n|n|n|n|n|n|n|n|n}

这个路径的制作方法可以模拟path路径录制的方法,下一章再详细讲,先不管这个.

比path路径要灵活的是,不需要定义方向,可以将任何命令添加到list里面去.这里说的任何命令,不光是上面@wuliang包含的常规方向和非常规方向,类似#var xxx xxx,#wa xxx,#alarm xxx,tell @myid xxx都可以添加进去,甚至可以自己定义复杂的alias和function,然后把alias和function添加进去.总之,没有什么是不能添加的,而这种灵活性将使你的遍历非常强大.

11.2 快速行走

快速行走方法一:
#forall @wuliang {%i}
//这就已经完全模拟了path的快速行走,但是这个模拟跟path的快速行走一样太简单了.上面的路径总共包含98个item,命令输入过多游戏拒绝执行.

快速行走方法二:
#alias bianli {#if (@step<=@steps) {#if (%mod(@step,@bushu)=0) {#wa @wait;halt;%item(@area,@step);#add step 1;bianli} {%item(@area,@step);#add step 1;bianli}}}
//一个简单的嵌套,@step表示你的当前步数,@steps表示要走完的步数,因此@step<=@steps作为嵌套结束的判断条件.这个alias能让你从第@step-1步开始走完第@steps步.路径保存在@area中
//当@step<=@steps时,判断%mod(@step,@bushu)是否为0:如果为0,休息一会#wa @wait之后走一步%item(@area,@step),当前步数加1进入下一次嵌套;否则,直接走一步,当前步数加1进入下一次嵌套
//这里@bushu,@wait用来控制行走的快慢,每次连续走@bushu步就停@wait秒,然后接着走.这里不用具体数字而是用变量来控制行走快慢,可以让你更方便的调节行走速度.

#alarm 00:30:00 {#var bushu 15;#var wait 1000}
#alarm 12:30:00 {#var bushu 8;#var wait 1500}

//用这2个trigger来自动调节行走速度,晚上人少网络流畅,可以走快些,中午过后网络不好可以走慢些.当然自动调整不满意,你可以随时手动调整,或者制作按钮来改变@bushu和@wait的值

无量山的快速行走
#alias 无量山 {#var step 1;#var area @wuliang;#var steps %numitems(@area);bianli}
//将@wuliang保存在@area中,@step值为1表示从第0步开始,@steps值为所有item的个数,表示走完全程
//你只需要在命令行输入"无量山"即可完成无量山的快速行走

注一:可以看到这个方法和path相比强大的多,你可以10步一走,也可以2步一走,也可以走一步停一下(这就已经是慢速行走了),完全可以随心所欲.

细心的同学会发现climb stiff和guo qiao有busy,上述方法有问题.没错,下面做出修改.

#alias bianli {#if (@step<=@steps) {#if %ismember(@step,@busy) {#wa @time;halt;%item(@area,@step);#add step 1;bianli} {{#if (%mod(@step,@bushu)=0) {#wa @wait;halt;%item(@area,@step);#add step 1;bianli} {%item(@area,@step);#add step 1;bianli}}}}
//与前面唯一不同的是先判断当前步数是否属于有busy的步数,如果是等待@time,接着走;否则跟上面完全一样
//有busy的步数保存在变量@busy中

#alias 无量山 {#var step 1;#var area @wuliang;#var steps %numitems(@area);#var time 30000;#var busy 43|79;bianli}
//手动输入#show %ismember("guo qiao",@wuliang)%ismember("climb stiff",@wuliang)显示为7842,所以需要在"无量山"这个alias中添加#var busy 43|79,并且,#var time 30000将busy的等待时间设置为30秒
//如果你的路径中没有这类具有busy的方向,比如丐帮洛阳,你只需要#var busy {}
//climb stiff和guo qiao命令输入之后都将等待30秒输入下一个命令,可以用下面的trigger调整

#tri {突然你突然脚下踏了个空,向下一滑,身子登时堕下了去。} {#wa 1}
#tri {你终于一步步的终于挨到了桥头} {#wa 1}
//这里利用#wa命令的缺点,用#wa 1来替代#wa 30000,起到加速的作用,不会真的等待30秒那么长的时间,也绝不会等待时间太短,就是刚刚好

事实上,所有的方向无非就是有busy没busy两种(杀挡路npc也可以算是有busy的方向的一种),因此用上面的方法已经可以做出一个跟dammya完全一样的遍历机器人了,还缺少的只是下一章的路径录制方法.

注二:这里将所有的有busy的方向统一处理.事实上,你可以做得更精细一些,分成几类来处理效果会更好

11.3 慢速行走

慢速行走方法一:把上面的@bushu值改为1就是慢速行走了,不过这种行走无法停下来,#stop,#step,#back都无法实现

慢速行走方法二:
#alias bianli2 {#if (@step<=@steps) {#if (@finddbr=0) {#wa @time;halt;%item(@area,@step);#add step 1;bianli2}}
//行走前先判断@finddbr的值,如果为0,表示没有找到dbr,走下一步;否则嵌套结束,停止行走
//不管当前步数有没有busy,统一等待@time,@time在下面的alias中设置为30000

#alias 无量山2 {#var finddbr 0;#var step 1;#var area @wuliang;#var steps %numitems(@area);#var time 30000;#var busy 43|79;bianli2}
//慢速行走之前将@finddbr的值改变为0,表示没有找到dbr

剩下的就是做trigger了

#tri {这里明显的出口是} {#if %ismember(@step,@busy) {#wa 1}}
//成功走出了一步.如果下一步没有busy,用#wa 1加速;否则什么都不做

注意;在无量山,成功的push stone,push men都有相应的描述,都表示成功走出一步,因此都需要做trigger加速.不加速的话也只是浪费点时间而已

#tri {突然你突然脚下踏了个空,向下一滑,身子登时堕下了去。} {#wa 1}
#tri {你终于一步步的终于挨到了桥头} {#wa 1}

//有busy的步数用专门的trigger来加速

#tri {盗 宝 人*@dbrname~(@dbr~)} {#var finddbr 1;#wa 1;大开杀戒}
//找到dbr之后先改变finddbr的值,再加速然后开杀

任务完成返回:

顺向返回:没什么好说的,很简单的返回方法了

逆向返回:
#var fangxiang {n|e|nw|ne|nu|nd|eu|ed|u|enter|s|w|se|sw|sd|su|wd|wu|d|out}
#var fangxiangb {s|w|se|sw|sd|su|wd|wu|d|out|n|e|nw|ne|nu|nd|eu|ed|u|enter}
//2个变量对应的方向正好相反

依次取出前一个方向,通过@fangxiang获得序号,通过序号在@fangxiangb里查找反方向,行走的具体做法我就不写了

注三:无量山这里只能顺向返回.你也可以在返回时加入自己的判断,从而把顺向返回和逆向返回结合起来,从而将效率最大化.

注四:上面只给出了标准方向的反方向获取方法.对于非标准且可逆的方向,都可以相应的添加到上面的@fangxiang,@fangxiangb中.

注五:丐帮暗道2的反方向是sw,但是sw的反方向可能是2,也可能是ne,解决的办法也有很多.实在想不出什么好办法,你也可以为2和se制作专门的alias,然后将alias作为2和se的替代方向来使用.

注五:对于其他的路径,有的需要开门,有的需要给钱老板gold,这些命令都可以作为方向添加到路径里去,慢速行走时作好相应的trigger来加速,不一一细说了

注六:行走失败时,无非是被系统跘住或者被自动叫杀的npc纠缠住或者busy还没结束不能移动,此时当前步数减一继续行走,不详细给出相应的trigger了.

注七:此方向效率比path高很多倍,慢速行走每步之间的间隔几乎没有.如果你用path来做遍历,至少要设置等半秒吧,一个大型区域比如丐帮洛阳凌霄都有几百步,需要几分钟才能走完,一个胡一刀任务的完成时间通常就会超过15分钟.

注八:上面的方法已经实现了#step,#stop,#back,#pause等功能.事实上实现的方法有很多种,上面的方法也肯定不会是最佳的一种.

注九:还是那句话,遍历做起来工作量很大,需要很多trigger来使用路径.

下一章将介绍路径的制作方法,以及完成更多path根本做不到的事情.
【内容导航】
第1页:聊聊zmud和机器人 第2页:机器人的核心灵魂
第3页:variable和alias的初级应用以及if语句 第4页:机器人实例-打坐吐纳机器人
第5页:buttons﹑系统变量﹑function 第6页:Variable和Alias的更多应用
第7页:掌控时间 第8页:提高机器人稳定性和适用面
第9页:丰富你的机器人 第10页:机器人实例--朝廷守门机器人
第11页:Path的用法 第12页:variable和alias的进一步应用
第13页:遍历实现的一种方法 第14页:路径的逆转和简化
第15页:实际例子--解决乱入的2种办法
收藏 推荐 打印 | 录入:sbso | 阅读:
相关内容       机器人  zmud 
本文评论   [发表评论]   全部评论 (0)
内容推送
52mud提供
一起回忆泥巴游戏QQ群68186072
52mud官方微信公众平台
热门评论