|
本帖最后由 bluse 于 2013-7-22 09:12 PM 编辑
时至今日探讨ZMUD的技术似乎略显寒碜。本人不放弃这个平台,一方面来自惰性;另一方面,自己名字里有Z,因而独钟于图标中蓝色的大Z……
本文仅为抛砖引玉,旨在为进阶玩家制作高级机器人设计遍历时提供一个解决自定义方向的方法。求慢吐轻拍。
众所周知,在我们的MUD世界中,房间之间的联结,除了e、s、n、w、in、out以外,还存在很多的特殊方向,例如open door、enter shudong、ban stone。保守估计,截止2011年底本人消极练功时,PKUXKX世界里这样的特殊方向可能多达上百条。老玩家可能掌握了绝大多数特殊方向,所以在做任务时才得心应手。在设计机器人遍历PATH时,每个特殊方向都需要用一个独立的ASCII字符去定义。而键盘上的字母标点统共加起来恐怕也不足五十个。如何把这么多特殊方向定义在PATH里呢?我想到了计算机设计中寄存器间接寻址的技术。
首先,我们把任务中需要用到的所有特殊方向,罗列出来,得到一个列表,存入变量spec_cmds,注意用“|”分隔它们。例如内容为:
1|2|3|4|5|6|7|8|9|enter shudong|say 天堂有路你不走呀|pull gate|open gate|zuan|ban shan|ban stone|break men|climb yafeng|guo qiao|knock gate|unwield all|push stone|push men|open door|zou tiesuo|enter boat|say 红花老祖本姓朱 为救苍生下凡来|bo xiaolu|ask liang liuhe about pk|swear 我将永远忠于帮主,若有悖逆,天诛地灭!!|ask qin bingtou about 自立为王|climb mount|knock guancai 3|ask chou diao about 独孤求败|give 100 silver to qian laoben|ask qian laoben about 进宫|cai tingxiang|cai yanziwu|cai qinyun|jump west|jump east|ask shiwei jiaotou about 投军|tan qin|jump bank|ask qiao fu about 绝义谷|enter baoku|enter maoce|jump spring|jump out|jump jiang|swim river|juan picture|enter guancai4|enter guancai5|zuan dong|ask wu jiang about 出城|give 20 silver to wu jiang|give 2 silver to zhuang ding|climb pine
自然地,每个特殊方向在列表里都有了自己的序号,enter shudong是第10,pull gate是第12,等等。
如果我们执行一条#exec %word(@spec_cmds,10,|),那实际上就是向MUD里发送了一条enter shudong指令,达到钻入树洞的目的。
然后我们对上面的指令做一次提炼,得到:执行任何特殊方向 等同于 执行#exec %word(@spec_cmds,特殊方向序号,|)。到这里还是不够的,因为我们仍然无法定义上百条类似#exec %word(@spec_cmds,特殊方向序号,|)的方向,这次提炼还没有从本质上规避特殊方向数量大的问题。如果所有的特殊方向,都能定义为一个统一的方向该多好。
有句话,大胆地假设,小心的求证。我们假设,存在这样一个形式形似#exec %word(@spec_cmds,特殊方向序号,|)的特殊方向定义,可以在任何时候都适用。换句话说,我们需要另外建设一个子系统,来维护特殊方向序号的变量,令它在需要的时候,反映出我们需要的数值。
要实现这一点,定义变量use_spec_cmds、nspec。use_spec_cmds列举此次遍历所涉及的特殊方向的序号,nspec为本次遍历中已经执行过的特殊方向的计数,也就能反映下个要执行的特殊方向是use_spec_cmds的第几个。这听起来可能有点绕人。举个例子,当接到大轮寺的任务,机器人会定义use_spec_cmds="48|49|55|20|24|24|12",这表示遍历大轮寺的PATH所走过的路途中,需要经历的特殊方向是spec_cmds列表的第48、49、55、20、24、24、12条指令,它们依次是:jump spring、jump out、zuan dong、knock gate、open door、open door、pull gate。
定义execspec为:#exec %word(@spec_cmds,%word(@use_spec_cmds,@nspec,|),|),定义统一特殊方向!为:#ad nspec 1;execspec。在遍历开始时,nspec=0,第一次执行特殊方向!的结果是:nspec变为1,执行了jump spring,第二次执行特殊方向!的结果则是:nspec变为2,执行了jump out。每执行过一次特殊方向,nspec就会自增1。如此一来,在整个任务进程中,执行这个统一特殊方向!都能恰巧得到需要的实际指令。
一般地,面对一副新地图的遍历工作,我们如此做:编写PATH时遇到的所有特殊方向都使用!方向;考察该地图遍历过程中需要经历的特殊方向,把它们在spec_cmds中的序号编入use_spec_cmds(如果它们还没有存在于spec_cmds列表中,就添补spec_cmds);从PATH起点#slow对该PATH进行遍历测试。任务开始时,把use_spec_cmds等变量初始化成当前任务的数据即可。
如果将这个方案实施得再彻底一些,我们亦可将所有的普通方向(例如e、s、nw、in、down)也收录进spec_cmds,到时候整个机器人里只有一个PATH方向——!方向,编写PATH的过程会完全转变为编写use_spec_cmds的过程。这样一来我们实际上就捐弃了ZMUD自带的PATH方向定义功能,而使用自制的子系统替代之。
不足之处请批评指正。
北大侠客行MUD,中国最好的MUD |
|