本帖最后由 kaop 于 2010-11-15 12:29 编辑  
 
评价一个机器人的优劣主要是从复杂程度、功能、是否安全(安全主要是避免有些恶意玩家通过触发你的机器人而将你致晕致死)、是否适合多种情况来综合评价的。通过实际应用我们可能发现,上面的机器人还存在很多问题: 
 
1、打坐吐纳时间过长,可能因为食物和水的消耗而不能自然恢复精气,造成停止打坐。 
 
2、随着年龄的增长精气随之增加,而造成不能触发机器人而失效。 
 
3、因为其它原因而导致的失败,如日月神教使者的袭击等。 
 
对于每一个出现的问题我们都需要采取不同的对策,对机器人进行改造完善,以达到尽善尽美的程度。 
 
第一个问题解决起来很简单,只需要加一个自动进食的机器人即可。(事先须买好食物和水) 
 
______________________________________________________________________ 
 
class: pattern: commands: 
 
---------------------------------------------------------------------- 
 
dztu 你的精力增加了 halt;drink shui dai;eat gan liang 
 
______________________________________________________________________ 
 
第二个问题可以在每次精气数值变化后手动修改,但这种解决方案似乎违背了制作机器人全自动化的初衷。实际上除此之外还是有解决方法的。我们通过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 shui dai;eat gan liang 
______________________________________________________________________ 
 
比较一下两个机器人的不同,我们发现在这个机器人中出现了几个不同的符号:%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就退出战斗,否则继续战斗。 |