北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 23483|回复: 22

灵鹫扫雪机器人[附机器人知识基础讲解]

[复制链接]
发表于 2008-5-3 02:11:42 | 显示全部楼层 |阅读模式
想了想还是发上来,算是为丰富新人们的门派选择做点贡献。

使用方法:

问石嫂要任务可触发

扫雪有BUSY,所以设置了BUSY时间自动练功。具体设置方法请自行分析代码。

先导入这个,这是所有状态数值提取的触发器:
  1. #CLASS {Status} {enable}
  2. #VAR exp {0}
  3. #VAR jingli {0}
  4. #VAR jingshen {0}
  5. #VAR neili {0}
  6. #VAR pot {0}
  7. #VAR qixue {0}
  8. #VAR jingli_max {0}
  9. #VAR jingshen_max {0}
  10. #VAR neili_max {0}
  11. #VAR qixue_max {0}
  12. #VAR qixue_health {0}
  13. #VAR jingshen_health {0}

  14. #TRIGGER {【%s潜能%s】%s(%d)} {#var pot %1}
  15. #TRIGGER {【%s经验%s】%s(%d)} {#var exp %1}
  16. #TRIGGER {【%s精神%s】%s(%d)%s/%s(%d)%s~[(*)~%~]%s【%s精力%s】%s(%d)%s/%s(%d)} {
  17.   #var jingshen %1
  18.   #var jingshen_max %2
  19.   #var jingshen_health %3
  20.   #var jingli %4
  21.   #var jingli_max %5
  22.   }
  23. #TRIGGER {【%s气血%s】%s(%d)%s/%s(%d)%s~[(*)~%~]%s【%s内力%s】%s(%d)%s/%s(%d)} {
  24.   #var qixue %1
  25.   #var qixue_max %2
  26.   #var qixue_health %3
  27.   #var neili %4
  28.   #var neili_max %5
  29.   }
  30. #CLASS 0
复制代码


这个机器人是两三天前写的,因为最近几天我自己的机器人更新很快,所以导出的时候没有注意只导出了TRIGGER,ALIAS都被删掉了,是我后补上的,我手头没有可以做扫雪任务的大米了,可能会有点小问题。如果哪位大侠手头有不用的10K经验女大米借我来完善一下这个机器人供新人们使用就再感激不过了。

我把这个机器人放上来,不仅希望能帮助灵鹫增加一点人气,更主要的是希望通过分析这个机器人能够帮助对机器人不熟悉的新人多掌握一点ZMUD机器人的技巧。也希望大家不要下走用过就算了,仔细研究一下这个机器人是怎么工作的。

以下是讲解:

这个机器人代码不多,只有几十行,但是涉及了一个比较高级的技巧就是动态路径。这里我是通过动态TRIGGER来实现的,也就是说根据NPC说话的不同会产生不同的TRIGGER,实际上短短三天之后回过来看这个机器人被我写复杂了,使用动态别名来实现代码会简洁许多,不过也罢,就用这个机器人来讲解一下动态TRGGIER好了。

首先注意一下#T+与#T-这两个命令,前者是用来enable一个TRIGGER的,后者则相反。这个机器人里"百丈涧"这个TRIGGER被反复地使能(即enable,命令为#T+)和禁止(即disable,命令为#T+)。这么做的主要原因是当扫雪地点在山下时,我们需要通过"百丈涧"这个地方来回各一次,如果这个TRIGGER始终有效的话,那么当扫雪完返回的时候就会产生我们所不需要的移动命令,并且很可能导致机器人跑死。所以在每个循环中,"百丈涧"在下山前被使能,在扫雪开始时被禁止。

然后是真正的动态路径的实现。上面我说了,其实实现动态路径有两种方法,动态TRIGGER和动态ALIAS。前者是用#TR命令,后者用#ALIAS命令。两者本质是一样的,就是分别在机器人运行过程中修改机器人对于同一条触发的反应。在这个机器人里反映为对石嫂说话中不同的扫雪目标地点,机器人会触发器执行的命令。另外由于这个机器人中被修改的部分始终局限于移动路径,所以用动态ALIAS来实现的话更为简洁,只要把TRIGGER中需要变化的部分用ALIAS代替,然后动态修改ALIAS的内容即可。

