背景:
阅读文章

zmud实战

[日期:2007-05-13] 来源:  作者: [字体: ]

2.实战--robot实例讲解。

  做机器人的步骤可以分如下几步:

  (1)分析动作;

  (2)定义别名(Alias);

  (3)定义变量(Variable);

  (4)定义动作(Trigger);

  (5)定义按钮(Button);

  (6)测试

下面我将结合实例讲解一下robot的制作过程。

  由于前人已有的机器人的例子太多了,在选择例子 时,很难跟别人不同,我只是选择一些常用的例子, 我的目的只是针对新手。

  2.1 自动应答。

  robot的最大特点是可以根据发生的事件自动作出 相应的动作。如果有人狠狠地踢了你一脚,你会有 什么反应?狠狠地回踢一脚?哇哇叫痛?可怜巴 巴地哀求?还是满不在乎地自嘲?... 下面的这 个例子就是针对这种情况而做的,其实对于尚武 一族来说,这个robot毫无价值,而对聊天族可 能是有力的工具。

  如果有人,比如小鬼对你做 了这个动作:小鬼对你说:来了,欢迎! 如果你知道是小鬼在跟你说话,那么你可以直接用: 你说道:谢谢你,小鬼! 可是如果要做一个机器人,自动应答,怎样获知 对方是谁呢?等等,有一个问题必须首先说明一 下!一个玩家在西游记里有两个名字:一个英文 名字,一个中文名字。在做动作时,动作的对象 是英文名字,所以你要针对某个人物做出动作, 必须获得对方的英文名字(id),比如 chat* hammer xxx,tell xxx ... ,give xxx sth 等等。在屏幕上显示的玩家名字是中文的,英文名字 只是用于命令中。

  在这个例子中,我们只是跟对方说 话,所以,我们可以在say 的内容中写上对方的中文 名字,而不用semote做动作,这样我们只需知道对方 的中文名字就足够了。 怎样获得对方的中文名字呢?我们可以利用Trigger 和variable(变量)来实现,利用Trigger 通配符匹 配的特点我们可以将屏幕上显示的我们需要的字符放 到系统的变量中(从%1到%8),从而更进一步将我们 从屏幕上匹配到的值(%1--%8,最多一次可以获得8 个)送到我们定义的变量中,就完成了从屏幕上抓取 信息的目的。

  如下:

1. 定义变量 我们要取得对方的中文名字,所以要定义一个变量存 放这个中文名字。为此按照第一节中介绍的方法,打 开变量定义窗口,点击new 按钮准备定义一个新变量, 依次添入: Varliable: name Value : 空 Default : 空 这样我们就定义了一个名叫name的变量,我们没有给 它赋值,也没有指定它的缺省值。

2. 定义Trigger--yingda1 按照第一节中介绍的方法,打开定义Trigger的窗口。 点击new按钮,依次添入: Class yingda1 定义类别yingda1 Pattern (%x)对你说:来了,欢迎! 获取对方的中文名字 Command name=%1;say 谢谢你,@name!   (%x)的作用是将屏幕上这个位置的字符送给系统预留 的变量%1,Command中语句name=%1的意思是将从屏幕 上获得的字符(%x)的值送给变量name,此例中所获 得的字符就是对方的中文名字。@name 的含义是取出 name的值,注意:引用变量的方法是在变量名的前面 加一个“@”。这里“@name” 代表的就是“%x”所 取得的值。这个robot非常简单,相信即使是初学者 也不会觉得难于理解。

3. 补充--修正一个小bug。 这儿还有一个小问题,有时屏幕上在一行的开头会 有一个“<”,这样当我们用(%x)抓取信息时,会把 这个“<”一起抓下来,结果会变成这个样子: 你说道:谢谢你,<小鬼! 名字的前面多了一个“<”,这真是讨厌!不过你还 记得上一节中提到的“~”吗?在(%x)前面加上“~<” 就会把这个讨厌的符号忽略掉,这样上面的Pattern 可以改成: ~<(%x)对你说:来了,欢迎! 这个例子可以再做一下延伸。

  如果你想用Tell来跟对方交流,那么你就需要对方 的英文id了。

  怎样获得对方的英文id呢?有一个好 用的命令“id”,不知你用过没有?如果你只键入 “id”,不带参数,那么这个命令将显示你所带物 品的英文id名称;如果你使用“ id here”,那么 将显示出所在房间的所有物品和人物的英文id,如 下的样子:

  id here

