背景:
阅读文章

ZMUD机器人制作(精)

buttons﹑系统变量﹑function

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

按钮(buttons)是很实用的一个功能,不光应用于半自动的机器人让游戏过程更加便捷,也用于全自动机器人,让人为修改某些变量更加简单.

按钮有3个要素:Caption,Commands(zmud721中这个要素被称为Value)和Class.其中Caption是按钮的名字,显示在按钮中间;Commands保存有一系列命令,当你点击按钮的时候,Commands中的内容就作为指令发送出去;Class是按钮所属的类,只是为了加载的时候方便。

Caption后面的颜色图标可以更改按钮的颜色,主选项卡Button States里可以选择按钮的种类;Postion/Size选项卡里的内容可以更改按钮的大小和位置;Advanced选项卡里Bitmap File可以选择一个自定义图标显示在按钮上,并且zmud721还有自带图标供选择。

按钮的种类:一共四种Push﹑Toggle﹑Separator和Multistate
Push:点击一下执行一次Commands中的命令
Toggle:分为button up和button down2种状态,分别储存有2个命令串;每次点击都会执行对应状态中储存的命令串并且从一种状态改变为另一种状态。简单点说就相当于2个按钮。
Separator:仅仅作为分隔其他按钮的工具来使用,不包含任何命令。
Multistate:一个下拉式按钮,点击之后会出现下拉列表,然后选择,不同的选择执行不同的命令。

在Buttons列表里有button的序号,#button 序号 这个命令等同于鼠标点击一次按钮,这个命令可以用于alias,variable,marco和trigger中。其他与button有关的命令有#yesno,#pr和#pick,这3个命令将在第八章中介绍。另外#button也可用于新建按钮,鉴于语法格式过于复杂,这里略过了。

按钮的功能可以说非常丰富,可以做出很漂亮的界面。
这里要推荐inspector同学的一篇文章http://telweb.pkuxkx.net/forum/thread-6501-1-3.html 小蜜蜂机器人(新手专用)

5.2 系统变量
主要介绍最实用的%ctime,%i和%random

%ctime表示你的连线时间,单位是秒

实例一:我需要机器人计算吐纳时每小时增加精力的速度。
#tri {你的精力上限增加了!!} {#add jingli_add 1;#var tuna_speed [@jingli_add*3600/%ctime];#show 每小时获得@tuna_speed点精力!}

%ctime还可用于萧峰,万安塔,胡一刀,护镖,护送和朝廷守门等任务,能接任务时由机器人自动提醒,具体在第七章中专门介绍

%i主要用于各种命令中,配合#number和#loop来使用,也用于专门针对数据库变量、record类型变量和list类型变量的命令中,这些命令主要有#loopdb,#forall等等
比如 #5 kill menggu bing %i等价于kill menggu bing 1;kill menggu bing 2;kill minggu bing 3;kill menggu bing 4;kill menggu bing 5

#number和#loop都是一次性发送数个相同的命令,区别在于变量可以用于#loop中来控制发送命令的次数,而#number中的number一定要是一个实际的阿拉伯数字

错误用法:#var number 5;#@number kill menggu bing %i
正确用法:#var number 5;#loop @number {kill menggu bing %i}
注意事项:#var number 0;#loop @number {kill menggu bing %i}实际效果是kill menggu bing 1,也就是说#loop至少会执行一次,@number中的值为0或者负值或者干脆是字符串乃至汉字,都是执行1次命令,zmud不会抱错,可以自行试验。

#loop命令在我发的领悟机器人中被用到,用来改变领悟或者练习的次数,以适用不同exp层次的id。

%random产生一个0-99的随即数字,%random(1,5)产生一个1-5的随机数,结合#case命令来发送随机命令

#case @variable {cmd1} {cmd2} {cmd3} {cmd4} {cmd5}...可以根据@variable值的不同来发送不同的命令,比如@variable值为3,第3个括号中的命令cmd3会被执行,其他命令都不执行。

