 
本篇文章是《zmud使用指南》的姊妹篇。主要介绍在zmud环境下编制自动练功机器人。想玩好mud游戏，没有高效优质的机器人将是很困难的事。机器人可以简化枯燥重复的指令操作，可以进行准确的判断控制。很难想象一个不懂得制作机器人的mud玩家会成为高手。

本文章的介绍将以zmud4.62中文版和中文mud游戏《侠客行》为例。制作机器人主要利用zmud中的trigger按钮(机器人按钮)。trigger的工作原理是判断mud服务器回送的信息是否与trigger中的触发器相同，相同则执行trigger中指定的命令或命令组。

trigger的组成部分：

class : 类名 -用于与其它的机器人相区别的名字。(相同功能的机器人多用相同的类名)

pattern : 触发器-当mud服务器向你的电脑发送的信息与触发器的文本相同时执行命令栏里的命令。

commands: 命令栏-满足触发器条件时执行的命令或命令组。(指令间以";"间隔)

实际上trigger就相当一个逻辑判断结构。

if(如果) pattern 与mud 服务器匹配

then(那么)

do(执行) commands 1

else(否则)

do(执行) commands 2

下面以一个打坐吐纳机器人为例讲解：

______________________________________________________________________

class： pattern： commands：

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

qifull 气: 100/ 100 dazuo 10

jingfull 精: 100/ 100 tuna 10

dzend 你运功完毕，深深吸了口气，站了起来。 tuna 10

tuend 你吐纳完毕，睁开双眼，站了起来。 dazuo 10

______________________________________________________________________

此机器人的作用是当使hp命令显示玩家状态时，如果精是满的(屏幕显示与pattern:"精: 100/ 100"完全相同时)，触发机器人类名为jingfull的机器人，执行tuna 10命令，开始吐纳动作。当气为满值是与此相同执行打坐命令。当吐纳完成后屏幕显示"你吐纳完毕，睁开双眼，站了起来。"，此时又触发机器人tuend，执行dazuo 10命令。打坐完成后的显示"你运功完毕，深深吸了口气，站了起来。"又将触发dzend，这样循环下去，直到精不够打坐或气不够吐纳为止。为了让机器人能在精气恢复后自动继续上述动作，还需要在标记计时器中设定每数秒执行一次"hp"命令，以随时触发此机器人达到循环打坐吐纳的效果。此例中的"jing、qi、jingfull、qifull"是为了区分机器人而定义的类名。但有时候一组机器人只是为了完成一个功能，我们可以取相同的类名。如上例四个机器人的类名全部改为dztu。

______________________________________________________________________

class： pattern： commands：

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

dztu 气: 100/ 100 dazuo 10

dztu 精: 100/ 100 tuna 10

dztu 你运功完毕，深深吸了口气，站了起来。 tuna 10

dztu 你吐纳完毕，睁开双眼，站了起来。 dazuo 10

______________________________________________________________________

在编制了许多功能不同的机器人之后，为了对机器人进行管理往往用按钮来操作。制作机器人按钮是通过菜单中定义按钮选项来实现的。当toggle被选择后，有按钮按下和按钮弹起两种状态。off caption为按钮弹起的显示内容，on caption为按钮按下的显示。on command为按钮按下时执行的命令或命令组，off command为

按钮弹起时执行的内容。此例要建立一个控制打坐吐纳机器人的按钮，应如下设置：

______________________________________________________________________

off caption : 打坐吐纳

on caption : 停 止

on command : #t+ dztu

off command : #t- dztu

______________________________________________________________________

这样在zmud的界面上方就出现了显示为打坐吐纳的按钮，按下按钮后显示为停止并开始打坐吐纳，再次按下按钮就停止打坐吐纳，按钮弹起恢复后显示为"打坐吐纳"。指令#t+、#t-是zmud内建指令集中的指令。#t+表示打开机器人；#t-表示关闭机器人。

这样一个简单的机器人就完成了。

评价一个机器人的优劣主要是从复杂程度、功能、是否安全(安全主要是避免有些恶意玩家通过触发你的机器人而将你致晕致死)、是否适合多种情况来综合评价的。通过实际应用我们可能发现，上面的机器人还存在很多问题：

1、打坐吐纳时间过长，可能因为食物和水的消耗而不能自然恢复精气，造成停止打坐。

2、随着年龄的增长精气随之增加，而造成不能触发机器人而失效。

3、因为其它原因而导致的失败，如日月神教使者的袭击等。

对于每一个出现的问题我们都需要采取不同的对策，对机器人进行改造完善，以达到尽善尽美的程度。

第一个问题解决起来很简单，只需要加一个自动进食的机器人即可。(事先须买好食物和水)

______________________________________________________________________

class： pattern： commands：

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

dztu 你的精力增加了 halt;drink ji

