南极熊 发表于 2010-9-8 19:57:41

新手zmud462机器人速成宝典(初级篇)

本帖最后由 是开碧落 于 2012-8-4 11:46 编辑

zmud 4.62 是mud最简单使用的客户端, 鉴于咱家游戏设定对机器人的水平要不高, zmud462足够用了.

初级篇 希望大家学会 触发器(trigger), 定时器(timer), 别名(alias), 变量(variable), 快捷键的用法

第一章 制作机器人的良好习惯

a. 机器人中请不要发布无用信息, 尤其不要发布公共频道或say, 影响他人.
b. 使用变量和别名的时候,为变量取名字一定要含义清楚,否则时间长了连你自己都会忘记,不易于修改。
c. 尽量为每个触发设置类别(class),相近的触发归到一个类别, 取名同样要含义清楚,以方便别的机器人加载。
d. zmud本身自带帮助文件, 菜单 - 帮助 - 目录 调出 英文版. 中文翻译版见: http://www.17mud.com/thread-508-1-1.html
这主要是针对于复杂用法: zmud自带的函数查询, 简单使用就不用看了

第二章 触发器的应用

2.1 触发器

触发器是机器人最常用的应用. 目的是 抓取屏幕显示的语句, 自动执行命令.

a. 在主屏幕上选择一句你想触发的信息行, 鼠标点击行的最左侧即可.
b. 点击上侧触发器图标.
c. 然后点击"新建" 新建一个触发器,
将选择的信息行粘贴到 "句型" 内,
将希望执行的命令敲入 "指令",
点击"确定", 完成了一条最简单的触发器.

理论知识:
触发器有四个要素: 句型(pattern)﹑指令(Commands)﹑开启本类(Enable)/关闭本类(Disable)和类别(Class)。
Zmud根据Pattern的内容来做出反应,简单点说只要你的屏幕上出现了跟Pattern一致的内容,Commands里的内容就作为命令发送出去了。Enable表示这个trigger是激活状态,Disable表示trigger不激活,处于无效状态。Class表示这个trigger所属的类,可以通过操作整个类来达到一次性同时操作多个trigger的目的。

