背景:
阅读文章

ZMUD机器人制作(精)

Path的用法

[日期:2013-12-11] 来源:mud游戏网  作者: [字体: ]

路一直是机器人制作中的难题,很多人希望学习path的用法,应大家要求补充此章.尽管现在我已经完全不用path了,但是path还是有一些比较好的用途.

个人认为,462和555版本比较老,Path、Map和DB的功能都不完善,相对于721更属于半成品.大家如果想用好这3个玩意儿,建议还是用zmud721.因此本章主要以zmud721为准来介绍path.

另外本人在zmud555和zmud721中使用Path时至今尚被一个问题困扰,如有高手能解决此问题还请赐教.用#slow .2s3e4u完成慢速行走之后,#path显示出Path Behind:4s6e8u,我所有的方向都一个变俩了.怀疑是slow walk的时候不断将已走过的命令添加到Path Behind中,同时还在为我录制路径,于是每走一步添加2次命令到Path Behind中.这个问题在zmud462中不存在

这个问题导致#back,#retrace都不好用了.到处寻找设置方法或者命令来解决此问题失败,愤而完全放弃path另外寻求方法.由于zmud提供的可用于操作path的命令或者函数都比较有限,我感觉还不如直接从path的"本质"出发另外寻求方法取代path,于是就有了高级篇中我要介绍的方法,不过这属于后话了,下面进入正题.

Path简而言之就是预先录制好的路径,用法自然就包含2个方面录制路径和使用路径

补充.1 录制路径

1.1 录制路径之前需要预先定义方向.

zmud一般有预先定义好的几个标准方向,分别是east,west,north,south,nw,ne,sw,se,u,d.
这10个标准方向是远远不够的,游戏中的方向非常多,不光有最常见的nu,nd,su,sd,wu,wd,eu,ed,enter,out,还有enter shudong,enter boat,climb,jump,ban stone等等,甚至丐帮暗道那里123456789都是方向.

点击菜单View->Directions就可以定义方向了.

一个方向包含4个要素:Direction,Reverse,Commands,Map

Direction为方向的代号,只允许单个的符号.比如字母A-Z,!@#$%^&*()[]{}都可以作为方向的代号。由于方向非常的多,你要做的就是在键盘上寻找各种各样的符号作为方向的代号
Reverse为它的反方向的代号。对于可逆的方向,最好把它的反方向的代号填到这里
Commands就是方向的命令了,比如e,enter boat,ban stone等等
Map在画地图时才有用,画地图时方向就是房间之间的连线。

并不是所有的方向都要定义之后才能用在path里,比如你也可以把(kill dizi)添加到path里.要注意的是对于没有定义过的方向需要加上()才能用在path中。这个做法在zmud462和zmud555中行不通,仅在zmud721中有效。