最后提一下模糊匹配以及数据提取。我刚来北侠的时候(其实也就是一个多星期前),只知道怎么用完全匹配的文字做触发器,不知道怎么用通配符模糊匹配,更不知道怎么从文字中提取数据。后来从置顶的PATH包中看到了提取状态数据的触发器,一下子恍然大悟,又去看了几篇教程,终于搞明白了。这个机器人里抓取石嫂说话的TRIGGER里就用到了模糊匹配和抓取文字。下面是一段转载过来的教程,基本包含了上面所说的所有知识。红色部分是我加的注解

定义一个触发器,你可以使用#TRIGGER (或#ACTION),格式是:

#TRIGGER {特定的文本} {要执行的语句}。

无论何时只要特定文本从mud发出,你的命令将会被执行。当然你一样可以通过view/triggers 的菜单来编辑和显示触发器。

现在让我们开始定义一个简单的触发器:在一个人很多的房间里,当大家都在chat和say 时,你很容易忽略别人对你讲的话;在战斗中更是如此,一排排的战斗场面的描写使你眼睛很容易疲劳,以致于忽略朋友的"helpme!" 的呼救。那么让我们定义一个触发器:

#TRIGGER {告诉你} {#COLOR red}

这样当有人对你说话时,该文本将会变成红色。

这就是简单,但使你的mud生活更有力的触发器。另外一个常用的例子是:

#TRIGGER {你渴了} {dr}

当你已经在别名里定义好了#ALIAS dr {drink jiudai}时,那么每当你渴了,drink jiudai 的命令就会被发出,也就是说系统将会自动的喝水解渴,你再也不用为这事操心了。

在输入一个特定的文本时,你可以使用一些zmud约定的符号来代替某些文本。如:

(这些就是所谓的通配符,也即用一些符号来代替一段不确定的文本,对应通配符位置的文本只要符合了通配符所表示的格式,那么触发器依然会触发。)

* 代替任何数量的字符或空格
? 代替一个字符
  (注意:这个代替的是半角字符,也就是说如果你要代替一个不确定的中文字符的话,需要连续两个?)
%d 代替任何数量的数字
%w 代替任何数量的连续字符(一个单词)
%a 代替任何数量的字母数字(a-z,0-9)
%s 代替一定数量的空格
%x 代替一定数量的非空格
[范围] 代替在范围内的一定数量的字符。
^ 强行定义文本必须在一行之首出现
$ 强行定义文本必须在一行之尾出现
(文本) 储存匹配的文本在参数%1-%9里
  

注意:这个很重要,是用来抓取数据的。当我们需要抓取一段数据的时候,只需要把这一段文本对应的通配符用括号括起来。

还有注意这个括号必须是英文小写的。

例如:"你丢下了10个铜板"这句话。我们想要抓取10这个数字,就可以用#TR {你丢下了(%d)个铜板} {....}  这时候10这个数字就会被%d匹配,触发这个触发器,然后被()抓取,由于这是抓取的第一个文本,所以10会被储存在%1中,如果有多个()抓取了多个数据的话,会被按顺序放在%1-%9里面。需要调用10这个数字的话,只要使用%1就可以了,前面不必加%1,另外%1只在这个触发器所执行的代码中有效。

~ 引用下一个字符以避免失控