______________________________________________________________________

第二个问题可以在每次精气数值变化后手动修改，但这种解决方案似乎违背了制作机器人全自动化的初衷。实际上除此之外还是有解决方法的。我们通过zmud的强大功能把显示在屏幕上的精气数值抓取，用此数值进行判断条件的满足与否就能轻松的完成任务了。请看下面的机器人：

______________________________________________________________________

class： pattern： commands：

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

status 精：%s(%d)/%s(%d) jing=%1;max_jing=%2

status 气：%s(%d)/%s(%d) qi=%1;max_qi=%2

dztu 气：@max_qi/ @max_qi dazuo 10

dztu 精：@max_jing/ @max_jing tuna 10

dztu 你运功完毕，深深吸了口气，站了起来。 tuna 10

dztu 你吐纳完毕，睁开双眼，站了起来。 dazuo 10

dztu 你的精力增加了 halt;drink ji

______________________________________________________________________

比较一下两个机器人的不同，我们发现在这个机器人中出现了几个不同的符号：%s、(%d)。这些符号是zmud内建的通配符(相当于dos中的"*"、"?"),类似的还有* ---通配任何数字、字符或空白 ? ---通配任何单个字符

%d ---通配任何数字(0-9) %w ---通配任何字符串(a-z) %a ---通配任何数字或字串(%d+%w) %s ---通配空白(spaces、tabs)%x ---通配任何非空白pattern---精：%s(%d)/%s(%d) 表示用通配符通配相同位置的数字或空白。%s通配前后之间的所有空白符，(%d)通配此处的数字，括号表示作为一个变量的输入。jing和max_jing为精的当前值和最大值的变量，按通配符在pattern中的顺序，将(%d)通配的原值做为输入赋给变量：jing=%1 (对应第一个(%d)) max_jing=%2 (对应第二个(%d))。如果当前屏幕显示为：精: 140/ 150，则变量jing的值为140、变量max_jing的值为150。需要注意的是jing代表变量本身,而@jing代表变量jing的数值150。"精：@max_jing/ @max_jing"表示当精的数值全满时触发。 通过这种通配符和变量的应用,可以抓取任何数字和字符数据应用到机器人的制作当中。(如抓取自己及其他玩家的英文id和中文名字)。

______________________________________________________________________

class： pattern： commands：

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

getid (%x)快步走了过来. chinese_name=%1;id here

autobow @chinese_name ?(%w)? english_id=%1;#wait 3000;bow @english_id

______________________________________________________________________

从这个例子可以看出getid类是抓取走来的玩家的中文名字並存储在变量chinese_name中，id here是观察此地玩家id的命令。autobow类是个捕捉英文id的机器人。通过上面抓取的中文名字，使用变量chinese_name的数值@chinese_name作为触发並捕捉英文id的条件，把其后的英文字串存储在变量english_id中。因为捕捉数值需要一定时间,所以需要延迟数秒(#wait 3000)再作出回应(bow @english_id)。不难看出这是个玩家走来后自动打招呼的机器人。在玩mud的过程中，战斗是不可避免的。如何在战斗中当气少于某数值时自动逃跑是个非常常见的机器人。在这个机器人中对数值进行判断再采取相应的动作是常见的应用。

______________________________________________________________________

class： pattern： commands：

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

status 气：%s(%d)/%s(%d) qi=%1;max_qi=%2

escape 档案存储完毕. #if @qi<100 {halt;quit} {addoil}

______________________________________________________________________

在这个机器人当中使用了zmud内建的指令#if,#if是一个判断语句,标准格式爲: #if <关系表达式> {命令1} {命令2} 相当于如果条件满足(即表达式值为真)则执行命令1,否则执行命令2.常见的关系操作符还有"< > <= >="等等，详细的请参考zmud帮助。#if @qi<100 {halt;quit} {addoil}的意思就是当机器人被触发后对条件进行判断，如果当前的起气少于100就退出战斗，否则继续战斗。

在机器人的制作中经常需要利用zmud内建指令集中的指令和内建函数集中的函数，如上面例子里的#if、#wait、#t等等，只有对此熟练掌握，才能编制出优秀高效的机器人。因为指令集里的指令太多，不能在此一一介绍，将于另文《zmud内建指令集》中详细解说。zmud中还有配合指令使用的内建函数集将于另文《zmud内

建函数集》中介绍。請有兴趣的朋友参看。编制机器人和编制软件程序一样是一个有趣创造性的过程。一篇文章不能将所有的内容一一概括,本文主要是对编制机器人的方法作一个简单的介绍，提供一些常见的编制思路和技巧。聪明的朋友可以举一反三，不断对此进行完善提出更有效优秀的思路。既做游戏中的高手，又在游戏中锻炼了自己的编程能力，那才是本文真正重要的目的。
 
