经过前面四篇文章的讨论,我们已经得到了一个可以用的自动解迷机器人,
它包含了一个容纳所有任务的数据库,以及一个用来处理当前任务选择的数据库,
可以实现自动选择当前任务,自动完成解迷任务的功能。当然还是比较粗糙的,
在运行过程中我们可能会遇到许多非理想状况,干扰机器人的运作,
另外,注意一些细节也可以提高效率。
首先我们注意解迷的等待问题,因为用机器人解迷,动作要比手动迅速的多,
所以从接迷到完成通常只要很短的时间,就需要等待,虽然这段时间一般只有1、2分钟,
但累积起来也不是一个小数目,所以我们要采取的策略是在每完成
一个谜之后立即询问该类型的任务。比如做猪八戒的食物,
把食物给猪以后,去皇宫领赏,然后再ask zhu about food。
由于选择的任务的一般趋势是各种类型任务轮流完成,所以在你完成其他任务的时候,也度过了等待的时间。在我的解谜机器人里是这样实现的:
设定七个alias分别对应七种任务如askzhu, askchen, askyin等等,
在完成任务的时候有七句
触发如:
#trigger {^???猪八戒对你说道:多谢*} {type=zhu}
然后从皇宫领赏出来,执行alias ask@type就可以询问相
应的任务了。
其次,对于非固定位置的任务,比如送物,灭妖的NPC,要有自动寻找的手段。
这个利用路径是很合适的,例如:得到任务送物:街头小商人--黄金,
我们从数据库中得到方位在宝象,定义一个alias search如下:
#alias search
{
#untrigger {@findname};
findname=%-1;
#tr {@findname}
{#cw red;find=1;#untrigger {@findname}}
}
使用search @yin(yin这个变量的内容就是“街头小商人”)
就生成了一个触发,当#slow .baoxiang沿路径行走的时候,
遇到街头小商人就自动停下来,配合自动给物品的trigger就完成了这个任务。
另外,一个特定任务可能有多个选择方案,在手动解迷过程里,
如果遇到可以在多处完成的任务,我们可以自由选择,
即使一个地方没有,还可以去其他地方尝试。为了模拟手动解迷以提高任务的完成率,
我们也可以加入完成任务的多种方法。因为todo字段是一个memo变量,
我们可以输入很多内容。所以我们增加一个字段,类型为整数,
记录todo中的方法数量,然后依次执行。具体如何实现,请大家思考。
除这些以外,我们还有很多细节要考虑,比如PK(//grin),
比如小小怪的拦路,再比如@#%&^@*$#。这些问题就仁者见仁,智者见智了,
需要技术与经验的结合。不过我的原则是安全稳定第一,
处理问题的方法要简单,这个原则放在机器人制作具体的讲就是宁用alias,
少用trigger。这样说可能有失偏颇,但alias的执行是可以不考虑网速的,
而trigger往往受网速的限制。上次看到一个捡舍利子的机器人,
几乎所有动作都用trigger触发,有些明明可以
用一个alias解决的,也被拆分成了好几句trigger,害处就是第一容易被破坏,
第二机器负担太重,判断触发是相当占用时间的(当然如果你已经用上P4了,当我没说过)。
随着Zmud日益功能强大,我们可以实现的机器人也会越来越多,也会越来越完美。
目前我最看好的是automap,这个功能其实在Zmud 4.62里就有了,
automap结合trigger(其实也是一种形式的数据库结合trigger,因为
automap实际上是一个储存房间记录的数据库)应该会非常强大的。
但我看了很多介绍文章,也从zuggsoft 的网站上下载了资料,就是没有办法搞定,
没有办法正常做语法分析,区别一个房间的名字、描述与出口,
另外绘制地图的时候提供的方向也少了点,只有普通的south,north,southeast,up,down之类。不知道有哪位已经搞定automap
的,希望指点一下。