注意:这个~非常重要,例如我们要抓取健康状况信息"613/613    [100%]"中的百分比时,文字中出现了"["符号,由于[]在触发器语句匹配中是用来代替一定数量的字符的,所以如果直接在触发表达式中写"["的话,触发器会把它理解为一个通配符,而不是"["符号本身,这时候必须在"["前面加上一个"~",也即"~[",只有这时候触发器才会在文字中匹配"[",相似的还有?,*,(,^,$等,这些当触发语句中出现这些符号时,都必须在前面加上~,否则就会被理解为相应的通配符。

关于通配符的使用,可以看看这个http://www.pkuxkx.com/forum/viewthread.php?tid=3201&extra=page%3D1

帖子中PUBLIC部分有我抓取人物状态的触发器,如果能完全看懂其中的表达式的话,想必可以掌握ZMUD中通配符的使用了。

{val1|val2|val3|...}匹配任何一个特殊的字符串

{^字符串}不匹配一个特殊的字符串

说明一个范围,你可以用特别的字符如[abc]或[a-c],如果你使用一个太大的定义,你应该将~ 引用字符跟上。比如~[test~]将会匹配文本里的字符test而不作为一个太大的范围被执行。而且引用字符可以在参数选择时改变。

匹配一个空行,使用$就可以了。

你也可以使用一个变量,变量的赋值将会在接受文本前执行。

你所匹配的文本有些可以做为特别的参数在命令行里使用。你可以用括号将这些文本储存起来做为参数使用。比如:

#TRIGGER {(%W) tell you} {tell %1 I am busy now.}这样当某人对你说话时,你就可以自动告诉他我现在很忙。另一个例子是:

#TRIGGER {你捡起(%d)个铜板}{drop %1 coins}

但有时我们并不想总是这样做,那么我们可以给这个触发器选个名字,通过名字来控制他。如

#TRIGGER {(%w)tell you} {tell %1 I am busy now.} autotell

那么我们以后就可以用#T+ autotell #T- autotell 来打开(turn on)或关闭(turn off)这个触发器。如果再把他们定义在两个快捷键或建立的按纽上,那你就可以很容易的控制他了。

最后强烈建议对机器人不熟悉的同学看一看这个网址的几个帖子。看不下去没有关系,可以等碰到问题了再去这几个帖子里找有用的信息。
http://www.xkx100.cn/Zmud_lessons/lesson.htm

[ 本帖最后由 msquare 于 2008-5-3 02:13 PM 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2008-5-3 07:44:40 | 显示全部楼层
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2008-5-3 17:50:25 | 显示全部楼层
大牛啊!!!
我心中的神0
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2008-5-4 23:49:33 | 显示全部楼层
牛就一个字!
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2008-7-15 09:54:11 | 显示全部楼层
你这个机器人怎么用啊?导入了就四个TRIGGER,看不懂啊!!!
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2008-7-15 14:10:09 | 显示全部楼层
附件里面
#CLASS {robots|saoxue}
#ALIAS saoxue_subtask_cmd {saoxue_lian_cmd}
#TRIGGER {石嫂说道:「你刚接过任务,等会再来。」} {#wa 1000;saoxue_subtask_cmd} "" {prompt}
#TRIGGER {你赶快去(*)扫一下雪吧} {#IF (%1==断魂崖) {#T+ "百丈涧";#TR {百丈涧} {sd;#wa 1000;saoxue} {robots|saoxue};#TR {雪倒是扫完了,可惜大扫帚却坏了} {#wa 2000;#T- "百丈涧";nu;ask popo about 上山;ask sao about 完成} {robots|saoxue};zou tiesuo};#IF (%1==百丈涧) {#T+ "百丈涧";#TR {百丈涧} {#wa 1000;saoxue} {robots|saoxue};#TR {雪倒是扫完了,可惜大扫帚却坏了} {#wa 2000;ask popo about 上山;ask sao about 完成} {robots|saoxue};zou tiesuo};#IF (%1==缥缈峰山脚) {#T+ "百丈涧";#TR {百丈涧} {#2 sd;#wa 1000;saoxue} {robots|saoxue};#TR {雪倒是扫完了,可惜大扫帚却坏了} {#wa 2000;#T- "百丈涧";#2 nu;ask popo about 上山;ask sao about 完成} {robots|saoxue};zou tiesuo};#IF (%1==小路) {#T+ "百丈涧";#TR {百丈涧} {#2 sd;s;#wa 1000;saoxue} {robots|saoxue};#TR {雪倒是扫完了,可惜大扫帚却坏了} {#wa 2000;#T- "百丈涧";n;#2 nu;ask popo about 上山;ask sao about 完成} {robots|saoxue};zou tiesuo};#IF (%1==青石大道) {nw;ne;nu;nu;#wa 1000;saoxue;#TR {雪倒是扫完了,可惜大扫帚却坏了} {#wa 2000;sd;sd;sw;se;ask sao about 完成} {robots|saoxue}};#IF (%1==仙愁门) {#wa 1000;saoxue;#TR {雪倒是扫完了,可惜大扫帚却坏了} {#wa 2000;ask sao about 完成} {robots|saoxue}};#IF (%1==山路) {nw;#wa 1000;saoxue;#TR {雪倒是扫完了,可惜大扫帚却坏了} {#wa 2000;se;ask sao about 完成} {robots|saoxue}};#IF (%1==松林) {nw;ne;nu;#wa 1000;saoxue;#TR {雪倒是扫完了,可惜大扫帚却坏了} {#wa 2000;sd;sw;se;ask sao about 完成} {robots|saoxue}}} "" {prompt}
#TRIGGER {你的忠诚度增加了。} {ask sao about 扫雪} "" {prompt}
#TRIGGER {雪倒是扫完了,可惜大扫帚却坏了} {#wa 2000;#T- "百丈涧";n;#2 nu;ask popo about 上山;ask sao about 完成}
#TRIGGER {石嫂说道:「你不是正在干活啊!」} {ask sao about 完成} "" {prompt}
#TRIGGER {百丈涧} {#2 sd;s;#wa 1000;saoxue} "" {disable}
#TRIGGER {你的身体状态太差,不能扫雪!} {#wa 10000;saoxue} "" {prompt}
#TRIGGER {客店留言板} {w;s;lingjiu;ask popo about 上山;#wa 2000;ask sao about 完成;ask sao about 扫雪}
#CLASS 0
#CLASS {robots|saoxue|saoxue_lian}
#ALIAS saoxue_lian_cmd {lian @skill_type 10}
#ALIAS saoxue_lian_sign {hp;tell @id 扫雪练功}
#TRIGGER {飞奔的蜗牛~(flysnail~)告诉你:扫雪练功} {#IF (@qixue<@qixue_limit&@neili<@neili_limit) {wofang;#wa 2000;sleep} {#IF (@qixue>=@qixue_limit) {#IF (@neili>=@neili_limit) {saoxue_lian_cmd;saoxue_lian_sign} {#MATH saoxue_lian_dazuo_var (@neili_limit-@neili)/2;dazuo %max( @saoxue_lian_dazuo_var, 10)}} {#IF (@neili>=600) {ec;saoxue_lian_cmd;saoxue_lian_sign} {ec;ask sao about 扫雪}}}} "" {prompt}
#TRIGGER {你运功完毕,深深吸了口气,站了起来。} {saoxue_lian_cmd;saoxue_lian_sign} "" {prompt}
#TRIGGER {你一觉醒来,精神抖擞地活动了几下手脚。} {wofangb;#wa 2000;ask sao about 扫雪}
#TRIGGER {多睡对身体有害无益!} {wofangb;#wa 2000;ask sao about 扫雪}
#TRIGGER {休息室} {sleep}
#CLASS 0
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2008-7-15 18:10:57 | 显示全部楼层
呵呵,不好意思,没注意附件,只是把页面上的东东导了进去
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2008-7-15 19:06:56 | 显示全部楼层
不知道这是哪个版本Zmud用的,我的4.62导入有问题,导入以后很多TRIGGER残缺,如
TRIGGER {你赶快去(*)扫一下雪吧}只剩下{#if
手动修改后,仍要不时手动操作,也许是我太菜了吧!!
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2008-7-23 20:37:16 | 显示全部楼层
│  读书写字 (literate)                      - 深不可测 726/ 10980│
请问这个如何用变量取级别?望赐教
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2008-7-23 22:41:55 | 显示全部楼层
│%s读书写字%s*%s-%s深不可测%s(%d)/%s%d
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-25 04:39 AM , Processed in 0.012007 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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