为了实现自动解谜,我们首先考虑机器人的工作流程。
我们可以知道,选择这一环节至关重要,它就是整个自动解谜系统的大脑。
下面我们来初步实现选择这一功能。
首先,这个流程需要一个起点,在图中“问谜”这一步引起了Quest.db的更新,
从而引发后续的整个过程,相应地,我们从游戏里也要找到这个起点。
我选择的是命令"quests"。
当下命令quests后,会显示当前需要完成的七项任务。我们通过Trigger来获取这些任务,
并将数据传送到Quest.db中。数据库中有个命令#LoadDB,这个命令用于加载一个数据库。
如果这个数据库还没有加载到内存,就从文件中读取并加载;如果这个数据库已经被加载了,
就将它作为当前的数据库激活,那么后面的数据库操作都是在这个数据库中执行。
我们用#LoadDB
命令把当前的数据库置为Quest.db,然后输入"quests"指令。接下去,
下面的Trigger会自动更新数据库内容。
#TR {^????食物:(%x)}
{food=%1;0.Name=@food;0.Nodo=@red}
#TR {^????送物:(%x) (%x)}
{yin=%1;thing=%2;1.Name=@yin;1.Nodo=@cyan}
#TR {^????拜贤:(%x)}
{baixian=%1;2.Name=%1;2.Nodo=@green}
#TR {^????灭妖:(%x)}
{hu=%1;3.Name=@hu;3.Nodo=@yellow}
#TR {^????武器:(%x)}
{weapon=%1;4.Name=@weapon;4.Nodo=@blue}
#TR {^????盔甲:(%x)}
{armor=%1;5.Name=@armor;5.Nodo=@pink}
#TR {^????募捐:(%x)}
{lan=%1;6.Name=@lan;6.Nodo=@white}
其中诸如0.Name之类的变量代表数据库中编号为0的记录的Name字段。
而red、cyan、green等变量是我在Trigger里用来对某个任务未完成次数记数的,
每完成一个任务,对应的任务的记数置成零,其他任务记数加一。
那么,这个数字越大的,就代表越久没有完成。
然后,根据判断Cloud字段的值。
#TR {^????你的身上徐徐飘浮起一小团(%x)祥云。}
{colorlist=%1;
0.Cloud=%pos( 红, @colorlist);
1.Cloud=%pos( 青, @colorlist);
2.Cloud=%pos( 绿, @colorlist);
3.Cloud=%pos( 黄, @colorlist);
4.Cloud=%pos( 蓝, @colorlist);
5.Cloud=%pos( 粉, @colorlist);
6.Cloud=%pos( 白, @colorlist)
}
#TR {^????慢慢地一小团(%x)色祥云在你的身边升起。}
{colorlist=%1;
0.Cloud=%pos( 红, @colorlist);
1.Cloud=%pos( 青, @colorlist);
2.Cloud=%pos( 绿, @colorlist);
3.Cloud=%pos( 黄, @colorlist);
4.Cloud=%pos( 蓝, @colorlist);
5.Cloud=%pos( 粉, @colorlist);
6.Cloud=%pos( 白, @colorlist)
}
这个时候,Quest.db的数据已经全部被更新,我们可以通过下面的方法来选择任务:
1、在数据库Quest.db中建立一张视图,取名为order。order视图按照{Cloud|Nodo}排序,
也就是排序优先级先Cloud,再Nodo。
2、下命令#View,将在Zmud中显示这张视图,排在第一行的就是我们所选取要执行的命令。
3、用Trigger得到该命令。
图例如下
#View order {Cloud|Nodo}
#View
0 食物 鹫肉 - 20
2 拜贤 王孙 - 5
1 送物 孙三叔 - 4
6 募捐 雕木斜靠椅 - 3
5 盔甲 王八甲 - 1
3 灭妖 笑波儿天 - 0
4 武器 月牙弯刀 X 2
(显示"-"代表没有云彩,"X"代表有云彩)
然后,我取得下面要做的任务名为“鹫肉”,将当前数据库切换为Record.db,
用#Query命令对该任务进行查询,获得应该执行的命令。
(关于查询请参考帮助文件,这里不作赘述。)
这样,一个简单的自动解谜机器人的框架搭好了。
但是这样的模型离投入使用的成品还相差太远,需要我们一步步加以优化和调整。
最重要的还是提高“选择”的正确性,因为任务的选择直接关系到奖励的高低即Trigger的效率。