找回密码
 注册
搜索
查看: 2383|回复: 15

如何利用数据库制作全自动解谜机器人(转)

[复制链接]
门派:不明
发表于 2009-11-10 22:28:25 | 显示全部楼层 |阅读模式
作者:八级风(转自:西游奇旅)


第一章 制作全自动解谜机器人的途径

在XYJ里,如何快速增长道行,是一个困扰许多玩家的大问题,
PK、NK、打花、解谜……PK要甘冒天下之大不韪;NK到了后期很难找到合适的NPC对象;
打花的确是个好方法,我曾经8小时打了430多年,不过很多站点被cut了,
。只有解迷,成了一个最可靠的方法。无论去哪个站点,
只要能熟练掌握解谜方法和技巧,都能较快的成长。
然而,解谜的繁琐和辛苦程度令很多玩家望而却步。解谜手册的熟记,
解谜物品的准备,问谜,解谜,清谜,再问谜,再解谜,精神 高度集中,
键盘敲个不停,就象一只陀螺,疲惫地转个不休。一个全自动的解谜机器人,
无疑是所有痴迷XYJ的玩家的梦想。把解谜变成一件轻松的事情,
留下更多时间享受聊天乐趣,让全自动机器人的梦想成真,就是这篇文章的目的。

据我了解与尝试,在现有的条件下,制作全自动解谜机器人大致
可以走以下几条路:
1、把所有任务列入Trigger中,根据问谜的结果触发,完成解谜任务;
2、利用Zmud本身提供的DDE(Dynamic Data Exchange,动态数据交换)
函数来开发一个外部程序,通过外部程序来控制Zmud的运行,实现自动解谜功能;
3、利用Zmud V5.55及其更高版本提供的Zmudapi.dll来开发一个控制Zmud运行的外部程序。
4、利用Zmud V5.x及其更高版本提供的数据库模块构建解谜数据库,配合Trigger来控制解谜。

下面我们来分析一下各种方法的利弊与可行性。
1、现有的很多所谓自动解谜机器人就是这种类型的。有些是专门做
一种解谜任务的,有些更全一点,最好的好象可以做四种任务。
说到底,这样的机器人不过是简单的触发堆积,Trigger庞大的要命,把机器拖的半死,
完成解谜任务又相当刻板,对于XYJ2000的解谜系统根本不适合的。我认为,
这样的Trigger只能拿来给新手做解谜的辅助与提示,没有更大的实际意义。
2、DDE的支持从Zmud很早的版本就开始了,当然DDE本身也是个老古董了。
对于大家常用的4.62版本来说,是除了方法1之外的唯一途径了。
当年浙大西游记的郭大路(henry)曾经用Delphi开发了一个自动解谜的外部控制程序的雏形。
他之所以选用Delphi开发,理由是:
Zmud是用delphi编写的,所以用Delphi最好,VC太复杂,VB的DDE控件不行,
只有Delphi的DDE控件与它联系起来最方便。
雏形出世的时候我还没有开始玩XYJ,同时这个雏形也没有引起太多人的注意。
所以henry的计划随着他去清华读博夭折了。
用DDE开发自动解谜机器人,无疑比方法1迈进了很大一步,
但是,在开发上的难度是相当大的。
3、从Zmud V5.55开始,ZuggSoft公司提供了一个叫Zmudapi.dll的动态链接库。
这个DLL本来是提供给Zmud用户来开发各种插件(Plugin)的。
我在连到ZuggSoft站点下载Zmud 5.55的时候注意到了它的介绍。
(在Zmud 5.55中还附带了Zmudapi.hlp,这个帮助文件简单介绍了该
DLL的功能与用途。在更高版本里不提供这个帮助文件。)
它提供了对Zmud的命令控制、数据传送(单向)以及**一些功能的函数。
当时我就决定通过调用这个DLL来替代DDE实现外部控制程序,
可惜,我用VC无论如何也无法正常调用DLL提供的函数。这也促使我转向寻找**方法。
不过,会用Delphi的朋友可以去试一下,Zuggsoft是推荐用Delphi开发的。
4、我的目光焦点是最后转向这个方法的。从Zmud 5.x开始,提供数据库功能,
而这个数据库对于庞大的解谜系统无疑是十分适合的。
解谜的任务如果不包括玩家送物和玩家拜贤,数目接近2000个,用现成的数
据库来处理要比自己编写专门的数据处理程序要便捷的多,处理速度上也有优势。
虽然Zmud提供的数据库功能并不强大,但对于我们编写自动解谜数据库而言足矣,

控制解谜的**部分可以用少量的Trigger来实现。

在多次尝试之后,我最终选择了第四种方法。在下一章,我会从开发
解谜机器人的实际过程开始,按我所经历的实践思路跟大家探讨:

第二章 建立解谜数据库

建立解谜数据库的最主要目的是,提供迅速快捷的解谜信息的查询。
另外,还可以利用数据库排序、选择的基本操作,来实现自动选择执行任务的功能,
这点我会在下一章里详细说明。
下面就开始搭建全自动解谜系统的基石——解谜数据库。
在Zmud 5.x和6.x版本中,工具栏里有个DB按钮,通过它进入Zmud的数据库模块。
根据上面列出的两个目的,我建立了两个数据库:一个是静态的数据库Record.db,
一个是动态的数据库Quest.db。
Record.db用来保存所有的解谜任务,里面的内容只能通过数据库的数据管理来做修改,
在自动解谜系统工作的时候,它的内容是不会发生变化的;
Quest.db用来记录当前的解谜任务,总共七条记录,
它的内容随着解谜的进行不断更新,
并且通过建立Quest.db的视图按条件选取下一个该执行的任务。
两个数据库的构造如下:
Record.db
这个数据库的记录有6个字段(Field):
Type(任务类型,该字段为Single Option类型,字段的值为
食物、送物、拜贤、灭妖、武器、盔甲、募捐之一。)
Name (任务名称, 字段类型Text)
Ename(任务英文名称, 字段类型Text)
Extra(任务附加选项, 字段类型Text)
Place(任务地点, 字段类型Text)
Todo (执行该任务的命令, 字段类型Memo)

