本帖最后由 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就退出战斗,否则继续战斗。 |