注:你不仅可以把方向添加到path里,你也可以把诸如(#say 遍历结束)(#say 需要坐船)这样的命令添加到path中,然后通过#say显示的内容制作trigger来坐船或者返回。你还可以将一系列连续的命令包括变量赋值等待建立trigger等都作为一个方向加入,比如(#var xxx xxx;#wa 3000;#tri {} {}),类似这样的技巧请开动脑筋多多运用

1.2 方向定义好之后,录制路径就很简单了。你可以有2种方法录制路径,推荐使用方法B

A:输入#mark命令,然后就在游戏里走路吧,用#path可以查看录制情况。把你要录制的路径走完,用#path查看确认无误,就可以用#path pathname保存起来了,pathname就是你要保存路径的名字。

B:点击菜单Actions->Record Path,弹出一个小窗口,不用管它,接着在游戏里走路就可以了,你走过的方向都以代号的形式出现在那个弹出的小窗口内,路径走完之后点击保存就可以了。

实例一:#path aaa 3n(kill dizi)2e
//这里直接用#path命令新建一个path,path名为aaa,路径是3n2e,表示n;n;n;kill dizi;e;e
//用这种方式新建的path与录制制作的path完全一样

实例二:#path .fff .3n(kill dizi)2e
//跟上例完全一样,只不过path前面加了一个".",表示该path的路径
//为什么这里可以多余的加个"."?其实你要弄清楚path其实就是特殊的alias,当你在命令栏输入.fff或者.3n(kill dizi)2e的时候,命令{n;n;n;kill dizi;e;e}就发送出去了,就好像alias一样。这个是path的快速行走的用法。

补充.2 使用路径

2.1 快速行走

假设已经将路径9n9e9n9e保存到fff中,或者直接在命令栏输入#path fff 9n9e9n9e
实例三:输入命令.fff或者输入.9n9e9n9e
//这2个命令效果完全一样,都是完成了一次快速行走,36个方向命令按顺序同时执行

实例四:上面例子中快速行走命令太多游戏拒绝执行
#direction q "#wa 3000"
//将等待3秒定义为一个方向
#path fff 9nq9eq9nq9e
//每9个命令之间加入方向q
.fff
//作用等同与在命令栏输入#9 n;#wa 3000;#9 e;#wa 3000;#9 n;#wa 3000;#9 e
//对于较长的路径,如果你想快速行走,定义路径的时候要采取本例做法
//当然你也可以不定义方向q,而将(#wa 3000)添加到fff中

2.2 慢速行走

主要用于搜索npc,相关命令#stop,#step,#back,#retrace,#ok,#slow
将勾勾去掉,timeout value的值根据网速修改,当你慢速行走时,每个方向命令的间隔时间就是这个值,单位为毫秒。

#path fff 3n2e
#slow .3n2e或者#slow 3n2e或者#slow fff
//慢速行走3n2e
#pause
//#pause表示行走是成功的并且暂停慢速行走,当你找到npc用这个命令停止。
#stop
//很多人不知道#stop和#pause的区别,#stop表示行走不成功并且停止慢速行走,一般用于被npc挡住或者被系统跘了一下
#step
//#step继续慢速行走。如果你是用#stop停止的,这个命令会从刚才不成功的那步开始直至走完;如果你是用#pause停止的,这个命令会从下一步开始直至走完
#ok
//确认行走成功
#back
//退回一步,网速不好时你会走过头,用这个命令一步步往回搜索吧,也可以用这个慢慢的回家
#retrace fff
//逆向快速行走。fff的路径是3n2e,此命令相当于w;w;s;s;s,帮助你回家
//此命令缺点太多。如果路径包含有非方向,例如(enter shudong) (#wa 3000),行走到这些地方就会中止
//如果#retrace不指定路径单独使用,则逆向行走当前路径。用#path查看,逆向行走时针对的当前路径内容为Path Behind.

这些命令主要用在你的trigger中,被npc或者门挡住你可以#stop然后杀npc或者开门,杀掉npc之后你可以#step走完剩下的路径。当然你也可以直接把(kill npc)或者(open dor)添加到路径里。搜索到盗宝人你可以#pause然后杀掉,任务完成之后你可以#back或者#retrace,也可以#step继续走剩下的。

注一:path只是机器人的脚,trigger才是机器人的灵魂。你制作了很多路径,也需要很多trigger来使用这些路径。trigger做的不好,机器人就会中断。游戏中有很多地方都是制作机器人的障碍,迷宫船挡路npc沙漠有busy的方向(例如杀手帮的台阶)需要跟npc对话的地方(例如ask chuan fu about 出海或者answer 送信)等等,你需要用trigger来解决这些障碍。从制作路径到制作trigger,整个过程需要很多时间才能完成一个遍历机器人,祝你制作愉快,嘿嘿!

补充.3 Path的"本质"

zmud721中有2个函数很好的诠释了path的本质,可惜的是zmud462和zmud555没有这2个函数

在第5章结尾我提到过%ailas()这个函数,作用是将一个alias转化为string
在本章的实例二中说过,其实path就是alias详情可参阅#help.因此我们可以把任意一个path转化为string

实例五:#path fff 3n2e(enter dong)d
#say %alias(fff)
显示为3n2e(enter dong)d

zmud721中才有的2个函数%pathexpand()和%pathcompress()
%pathexpand()和%pathcompress()的参数都不能是path名字或者alias名字,跟%alias()不一样,需要将path名字进行转化才能用到%pathexpand()中。

#path fff 3n2ed
实例六:#say %pathexpand(%alias(fff))
//显示为n|n|n|e|e|d
实例七:#say %pathcompress(n|n|n|e|e|d)
#path ggg %pathcompress(n|n|n|e|e|d)
//显示为.3n2ed,注意"."
实例八:#path fff 3n2ed;#var fff "n|n|n|e|e|d"
#if (@fff=%pathexpand(%alias(fff))) {#say yes} {#say no}
//显示为yes
#say %format(%alias(fff))
//显示为n|n|n|e|e|d

注二:通过实例6,7,8会发现path其实可以与list类型变量相互转化。基于这点,我考虑放弃path而转用list类型变量。path是zmud提供的一个工具,我觉得这个工具功能不完善,定义方向太麻烦,使用起来不灵活,这些也是有些人觉得path不好用的原因。

在第6章结尾曾经说过,第6,7两章是所有章节中最重要的两章,第七章的重要性可能大家已经感觉到了,在高级篇中我会用list类型变量实现path的全部功能,并且能很轻易做到path做不到的事情,个人觉得list类型变量用起来更加随心所欲一些。

【内容导航】
第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官方微信公众平台
热门评论