另外%time和%dice有兴趣也可以看一下,举几个例子简单说下
#say %time()显示为星期三 七月 22, 2009 2:14:14 am
#say %time(c)显示为2009/7/22 2:16:12
#say %time("aaaa tttt")显示为星期三 2:26:03
%time()的括号中可以使用参数来改变显示内容,这些参数有a(星期)、d(日期)、m(月份)、y(年)、e(年)、t(时分秒)、h(小时)、n(分)和s(秒),下面给个复杂点的例子,有兴趣可以自行试验看下显示结果。
#FORALL {a|d|m|y|e|g|t|h|n|s} {#SH %i: %time(%i) | %time(%i%i) | %time(%i%i%i) | %time(%i%i%i%i)}
这个例子基本包含了所有的格式,%i依次等于a、d、m、y、e、g、t、h、n、s,%time()的括号中分别用1-4个%i来显示不同详细程度的内容。

%dice(2d6+2)显示为掷2个6面色子的和再加上2,是一个随机结果,()中用到的格式为xdy+n,表示"x个y面色子+n",相关变量有%dicemin()、%dicemax()、%diceavg()、%dicedev()。

其他系统变量还有很多,作用都不大,不感兴趣的可以跳过。下面只列举一些,太多了不可能全面的,具体可以#help 自行查找。
%action 最后一次触发所执行的命令。   
%cr 换行。 
%def 当前使用的特殊字符。 
%host 当前连线MUD的IP地址。   
%lastcom 最后被执行的命令。   
%lastcom2 倒数第二个被执行的命令。 
%lastcom3 倒数第三个被执行的命令。 
%line 从MUD中得到的最后一行文本。 
%line2 从MUD中得到的倒数第二行文本。   
%line3 从MUD中得到的倒数第三行文本。   
%port 当前连线的端口号。
%selected 当前选中的文本。可用于speed menu的制作,通过鼠标点击来发出包含选中文本的命令
%selline 当前选中的行。可用于speed menu的制作
%selword 当前选中的单词。可用于speed menu的制作
%title 当前MUD的标题。   
%trigger 最近一次被触发的行。   
%window 当前窗口的标题。

5.3 fuction(函数)

zmud允许自定义函数,命令为#function,#fu为命令的缩写形式.可以简单的把函数理解为带参数的变量.还是用实际的小例子来说明函数的用法.

实例1:#fu sum %eval(%1+%2)
这里%eval是系统自带函数,作用等于[ ],负责运算并且返回运算结果
#say @sum(100,40)显示为140
sum在这里为一个自定义函数,包含2个参数,用法相当于带参数的变量,@sum()为函数的值

实例2:#fu min %if(%1<%2,%1,%2)
这里定义了一个函数min,作用是选择2个数中较小的数
%if为系统自带的条件函数,语法为%if(表达式,true-value,false-value),如果表达式为真,返回true-value,否则返回false-value
#say @min(5,7)显示为5
#say @min(20,11)显示为11

实例3:#fu fact {%if(%1<=1,1,%1*@fact(%eval(%1-1)))}
这个例子要复杂些,用到了函数的自身嵌套,如果参数<=1,返回1,否则返回"参数*@face(参数-1)",然后再对@fact(参数-1)重复上面的条件运算,最终的结果就是"参数*(参数-1)*(参数-2)*...*1",其实就是一个阶乘运算.
#say [@fact(5)]显示为120

函数很多时候用起来很方便,使你的机器人更容易看懂,修改起来当然就更容易
比如在上一章打坐吐纳机器人中,可以定义一个函数对气血,内力,精神,精力进行计算,确定dazuo,tuna的数值
#fu need %max(%min([(%if(%eval(%4*2-%3)<1000,[(%4*2-%3)/2],[%4*2-%3])*100+129)/@sudu],[%1-(%2+9)/10]),10)
这个函数拥有4个参数,并且包含一个变量@sudu
打坐的命令是dazuo @need(@qixue,@qixue_max,@neili,@neili_max)
吐纳的命令是tuna @need(@jingshen,@jingshen_max,@jingli,@jingli_max)
可以看到比第4章更简洁明了,省去了一大堆#var,#math,#if

另外值得一提的是,zmud的命令,系统自带变量,系统自带函数相当的多,从而使得机器人的写法多种多样,相当灵活.基本上任意一个#xxx的命令都对应有一个系统已定义好了的函数或变量%xxx()
比如#if,%if;#case,%case;#eval,%eval;#null,%null;#walk,%walk;#alias,%alias;#color,%color;#additem,%additem
太多了,实在无法一一举例,如此多的命令使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官方微信公众平台
热门评论