Zmud编程方法简明教程（猫头鹰 Catbird）

由于各种软件都在不断地、频繁地升级，所以要选一个大家都通用的Zmud
版本不是一件容易的事。Zmud 5.22a刚刚出台，可能使用的人不会太多，而我
认为Zmud4.62可能是目前使用最广的，所以我选用Zmud4.62作为这个教程的依
据版本。其它版本的用法也是大同小异的。
本教程初步计划分如下几个部分：
1。入门（讲述Zmud编程的基本要素）
2。实战（讲解机器人的应用实例）
3。深入（介绍Zmud的高级应用）

1. 入门-Zmud编程的基本概念。

与Telnet等初级工具相比，在玩泥巴（MUD）时，Zmud显示出强大的编程功
能，利用Zmud的编程功能，我们可以根据MUD反馈回来的信息作出各种各样的复
杂动作，从而简化我们的操作，让我们可以更轻松地畅游泥巴世界。
Zmud编程的基本要素如下：
Alias/Macro key/Variable/Trigger/button
1.1 Alias 别名，可以将任何命令定义成你喜欢的形式。
用一句通俗的话说就是：它可以将一条或多条复杂的命令用几个字母代替。
比如：buy jitui from xiao er可以定义一个别名：mjt，
这样以后你只需键入mjt，即可完成buy jitui from xiao er的动作。
1.1.1 定义别名的方法有三种：
1.1.1.1 最简单的方法：使用快捷键：Ctrl+A。
在命令行里输入要定义别名的命令，然后按“Ctrl+A”，再键入自己命名
的别名即可。比如：在命令行里输入“buy jitui from er”，然后，按
“Ctrl+A”，再键入“mjt”，这样就给“buy jitui from er”定义了一
个别名“mjt”。
1.1.1.2 使用“#ALIAS”命令。
语法：#ALIAS ALIASNAME {COMMAND} 
比如上例可以通过在命令行里输入“#ALIAS mjt {buy jitui from er}”
来完成别名的定义。
1.1.1.3 使用别名定义窗口。
你可以通过选择Zmud主菜单“View/Aliases”或者按菜单项的“Aliases”
按钮来打开别名定义窗口，并对所有已定义的别名进行修改，添加或删除
的操作。
1.1.2 使用参数。
另外，Alias 还可以使用参数，这让我们的操作有了灵活性。比如你可以
这样定义：#ALIAS k {kick %1;hammer %1;nip %1}，于是你键入k mixuer
就相当于键入了“kick mixuer;hammer mixuer;nip mixuer”，不过千万
不要写太多命令（小心频道被关），而且最好把“mixuer”换成“jokey,
hero,koko,pqpq,sjmao,great,fangcj...” ，只要别换成“tianya/tygk”
就行，*snicker。
注：别名只能用于一条命令的开头，只有这样别名才能被解释执行。比如：
say mjt 不会被解释成say buy jiutui from er，因为mjt这个别名不是处于
这条命令的开头。
1.2 Macro key 宏定义键。
将命令定义成键盘上相应的键或者组合键。
1.2.1 定义的方法。
从Zmud的顶部菜单中选择“Action->Define Macro Keys”，按下组合
键“Ctrl+K”，Zmud会弹出一个小窗口，提示你键入要定义的键，按下要定
义的键之后，Zmud会要求你输入在这个键上要表示的命令，再键入你希望的
命令，一个宏定义键就定义完毕了。
1.2.2 在定义宏定义键时要注意的问题。
1.2.2.1 不要使用Zmud保留的键名。比如：Ctrl+K,Ctrl+A等等，因为你的定义不
能覆盖Zmud的已有的定义。
1.2.2.2 不要使用Windows等操作系统保留的键名，比如：F10,|ALt+A等，因为这
样会影响你对操作系统的操作。
1.2.2.3 不要使用箭头等编辑键。但当NUM LOCK 灯亮时小键盘上的键就不是编辑
键，你可以使用它们作为宏定义键。
1.2.3 当你键入宏定义键时，宏定义键代表的文本并不输入到命令行中。
我们可以利用这个特性做一些富有技巧性的事，比如：
如果你想迅速移动到东方，并且拣起地上的东西，可以这样做：
定义数字键 6为“east”的宏，然后先在命令行中输入“get all”，按6之
后，敲回车键“Enter”即可用 2个键迅速的实现“east；get all”两步操
作。
1.2.4 宏定义链。
在定义宏的时候在命令后加一个“~”，那么当你键入这个键时，命令并不是
马上执行，而是先输入到命令行中去，并且把光标停留在这条命令的末尾。
这样你就可以输入另一个宏定义键，于是就构成了宏定义链，这样可以减少
你输入的键数。比如：如果我们定义了两个宏定义键：
F8 open door~
小键盘的8 north
这样当我们输入“F8,8”的时候，命令“open door；north”就被执行了，
我们仅仅按了两个键，是不是特方便？