在这个房间中, 生物及物品的(英文)名称如下 :

猫头鹰 = catbird
米雪儿 = mixuer
小鬼 = zhuang
南城客栈留言板 = board
千里眼 = bigeye, youchai, chai
店小二 = xiao er, xiaoer, xiao, waiter, er

  我们可以利用这条命令得到对方的英文id。比如 取得小鬼的英文id,可以这样在Trigger中添入: Pattern 小鬼(%s)=(%x) 将空格(%s)送给%1,%x送给%2。 Command id_name=%2 将%x抓取的值(实际就是zhuang)送给id_name 这样上例的trigger可改为: pattern ~<(%x)对你说:来了,欢迎! Command name=%1;id here 再加一个trigger: Pattern (@name)(%s)=(%x) Command id_name=%3;tell @id_name 谢谢你,@name! 还要再定义一个变量(Variable): id_name来存 放对方的英文id。

  到此为止,你已经完成了第一个 机器人的制作,这个机器人虽然简单,却反应了制 作机器人的基本方法。

  2.2 练功 为了节省潜能,我们有时通过Practice来提高自己的 特殊外功。象这种操作,大多是一些重复劳动,所以 如果做一个机器人来自动练功,既减少了我们的操作, 又能提高速度,那真是一件美妙的事!

  我们先分析一下练特殊外功的基本操作:

  一是:practice parry;

  二是:exert recover(气血不够时用以恢复)

  三是:exercise xxx(内力不够时练气);

  四是:cast transfer(将法力转换为内力);

  五是:meditate (法力不够时冥思);

  六是:sleep(精神或法力不够时睡觉)

  练特殊外功消耗的是气血值,补充气血的方法是 exert recover,而exert recover消耗的是内力值, 恢复内力的方法是exercise 或者cast transfer。

  理顺了这些关系,我们就可以定义动作了。

(1)首先,我们定义一些别名来替代长的命令。 打开定义别名的窗口,依次添入: Alias name Command 解释 11 exert recover 恢复气血 22 exert refresh 恢复精神 zq cast transfer 用法力补充内力 dz exercise 打坐练内力 ms meditate 冥思以练法力 pp practice parry 练特殊外功 pp1 #20 pp;11;dz 300 练特殊外功 pp1这个别名的意思是练20次的外功,然后恢复气 血,然后用300点的气血值打坐练外功。 这里的 20和300只是一个假定的数量,在使用中要根据 个人情况加以调整。 (2)定义trigger。 上面的pp1中最后一个动作是打坐,我们的trigger 可以从这儿开始。

Pattern: 你行功完毕,吸一口气,缓缓站了起来。
Command: #wa 2000;11;pp1

  由于某些动作之间有一定的时间延迟,所以在打坐 完毕,我们用#wa 2000命令延迟2秒钟进行下一动作, #wa命令中参数的单位是微秒。如果你的内功足够强 已进入正循环,那么只需键入pp1 即可实现自动循环 练功的目的(如果你不知道什么叫正循环,可以到 这儿看看)。

  如果你还没有达到正循环,那么你的 内力和法力在这个过程中会逐渐消耗殆尽,从而这个 循环就会终止。 由于我们消耗的是气血,所以我们可以从精神上入 手,如果能让精神不断转化为法力,让法力转化为 内力,再让内力转化为气血。这样就能保证我们所 需的气血取之不尽,那么练功的动作就会持续下去 了。

  所以我们将上一步的trigger修改为:

Pattern: 你行功完毕,吸一口气,缓缓站了起来。
Command: #wa 2000;11;22;ms 400

  因为冥思要求气血和精神不能太低,所以我们要同 时恢复气血和精神。这儿的400同样是一个假定值, 你最好把这个值调的大一点。然后再添加如下的 Trigger:

pattern: 你冥想完毕,睁开眼睛定了定神,站了起来。
Command: #wa 2000;zq;11;pp1

  可是当我们将精神转化为法力,内力,气血后,下 一次冥思可能会导致“你现在精神太差了,进行冥 思将会迷失,永远醒不过来!”,我们再添加两个 Trigger