Type字段将任务的类型加以区分,对应七种不同的任务种类;
Name和Ename字段在不同任务中分别对应食物、武器、盔甲、募捐的物品和送物、
拜贤的人物的中文名及英文名;Extra字段在送物中对应所送物品名称,
在拜贤中对应所询问事宜;Place字段记录任务中人物或物品所在地点;
最后一个Todo字段是最重要的,记录了执行该任务的命令操作。举例如下:

Type Name Ename Extra Place Todo
拜贤 大和尚 he shang 佛学 车迟/金平府/乌鸡 略

在实际操作中,Place字段是可以省略的,但考虑到对新手具有提示作用,把该字段保留了。
建好了Record.db的框架,我们可以把记录向里面添加进去了。
如果用手动一个个填写添加,不但容易出错、遗漏,而且工作量大的惊人。
幸好Zmud的数据库对记录的输入提供了Import的功能,可以直接从文件中读入。
Import可以从两种文件读入记录,一种是普通的txt文件,这种txt文件每行为一个记录,
不同字段用Tab隔开;另一种是csv文件,用逗号(comma)来间隔字段。
实际上,这两种文件的区别只在于间隔 符号的不同,我们无须刻意选择,
因为在Import的时候,可以向Zmud指定说明间隔符号的类型。
为减少工作量,我以源码中的任务列表(/d/kaifeng/npc/quest_*.c)
为基础,把其中无用及重复的任务剔除掉,进行整理补充,将所有记录保存在QuestDB.txt中。
然后将这个txt文件Import到数据库中。在选择完Import文件之后,Zmud将弹出一个对话框,
把各个字段及其相应记录显示在一个预览表格里,如果正确,将自动把文件里的
每个记录添加到Record.db中去。这一步是相当便捷的,
也使我的热情没被添加记录的繁琐给磨灭。
建立完成之后,Record.db里总计有大约1800条记录。

Quest.db
我在这个数据库中新建了四个域(Field),其名称与类型分别如下:
Type (任务的类型, 字段类型Single Option)
Name (任务的名称, 字段类型Text)
Cloud(是否有云, 字段类型Boolean)
NotDo(多久未完成该项任务, 字段类型number)
Type、Name的作用与Record.db中的Type、Name一样;Cloud字段是个布尔量,非零即一,
记录对应此任务的云是否存在;NotDo字段记录此任务有多久未做。
门派:不明
 楼主| 发表于 2009-11-10 22:28:48 | 显示全部楼层
我们知道,食物、送物、拜贤、灭妖、武器、盔甲、募捐七种任
务对应的云彩分别为红、青、绿、黄、蓝、粉、白。输?quot;Quest"命令
查看当前任务的时候,可以知道身上有哪几朵彩云。我们可以利用函
数%pos(para1,para2)来得到Cloud字段的值。例如:
“慢慢地一小团红白两色祥云在你的身边升起。”
我们就得到一个Colorlist=“红白”,%pos(红,@colorlist)可
以返回“红”这个字在字符串“红白”中的位置,如果不存在则返回值为零。
因为Cloud字段为布尔量,如果需要查找的字存在于字符串中,则返回值非零,
赋给Cloud就为一;反之则为零。利用这个方法
我们可以得知哪些任务有相应的云彩存在,哪些没有,为选择任务打 好基础。

建好了这两个数据库,我们可以开始构建上层建筑了。后面,我们继续讨论:


第三章 任务选择机制的实现

为了实现自动解谜,我们首先考虑机器人的工作流程。
我们可以知道,选择这一环节至关重要,它就是整个自动解谜系统的大脑。
下面我们来初步实现选择这一功能。
首先,这个流程需要一个起点,在图中“问谜”这一步引起了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。
门派:不明
发表于 2009-11-11 20:19:08 | 显示全部楼层
什么玩意啊,完全看不懂
门派:不明
发表于 2009-11-12 12:57:19 | 显示全部楼层
高手,爽,
如果10年前,肯定会好好研究下,现在不行了,没精力,没时间
lqz@ts 该用户已被删除
发表于 2009-11-19 15:37:06 | 显示全部楼层
不明白..XYJ 是什么 quest ? 还有道行一说?
门派:不明
发表于 2009-11-19 16:08:37 | 显示全部楼层
眼晕
门派:不明
发表于 2009-11-19 16:10:29 | 显示全部楼层
这转帖的太没技术含量了
门派:不明
发表于 2009-11-19 17:00:11 | 显示全部楼层
zmud已经out了...数据库不尽如人意。
现在真正的高手都在使mush,比如官方站的那帮流氓。
门派:不明
发表于 2009-11-20 08:03:06 | 显示全部楼层
都是高手!................................................
门派:不明
发表于 2009-11-24 10:50:04 | 显示全部楼层
高手啊。俺看了半天还是不明白!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|书剑永恒MUD ( 闽ICP备14012032号|闽公网安备 35050202000162号 )

GMT+8, 2025-10-9 05:23 , Processed in 0.027230 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表