背景:
阅读文章

ZMUD机器人制作(精)

遍历实现的一种方法

[日期:2013-12-11] 来源:mud游戏网  作者: [字体: ]

本章继续介绍遍历的制作.先给出路径的制作方法,然后将遍历以及返回的方式多样化.

注:在机器人制作过程中,并不一定要用到本章及随后两章介绍的所有方法。一切以你给机器人设定的功能为基础,兼顾稳定效率简洁选择合适的方法。如果你觉得有些方法实现起来太复杂,你可以简化它,也可以不用理会它或者改进它。本章及随后两章仅供参考

12.1 路径的制作

一个list变量如果手动添加item以及间隔符号"|",不仅浪费时间,也容易出错,参考path的制作过程,制作下面的alias

制作路径之前需要将相关变量清空,为此制作一个按钮

#button 0 #mark {#var area {};#var busy {}}
//这里的按钮相当于path路径制作#mark的功能,所以取名为#mark,路径临时保存在@area中,busy方向的序号保存在@busy中

如果你把有busy的方向分得更精细,你还需要更多的变量来保存这些方向的序号,请一并清空

#alias g {%1;#var area %additem(%1,@area);#say @area}
//定义一个alias,在走路的同时将方向添加到@area中,并且显示出@area的内容

有了这个alias,你只需要用g s,g e,g "enter boat",g "aliasname"这些命令在游戏里走路就可以了.在你走路的同时,s,e,enter boat,aliasname都自动添加到变量@area中了,并且同步显示出变量@area的内容.

#var pathname @area;#var area {}
//路径制作完毕之后,保存到pathname中,同时清空@area准备下一条路径的制作

再用下面的按钮辅助就更省事了
#button 0 记录busy方向 {#var busy %additem(%numitems(@area),@busy)}
#button 0 显示busy方向 {#say @busy}
//碰到有busy的方向,轻轻点击一下第一个按钮.等整个路径走完之后点击第二个按钮就可以知道哪些步数有busy了.在保存路径的同时顺便将路径的遍历方法一并写好.

注一:你可以边走路边制作trigger,例如上一章中快速行走慢速行走需要的trigger都在走路的时候就作好,将会节约你大量的时间

注二:整个路径走完,与该路径有关的alias,variable,trigger就已经全部制作好了,当场测试一遍确认无误就可以开始下一条路径的制作!

为了让遍历的方式更加多样化,在制作路径的时候可以记录更多的内容,本章的第2小节将会用到.
#button 0 记录关键地点 {#var room %additem(%prompt("","关键地点"),@room);#var roomnum %additem(%numitems(@area),@roomnum)}
#button 0 记录关键npc {#var npc %additem(%prompt("","关键npc"),@npc);#var npcnum %additem(%numitems(@area),@npcnum)}
//用到函数%prompt(),跟#pr类似,不过这个函数不会将你输入的内容赋值给变量,而是将你输入的内容作为函数的值.
//在录制路径的时候,点击这2个按钮,会弹出一个对话框,让你输入"关键地点"或者"关键npc",你可以为当前地点或者这个房间的npc取一个名字,名字被保存在@room或@npc中,当前地点的编号自动保存在@roomnum或@npcnum中
//比如你在发呆室,可以点第一个按钮输入"修理装备"来保存修理装备的地点
//你在胡一刀那里,可以点第二个按钮输入"老胡"来保存胡一刀的位置

12.2 遍历的多样化

步骤一:请大家自己动手完成这一步,用上一章的方法,写好针对@area的遍历,包括顺向快速行走,逆向快速行走,顺向慢速行走,逆向慢速行走

为了下面叙述方便,假设你已经完成了上一步,顺向快速行走的alias是fastwalk,逆向快速行走是fastwalkb,顺向慢速行走是slowwalk,逆向慢速行走是slowwalkb

这些alias中用到的变量有:
@step--表示你的当前位置,在起点位置为1,在终点位置为%numitems(@area)+1,依次类推
@steps--表示行走的终点位置,即顺(逆)向快(慢)行走停止之后你所在位置应该为@steps
@busy--有busy的方向在路径中的编号

注三:有兴趣动手完成这个步骤的同学,可以在做好这4个alias之后测试一下,一定要确保行走停止之后@steps和@step的意义与上面所述相同,如有差异请稍作修改。对list变量的遍历感到陌生的同学,这会是一个很好的锻炼

步骤二:用遍历行走的时候,不管你是什么原因停了下来,你的trigger都应该保证@step的值是你当前所在的位置

注四:由于某些trigger无法判断的原因,导致@step中的值不是你当前所在的位置,我们称这一现象为"乱入",这在胡一刀和护镖任务中都可能发生,解决办法留待后面2章介绍,现在暂时不管这个。

步骤三:制作功能更强大的遍历alias