注：其实在我们使用Zmud的时候，Zmud 已经为我们定义好了一些宏定义键，象我上
面提到的“north,east”等方向键等等，你可以通过按“Ctrl+k”来查看修改
这些宏定义键。
1.3 Variable 变量。变量相当于编程语言中的变量。
一旦定义可以用于命令的任何位置。
1.3.1 定义的方法。
1.3.1.1 在命令行中使用命令#VAR。比如：#VAR food jitui，就定义了一个变
量，并将值“jitui”赋给了变量“food”。
1.3.1.2 通过变量窗口。
选择Zmud的顶部菜单中的“View->variables”，或按菜单项“variables”，
都可以打开变量窗口。在“Variable”中添入要定义的变量的名字，可以同
时指定变量的初值（Value），默认值（Default）。这样一个变量就定义完
毕。比如：上例中的变量在变量窗口中可以这样定义：在“Variable”中添
入“food”，在“value”中添入“jitui”，即可完成变量“food”的定义
和赋值。
1.3.2 变量的引用方法。
在变量名之前加一个“@”，即可引用这个变量的值。比如：
我们用“@food”即代表了jitui，“eat @food”即完成“eat jitui”的动
作。变量的价值在于：当我们改变变量“food”的值时，我们不必改变命令
“eat @food”，比如：当“food”的值变成 “gourou”时，我们一样可以
用“eat @food”完成吃的动作。
1.3.3 系统变量。
Zmud为我们提供了一些系统变量，这些变量以“%”为前导，它们可以象普通
变量一样引用，只是它们以“%”为前导，而不是“@”。这些变量较少用到，也
许我会在以后的高级应用中进一步解释。
注：在退出Zmud时，系统并不要求你保存已定义的变量，如果你想保存这些变量，
那么在退出Zmud之前你必须先保存好这些变量。
1.4 Trigger 
我不知道该叫它什么，触发？扳机？...我看还是叫“动作”比较恰当。
也就是说，它能够根据发生的不同情况执行相应的命令。哇~~这正是我们想
要的！这是Zmud的最基本而有用的功能！也是做机器人的基础。打瞌睡的快
醒醒，瞪大你的眼睛，竖起你的耳朵，:)
1.4.1 定义的方法。
1.4.1.1 利用命令行 #TRIGGER (或者 #ACTION)。
语法：#TRIGGER {pattern} {command}
比如：#TRIGGER {你气喘嘘嘘，看起来状况并不太好。} {exert recover}
这样，当屏幕上出现“你气喘嘘嘘，看起来状况并不太好。”信息时，你定义
的Trigger就会触发，产生“exert recover”的动作，这样你就可以自动恢复
气血了。当然在command中可以使用已定义的变量（valiable）或别名（alias）。 
1.4.1.2 通过动作定义窗口。
从Zmud的顶部主菜单中选择“View->Trigger”，就会打开动作定义窗口，所有
已定义的Tigger都会显示在这个窗口中，所以我们可以随意地修改它们，当然
也可以添加或者删除。在窗口中有这么几个项：Class,Pattern,Command。Class
是动作的类，你可以将相关的动作放在一个类里。Pattern是模式的意思，也就
是说你期望屏幕上出现的信息，你可以从屏幕上直接粘贴这些信息。Command
是当你的pattern跟屏幕上出现的信息吻合时将产生的动作。另外还有几个按钮
“Enable class”让选定的动作起作用，“Disable Class”则让选定的动作暂
时失去作用。“Testing” 可以测试你定义的动作是否正确。“Options”中是
关于动作的一些设定，我会在以后进一步说明。
1.4.2 对Tigger的控制。
在通过命令行定义Trigger时，可以再加一个参数，如下：
#TRIGGER {pattern} {command} classname
这个classname就是你要为这个Tigger起的类名。这样在命令行中，我们可以
通过“#t+ classname”来打开一个类（相当于在窗口中按“Enable class”
按钮），也可以用“#t- classname”来关闭一个类（相当于在窗口中按下按
钮“Disable Class”）。
注：匹配符。
* 可以代表一个或多个字符，也可以代表空格。
? 可以代表一个字符。
%d 代表任何十进制的数字(0-9)。
%w 可以代表任何拉丁字母(a-z) (a word)。
%a 可以代表任何拉丁字母或阿拉伯数字(a-z,0-9)。
%s 可以代表空格或跳格键 (spaces, tabs)。
%x 可以代表任何非空格字符。
[range] 代表规定范围内所列出的任何数量的字符。
^ 强制从一行的开头进行匹配。
$ 强制从一行的结尾进行匹配。
(pattern) 将已匹配的串存入变量里，变量可以是 %1到 %9。
~ 将下面的字符作出注释，防止它被匹配，实际就是将它忽略。
{val1|val2|val3|...} 匹配任何已指定的字串。
{^string} 不匹配选定的字串。
也许你不太明白上面的解释，不必着急，在以后的讲座中，我会结合实例进一步解释。
1.5 button 按钮。
通过点击按钮可以执行相应的命令，也可以显示某个参数的值，还可以方便地
控制Trigger的开启或关闭等。按钮可以使我们的操作更加直观、方便。
1.5.1 按钮的类型。
按钮可以分成两种：点击按钮和开关按钮。当你用鼠标按下“点击按钮”时，
命令被执行，当你释放鼠标时，命令被释放。而点击“开关按钮”，按钮将在
“ON”和“OFF”之间循环。
1.5.2 定义的方法。
从主菜单中选“Action->Make buttons”或者“View->Buttons”都将弹出按钮
的编辑窗口。
如果选定“Toggle”，将定义一个“开关按钮”。“Off Caption”指定“OFF”
状态时按钮上显示的文本；“On Caption”指定“ON”状态时按钮上显示的文
本；“Off Command”指定按钮ON时执行的命令；“On Command”指定按钮OFF
时执行的命令。“Variable”可以定义按钮所需的变量。
如果不选定“Toggle”，将定义一个“点击按钮”。只需在“Off Caption”和
“On Command”中添入相应的内容即可。
1.5.3 按钮的高级属性。
在按钮的“Advanced”设置里你可以指定、修改按钮的许多特性。
比如：按钮的颜色，改变按钮的尺寸、位置，为按钮指定一幅图片等等。
例子：
自动study机器人的设计：
1。变量的定义:
book 要study的书或物品名
st_value 用于study的精神值
st_back 用于恢复精神的内力值
st_loop 用于正循环的气血值

2。triggers的设计：
class:
study
pattern:
内力 ：(%s)(%1)/(%s)(%d) 
commands:
#if (%1<@st_back);
{#wa 3000;exercise @st_loop;#wa 3000;exert recover;hp};
{#wa 3000;study @book @st_value;#wa 500;exert refresh;hp}

解释：这个command的意思是，如果内力的左边值小于用于恢复的值，那么就练内力；否则，就读书，并用内力恢复精神。
3。button的设计：
Off caption:study off
On caption: study on
On commands:#prompt book;#t+ study;hp
Off commands:#t- study
（这仅仅是一个例子，如果要用于实际当中，还要做一些改动。）
这一节我介绍的只是Zmud编程中的基本要素，也许枯燥一点，但了解这些基本要
素是很有必要的。有了这些基本要素，我们就可以利用他们构造出各种各样的自
动操作，也就是我们常说的 robot（机器人）。下一节我会结合实际，专门讲几
个例子探讨一下robot的制作方法。
下节的主要内容是：robot实例讲解。 （猫头鹰 Catbird 1998.06.23 ）