2.2 字符串匹配
简单点说就是通过几个特殊的符号来代表具有某些共同之处的一类信息。只被用于Pattern。
zmud提供的字符号串匹配有:
    *   通配任何数字、字符或空白
    %d 通配任何数字(0-9)
    ?通配任何单个字符
    %s 通配任何空白(spaces,tabs)
    %w 通配任何字母(a-z)
    %a 通配任何数字和字母(等于%d+%w)
    %n 通配任何以+或-开头的数字
    %x 通配任何非空白
    %p 通配一个方向
    通配任何在range范围内的字符
    ^ 表示一行的开头,想要你的trigger在一行的开头才有效,就在最前面加上这个
    $ 表示一行的结尾。
    (pattern)将括号里面的内容依次存放在参数%1~%99里
    {val1|val2|val3|……} 通配val1,val2或者val3
    还有一个特殊字符就是~,用在特殊字符前面。因为有些特殊字符被zmud理解为自己的通配符之类意思了,所以为了匹配这些特殊字符,前面要加~
    比如~{通配{   ~?匹配?      ~~匹配~
在命令行输入#say %def,默认显示为#;@!%.:~>&,再加上括号{}()[],这些都是有特殊含义的特殊字符了,要匹配这些字符,前面都要加上~

关于字符串匹配,主要就是这些了,而真正常用的就几个

实例一:#tri {□手持一个圣火令~(Shenghuo ling~)} {#say 明教武士}
#tri表示用命令新建一个trigger,第一个花括号里的内容作为Pattern,第二个花括号里的内容作为Commands
这里用到~(来通配(,如果触发内容里的括号前不加~,括号就会被zmud当做通配符无视掉,这样当屏幕上出现这句话时也会让zmud以为多了个括号而无法触发。

实例二:#tri {【%s气血%s】%s(%d)%s/%s(%d)%s~[(*)~%~]%s【%s内力%s】%s(%d)%s/%s(%d)} {#show %1 %2 %3 %4 %5}
依次显示出你的气血 气血最大值 受伤状况 内力 内力最大值
如上面讲过的,()的作用是把里面的内容按顺序依次保存在临时参数%1~%99里

上面2个例子分别用到了zmud提供的2个命令#say和#show,功能差不多颜色不同,都只是在屏幕上显示某些内容用的,这些内容不作为命令发送给服务器执行,但是zmud会用这些内容来触发trigger,所以做机器人的时候可以用这个来做触发,但是建议不要这样做,因为#sh(zmud的方法多数都可以简写,#show跟#sh是一样的)是不发送给服务器的,所以没有延迟,用这个做触发很容易导致你的机器人短时间内发送大量指令,后果就是被雷劈……而且#sh容易干扰zmud本身显示的内容,出现乱码,导致机器人停止运行。

建议:做Pattern的时候不要手动输入,因为中文英文半角全角各种特殊字符还有空格符,你的手动输入很可能不正确,等整个机器人做成功了查错又不容易。所以尽量用粘贴的,然后先把里面的空格全部换成%s,把所有的特殊字符前面都加上~,要怎么通配的就换成什么通配,最后看要不要顶行触发或者结尾触发,这样一般不会有错了。

2.3 Class和#t+ #t-的用途

Class有好几个用途,比如为了方便Import,点击Settings->Import->settings,然后选择一个机器人,再选择一个Class点击Add-OK就可以把另外一个机器人里面所有归为某个Class的triggers,variablde,alias等都添加到当前机器人里面。如果删除某个Class,那么该Class下的所有元素全部删除。

#t+和#t-分别是激活和关闭某类trigger。#t+和#t-都是针对Class的名字来操作,所有的 variable,alias,trigger,button都可以取一个class名字,但是只有trigger才有Enable/Disable状态,所有#t+/#t-只对trigger有效。这2个命令被广泛的应用与机器人制作中,非常重要。

实例三:某些trigger只希望它在特定的时候激活,其他时候都处于关闭状态,用来防止误触发,这时候用#t+ #t-是最适合不过的了。
#tri {你向林震南打听有关『*镖』的消息。} {#t+ job}
#tri {林震南说道:「你上次运镖太辛苦了,下去休息休息吧。」} {#t- job;#wa 5000;ask lin about job} {job}
这里第2个trigger设置了一个class:job,平时都处于disable状态,只有当你向林要任务的时候才开启,并且在trigger触发之后立刻关闭。
如果你不这样做,当别人来要任务也要不到的时候会出现同样的触发信息从而误触发。游戏里好多机器人同时跟林要任务,互相干扰,结果就变成要任务比赛了。那么恭喜你,你的机器人是个流氓,刷屏!


第三章 variable和alias的初级应用以及if语句

3.1 Variable和Alias

相关命令 #var,#math,#add,,#alias
北侠众应该都知道Alias的用法吧,论坛和主页下载的zmud包里都有前辈做好的路径,要去哪里简单的输入地名的拼音就可以了。
Alias就是别名,用一个短命令替代一串长命令

另外Alias还可以带参数使用
实例一:#alias {chan} {wield sword;perform sword.chan %1 %2;unwield sword}
这样就制作一个alias,下面分别是4种使用结果
A: chan          相当于输入wield sword;perform sword.chan;unwield sword
B: chan wushi    相当于输入wield sword;perform sword.chan wushi;unwield sword
C: chan zhang san相当于输入wield sword;perform sword.chan zhang san;unwield sword
D: chan 1 2 3    相当于输入wield sword;perform sword.chan 1 2;unwield sword 3
可以看到,无论你带不带参数,带几个参数,zmud都不报错,他都按照他自己固定的理解来执行你的命令,2个参数以内的依次替换成%1 %2,多余的参数全部放在最后,没有就直接无视,相当的灵活。

Variable就是变量,只有用到了变量,才能进行各种运算,并且根据运算结果作出不同的反应。
#var为一个变量赋值,而不管这个变量存不存在。变量不存在时新建变量,存在时改变它的值。
比如#var abc 100,将100赋值给变量abc,或者说abc的值就是100了。另一种赋值方法是abc=100

变量的值用@加上变量名来使用和表示。
例如: #show abc的值是@abc   
             显示为 abc的值是100
#math 用来计算,将结果赋值给变量,zmud只支持+ - * /和()的四则混合运算,运算优先权是()大于*/大于+ -,并且仅支持整数,如果运算结果不是整数,自动进行取整运算。

小技巧一:[ ]的运用

[ ]表示运算之后结果,举例来说
#var a 100/5;#var b ;#math c 100/3
#show @a,@b,@c
显示结果为100/3,33,33
没错,#var不负责运算,[]负责运算,起到了#math的作用。

书签
小技巧二:已经抓取到的变量@variable直接用在trigger的Pattern里面

实例:如何使用大米a
#tri {盗 宝 人*@dbrname~(@dbr~)} {follow @dbr;hit @dbr}

小技巧三:现在已经讲了trigger,variable和alias,后面还会讲到button,还有macro,这些都可以互相糅合互相嵌套,任何一个都可以包含另外一个,也可以自己包含自己,再次体现了zmud的灵活。

实例:#Alias jiaxing {do 6 e;se;s;e;e;#var back jiaxingb}
    #Alias jiaxingb {w;w;n;nw;#6 w}
    #ALIAS taohua {#6 e;se;s;e;e;nd;e;e;e;e;n;enter;enter boat;#var back taohuab}
    #ALIAS taohuab {out;s;w;w;w;w;su;w;w;n;nw;#6 w}
    #alias ddd {@back}
可以看到alias里包含了变量,变量里包含alias,以上4个alias分别是嘉兴和桃花去和回的路径,但是嫌回来时后面加个b太麻烦了,就用上面这个方法。不管你是在嘉兴还是在桃花,只要去的时候是用alias去的,回来的时候统一用ddd返回。并且不影响jiaxingb,taohuab的使用。

3.2 if语句 相关命令#if

格式:#if 表达式 {commands1} {commands2}
当表达式的结果运算为真时,执行commands1,否则执行commands2

另2种变化了的格式都可以用
#if 表达式 {} {commands2}
#if 表达式 {commands1}

比如:#tri {【%s气血%s】%s(%d)%s/%s(%d)%s~[(*)~%~]%s【%s内力%s】%s(%d)%s/%s(%d)} {#if (%1>500) {dazuo 500} {exert recover;dazuo 500}}
简单的判断一下气血值,如果大于500就dazuo 500,否则就先吸气然后dazuo 500

#if 可以多重使用,commands1和commands2里面都可以包含一个或多个#if
表达式也可以是多个表达式的组合,多个表达式之间用&或者|来连接。&表示“并且”,|表示“或者”。例如
((表达式1&表达式2)|表达式3) 只要表达式3为真,总表达式就为真;只要表达式12同时为真,总表达式就为真;**情况都不真。
注意事项:去掉中间的子括号,(表达式1&表达式2|表达式3)会造成歧义,zmud不会报错,具体结果请自行试验。

表达式里通常用到的比较符号有“>” “<” “=” “!=” “<>” “<=” “>=”,其中!=表示不等于,<>表示大于或者小于
注意事项:表达式不仅仅是比较数字,也能比较字符串甚至中文,如有需要可以加上" "
         比如(@dbr="mengmian shashou"|@dbrname="张三")

实例:做一个机器人,明教弟子碰到盗宝人先夺兵器直至成功夺掉兵器,然后用阴风刀,成功用出1次阴风刀之后用tisha来busy盗宝人,一直到将其杀掉。
ps.只是举个例子,不讨论这个打法的正确性。
需要解决的困难:自己在busy的时候,任何perform的结果都是( 你上一个动作还没有完成,不能施用外功。),无法判断接下来的动作。
假设你已经将盗宝人的名字储存到@dbrname中,将盗宝人的id储存到@dbr中。
实际给出2种制作方案:

A:#tri {盗 宝 人*@dbrname~(@dbr~)} {follow @dbr;hit @dbr;perform sword.duo @dbr;#var pfm 1}
//见面夺兵器,注意pfm的值
#tri {可是@dbrname的看破了你的企图,立刻采取守势,使你没能夺下兵刃。} {hit @dbr;perform sword.duo @dbr}
//失败了继续夺
#tri {你使出圣火神功的夺字诀, @dbrname顿时觉得眼前一花,手腕一麻,手中兵刃脱手而出!} {killall @dbr;perform sword.yinfeng @dbr;#var pfm 2}
//夺掉了武器,阴风刀,改变pfm的值
#tri {你悄悄使出阴风刀,运起一股无形无质的阴寒之气,直插@dbrname胸口玉堂要穴!} {wa 3000;killall @dbr;perform dodge.tisha @dbr;#var pfm 3}
//继续改变pfm的值
#tri {却不敢出声,闭紧双眼运起铁屁股神功,假装是一块石头一动不动!} {#wa 3000;perform dodge.tisha}
#tri {@dbrname双目难睁,无法攻击。} {#wa 3000;perform dodge.tisha @dbr}
#tri {神目如电来去悠闲,根本没有受到影响.} {#wa 3000;perform dodge.tisha @dbr}
#tri {~( 你上一个动作还没有完成,不能施用外功。~)} {#wa 3000;#if (@pfm=1) {perform sword.duo @dbr};#if (@pfm=2) {perform sword.yinfeng @dbr};#if (@pfm=3) {perform dodge.tisha @dbr}}
//根据pfm的值的不同来发出不同的perform

B:#tri {盗 宝 人*@dbrname~(@dbr~)} {follow @dbr;hit @dbr;#var pfm "perform sword.duo";@pfm @dbr}
#tri {你使出圣火神功的夺字诀, @dbrname顿时觉得眼前一花,手腕一麻,手中兵刃脱手而出!} {killall @dbr;#var pfm "perform sword.yinfeng";@pfm @dbr}
#tri {可是@dbrname的看破了你的企图,立刻采取守势,使你没能夺下兵刃。} {hit @dbr;@pfm @dbr}
#tri {你悄悄使出阴风刀,运起一股无形无质的阴寒之气,直插@dbrname胸口玉堂要穴!} {#var pfm "perform dodge.tisha";#wa 3000;killall @dbr;@pfm @dbr}
#tri {@dbrname双目难睁,无法攻击。} {#wa 3000;@pfm @dbr}
#tri {神目如电来去悠闲,根本没有受到影响.} {#wa 3000;@pfm @dbr}
#tri {~( 你上一个动作还没有完成,不能施用外功。~)} {#wa 3000;@pfm @dbr}

可以看到方案B明显优于方案A,巧妙的运用了一个变量pfm储存要发的perform,而不是简单的赋值为一个数字,省去了#if语句,更加简洁直观。制作机器人的时候能简洁坚决不要复杂,会使你的机器人更加容易修改。
#wa 3000表示等待3秒后执行后面的命令,有关#wa命令后面会讲到。

第四章 机器人实例-吐纳机器人(本章原创)

为什么是吐纳呢,因为内力药物无CD,大家可以直接吃菩提子天香玉露。而精力方面,玉清散的CD极长并且每包只能加10精力,所以弄精力是个漫长的过程,靠吐纳+吃散会快很多。原文的打坐吐纳机器人固然强大但是非常复杂,我看着都很头晕,绝对不适合新人,所以我重写了本章,只需要简单的几个触发就可以完成吐纳机器人,如果你没有内力药物非要打坐的话,也可以参考这个机器人,其实差不多。

完整机器人如下,直接复制到zmud输入栏中回车就可以添加到机器人中,//后面是注释,不要添加到机器人里面了
#alias ea {eat gan liang}
#alias dr {drink shui dai}
#alias eg {yun regenerate}
//这三个别名是吃喝和吸气,机器人使用别名可以省输入很多文字,省时省力,其实吃喝吸气这种平时用的非常多的可以直接设置成游戏里的别名比如alias ea eat gan liang,省的每个机器人都要写这个。
#trigger {^您的英文名字} {id;password;y;tuna xx}
//这个触发是为了防止意外掉线用来重新连接的,id是你的英文名字,password是你的密码,建议养成做机器人首先做重连触发的习惯
#trigger {^你吐纳完毕,睁开双眼,站了起来。} {ea;dr;tuna xx}
//xx是你tuna的数值,这个数值自己酌情考虑,写一个时间最短的又数值最大的值,尽量做到最高效率,一般设置为自己当前精气的1/10就可以了,通过抓取变量自动计算最高效率数值的方法暂时不介绍了对新手来说比较复杂。^这个符号是行首触发,意思是屏幕上出现的文字中只有触发的内容在一行的开头才会触发,否则别人聊天时"chat 你吐纳完毕,睁开双眼,站了起来。"也会触发你的机器人,很容易出错,建议大家一定养成行首触发时加^的习惯。
#trigger {^你现在精不足,无法修行精力!} {eg;tuna xx}
//吐纳会消耗精气,精气不足xx时就会提示这个,这时你需要yun regenerate消耗内力补充精气,eg是上面设置的yun regenerate的别名
#trigger {^你的内力不够。} {sleep}
//初期内力精气都比较少的时候,可能会出现内力不够恢复精气的情况,这时可以发呆等待精气和内力恢复也可以睡一觉,因为本游戏睡觉无CD,建议大家常备睡袋,直接睡觉。
#trigger {^你一觉醒来} {tuna xx}
//触发内容不需要复制一整行,如果是你一觉醒来这种只有睡醒的描述才会出现的文字,只有一部分也可以,睡醒之后精气恢复满了内力也恢复了一半,可以继续吐纳了

至此一个最简单的吐纳机器人就完成了,只有5个触发,内力高了可以省去后面两个,精气高了第三个也可以省去,是不是非常简单

友情附赠:学习机器人
这是新手最需要的东西了,也是非常简单的机器人,比上面的吐纳机器人难不了多少

#alias ea {eat gan liang}
#alias dr {drink shui dai}
#alias eg {yun regenerate}
#alias ec {yun recover}
#alias xx xue @master @sk 300
//定义一个xx别名,然后打xx就等于xue @master @sk 300,@是引用变量,master是师傅id,sk是你要学的技能的id
#alias begin get all from xuexi   
//用begin代替get all from xuexi,输入begin会提示你找不到xuexi这样东西,这个是用来作为连续学习的触发,没有实际意义,用别的方法也可以
#trigger {^您的英文名字} {id;password;y;begin}
#trigger {^你找不到 xuexi 这样东西。} {xx;#wa 500;begin}
//收到这个触发就执行xx,然后等0.5秒get all from xuexi,这是初期才会使用的触发,效率最低,如果有了十兵,可以同时学习,研究,练习,汲取,充分利用时间,"xx;yanjiu @sk2 200;lian @sk3 200;eg;ec;jiqu;#wa 500;halt;begin",没有十兵的话这样比较困难,特别是练习消耗的内力太多
#trigger {^然而你今天太累了,无法再进行任何学习了。} {ea;dr;sleep}
//内力用完了怎么办?睡觉,当然有十兵的同学可以直接touch你的十兵来回满内力,那就把sleep改成touch
#trigger {^你一觉醒来} {begin}
//睡醒继续,十兵无视

OK一个简单的学习机器人就是这样了,输入master=你师父的id,sk=你要学的技能,然后输入begin开始,研究机器人可以参考以上修改,没多少差别

月满西楼 发表于 2012-6-27 23:53:40

看不到啊1111

xxxyo 发表于 2013-11-3 17:37:50

师兄,能写的在简单点不!不能领悟啊
页: [1]
查看完整版本: 新手zmud462机器人速成宝典(初级篇)