#alias fastgoto {#if %isnumber(%1) {#var steps %1};#if %ismember(%1,@room) {#var steps %item(@roomnum,%ismember(%1,@room))};#if %ismember(%1,@npc) {#var steps %item(@npcnum,%ismember(%1,@npc))};#if (@steps>@step) {fastwalk} {fastwalkb}}
//快速行走的alias,拥有一个参数,这个参数可以是一个数字,也可以是房间的名字,也可以是npc的名字
//%isnumber()这个函数可以判断是否为数字,如果是直接赋值给@steps
//如果参数时房间的名字或者npc的名字,将房间的编号赋值给@stpes
//通过比较@step和@steps的大小关系选择是顺向行走还是逆向行走

fastgoto 修理装备:从任意地点走到发呆室修装备
fastgoto 老胡从任意地点走到胡一刀那里
fastgoto [@step+1]:从任意地点顺向走一步
fastgoto [@step-1]:从任意地点逆向走一步
fastgoto 1或者fastgoto [%numitems(@area)+1]:从任意地点走到起点或者终点
fastgoto %1:如果[email=%1=@step]%1=@step[/email],停留在原地

可以看到这个遍历功能很多,如果你在制作路径的时候记录的npc或者房间名称很丰富,你的行走将随心所欲

此命令有2个缺点:
(1)无法判断路径是否可逆
(2)路径是全区域的遍历,因此行走过程中可能要走很多不必要的步数

注五:下一章会修改这个alias,将所有的情况用一个alias来完成.如果可逆就逆向行走至目的地,如果不可逆就顺向返回起点再顺向行走至目的地;并且在不需要遍历的时候将路径简化,只走最短路线

慢速行走完全类似
#alias slowgoto {#if %isnumber(%1) {#var steps %1};#if %ismember(%1,@room) {#var steps %item(@roomnum,%ismember(%1,@room))};#if %ismember(%1,@npc) {#var steps %item(@npcnum,%ismember(%1,@npc))};#if (@steps>@step) {slowwalk} {slowwalkb}}

12.3 遍历结束方式的改进

拿上一章的两个例子来说

快速行走;#alias bianli {#if (@step<=@steps) {#if (%mod(@step,@bushu)=0) {#wa @wait;halt;%item(@area,@step);#add step 1;bianli} {%item(@area,@step);#add step 1;bianli}}}
慢速行走;#alias bianli2 {#if (@step<=@steps) {#if (@finddbr=0) {#wa @time;halt;%item(@area,@step);#add step 1;bianli2}}

基本上遍历就靠这这2个alias完成,但是遍历的目的不一样,有可能是为了返回,有可能是为了逆向或者顺向一步步搜索,遍历结束也分达到目的或者未达到目的2种情况,导致判断下一步行动的trigger作起来并不容易,甚至根本无法判断遍历是否已经结束,因此要作些改进.

改进的快速行走:#alias bianli {#if (@step<=@steps) {#if (%mod(@step,@bushu)=0) {#wa @wait;halt;%item(@area,@step);#add step 1;bianli} {%item(@area,@step);#add step 1;bianli}} {#exe @action}}
//只在嵌套结束之后加上#exe @action

你可以在各种trigger中先改变@action的值再使用遍历,比如
#var action "tell @zhanghao 出发寻找盗宝人"
#var action "tell @zhanghao 返回结束"
#var action "#say 开始逆向搜索"
//通过这些结束信号作trigger就容易多了。

有的区域过于庞大,如果做成一个路径的话,像洛阳丐帮北京等区域都会超过300步,整个遍历下来非常费时间影响效率,因此最好分成几个小路径。
这就涉及到多个路径的连续遍历,如果遍历目的达到,直接返回;否则继续遍历下一个路径。多个路径连续遍历的具体方法将在第14章中介绍。

本章结束,下章介绍路径的逆转和简化,简单说说胡一刀和推车全自动实现的障碍及应对办法

第十三章 胡一刀和护镖全自动分析

继续前一章关于遍历的一些技巧,有的时候需要获得一个路径的返回路径,有时候需要走最短路线以提高效率,这就是路径的逆转和简化.

注一:本章的例子如果看不懂,可以将复杂的部分分解成小部分慢慢理解,也可以直接将代码复制到zmud命令栏中进行试验验证.本章就不过于罗嗦注释了,如果掌握了方法,这些代码写起来还是很简单的.


【内容导航】
第1页:聊聊zmud和机器人 第2页:机器人的核心灵魂
第3页:variable和alias的初级应用以及if语句 第4页:机器人实例-打坐吐纳机器人
第5页:buttons﹑系统变量﹑function 第6页:Variable和Alias的更多应用
第7页:掌控时间 第8页:提高机器人稳定性和适用面
第9页:丰富你的机器人 第10页:机器人实例--朝廷守门机器人
第11页:Path的用法 第12页:variable和alias的进一步应用
第13页:遍历实现的一种方法 第14页:路径的逆转和简化
第15页:实际例子--解决乱入的2种办法
收藏 推荐 打印 | 录入:sbso | 阅读:
相关内容       机器人  zmud 
本文评论   [发表评论]   全部评论 (0)
内容推送
52mud提供
一起回忆泥巴游戏QQ群68186072
52mud官方微信公众平台
热门评论