Pattern: 你现在精神太差了,进行冥思将会迷失,永远醒不过来!
Command: sleep
Pattern: 你一觉醒来,只觉精力充沛。该活动一下了。
Command: ms 400

  这儿有一个问题,一般睡觉的地方是不允许练功的, 所以在sleep 之前要加上到睡觉地方的路径;而醒来 之后要加上回去的路径。在冥思之前也可能出现“你 现在身体状况太差了,无法集中精神!”,同样我们 用睡觉的方法来解决。

Pattern: 你现在身体状况太差了,无法集中精神!
Command: sleep

  还有一个问题,就是在睡觉时有可能会进入红楼梦里, 怎么办?再加两个Trigger:

Pattern: 荡悠悠三更梦
Command: u;#5 n;u;ask girl about 回去
Pattern: 你揉揉眼睛清醒了过来
Command: ms 400

  这个机器人还可以作出很多延伸,比如加上吃、喝 的动作或者存盘的动作,如果又出现新的情况,也 可以再添加Trigger ,不过如果你花在练功上的 时间远远少于睡觉,打坐,冥思的时间,那么我 劝你把内力,法力练练再用这个机器人吧。

  (3)最后有个有用的工作,就是设置一个按钮 (Button)。在这之前,你必须把上面的所有Triggers 归到一个类中,给这个类命一个名,比如:practice。

  选择Actions->Make button菜单,如下填写: Toggle 选定 Off caption: off practice On caption : on practice On command : #t+ practice;pp1 Off command: #t- practice

  这样,在屏幕上会出现一个控制按钮(默认的位置在 窗口的左上角)。

  当我们按下这个按钮时,机器人就 将工作;再按一下,停止工作。是不是特方便呀? *face

  2.3 战斗中的学习  

  西游记中通过战斗得到的潜能最高只能是100,到了 100就必须到师傅那儿去学习,然后再回来继续战斗, 如果用手工的方法操作这个过程,简直不敢想象会 多么麻烦!幸亏有了Zmud,有了robot,这个问题 不再复杂了。怎样从屏幕上获取潜能的数值呢? 我们用“hp”这个命令可以显示出如下的结果:

气血: xxx / xxx (xxx%)  内力: xxx / xxx (xxx%)
精神: xxx / xxx (xxx%)  法力: xxx / xxx (xxx%)
食物: xxx / xxx     潜能: dd
饮水: xxx / xxx     道行:xxxxxx

  这样我们可以定义一个变量qn存放潜能的数值。然后定 义如下的Trigger:

Pattern: 潜能:(%s)(%d)
Command: qn=%2

  就这么简单,每次我们键入命令“hp”后,我们就会获 得潜能的值,并把它放在变量qn中。

  然后我们可以判断 这个值的大小,从而采取行动。比如:

pattern: 潜能:(%s)(%d)
Command: qn=%2;#if (%2>90) {gomaster;say study}
Pattern: 你说道:study
Command: #if (@qn<5) {#wait 3000;gofight} {learn xxx from xi for xxx;#wa xxx;11;hp;#wait 1000;study} (这条命令还可以写的灵活一点)

  这样,当潜能大于90时,就会到师傅那儿去学习 (gomaster是到师傅那儿的路径);学的时候也 在判断潜能,如果少于5,那么就回去继续战斗 (gofight是回去战斗的路径),否则就继续学。 你需要首先定义两个别名gomaster和gofight。 同样为了方便操作,这个机器人也要设定一个按 钮(button),方法跟上例基本一样,我就偷一 下懒了,留给你们自己完成去吧!

  好了,这一章的内容到此为止了,咱们下一章见! 顺便透露一下,下一章的内容为:zmud高级应用 其实,看完这一章,相信即使你是从来没有接触 过Zmud的新手,也应该会自己制作机器人了,再 加上你的聪明才智还会发掘出许多Zmud应用的技巧。 *addoil! good luck with u!不过不看高级应用是 成不了高手的。:) *face
 
 尊重作者 转载请注明出处52mud.com

收藏 推荐 打印 | 录入:sbso | 阅读:
相关内容       zmud 
本文评论   [发表评论]   全部评论 (0)
内容推送
52mud提供
一起回忆泥巴游戏QQ群68186072
52mud官方微信公众平台
热门评论