文字MUD游戏论坛-天下泥潭群英会-水泊梁山  

返回   文字MUD游戏论坛-天下泥潭群英会-水泊梁山 > 西游之旅 > 『 机器人制作及下载 』

『 机器人制作及下载 』 如何从开始简单的数组、触发,到复杂的路径、地图、数据库等等。如何考虑周全的制作全自动的机器人让它能够24小时不停的帮你练功。

发表新主题 回复
 
LinkBack 主题工具 主题评分 显示模式
旧 2009-04-28   #1
中级会员
级别:1 | 在线时长:12小时 | 升级还需:3小时
 
dragonziwen 的头像
 
注册: 09年02月07日
来自: 广州
帖子: 56
声望力: 16
声望: 12 dragonziwen 闻道则喜
现金:76两梁山币
资产:76两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0
ZMUD编程入门 (加精加声望)

ZMUD编程入门
  1 入门——Zmud编程的基本概念。
  与Telnet等初级工具相比,在玩泥巴(MUD)时,Zmud显示出强大的编程功能,利用Zmud的编程功能,我们可以根据MUD反馈回来的信息作出各种各样的复杂动作,从而简化我们的操作,让我们可以更轻松地畅游泥巴世界。
  Zmud编程的基本要素如下:
  Alias/Macro key/Variable/Trigger/button
  1.1 Alias 别名,可以将任何命令定义成你喜欢的形式。
  用一句通俗的话说就是:它可以将一条或多条复杂的命令用几个字母代替。
  比如:buy jitui from xiao er可以定义一个别名:mjt,这样以后你只需键入mjt,即可完成buy jitui from xiao er的动作。
  1.1.1 定义别名的方法有三种:
  1.1.1.1 最简单的方法:使用快捷键:Ctrl+A.
  在命令行里输入要定义别名的命令,然后按“Ctrl+A”,再键入自己命名的别名即可。比如:在命令行里输入“buy jitui from er”,然后,按“Ctrl+A”,再键入“mjt”,这样就给“buy jitui from er”定义了一个别名“mjt”。
  1.1.1.2 使用“#ALIAS”命令。
  语法:#ALIAS ALIASNAME {COMMAND}比如上例可以通过在命令行里输入“#ALIAS mjt {buy jitui from xiao er}”来完成别名的定义。
  1.1.1.3 使用别名定义窗口。
  你可以通过选择Zmud主菜单“View/Aliases”或者按菜单项的“Aliases”按钮来打开别名定义窗口,并对所有已定义的别名进行修改,添加或删除的操作。
  1.1.2 使用参数。
  另外,Alias 还可以使用参数,这让我们的操作有了灵活性。比如你可以这样定义:#ALIAS k {kick %1;hammer %1;nip %1},于是你键入k mixuer就相当于键入了“kick mixuer;hammer mixuer;nip mixuer”,不过千万不要写太多命令(小心频道被关),而且最好把“mixuer”换成“jokey,hero,koko,pqpq,sjmao,great,fangcj……”,只要别换成“tianya/tygk”就行,*snicker.
  注:别名只能用于一条命令的开头,只有这样别名才能被解释执行。比如:say mjt 不会被解释成say buy jiutui from er,因为mjt这个别名不是处于这条命令的开头。
  1.2 Macro key 宏定义键。
  将命令定义成键盘上相应的键或者组合键。
  1.2.1 定义的方法。
  从Zmud的顶部菜单中选择“Action->Define Macro Keys”,按下组合键“Ctrl+K”,Zmud会弹出一个小窗口,提示你键入要定义的键,按下要定义的键之后,Zmud会要求你输入在这个键上要表示的命令,再键入你希望的命令,一个宏定义键就定义完毕了。
  1.2.2 在定义宏定义键时要注意的问题。
  1.2.2.1 不要使用Zmud保留的键名。比如:Ctrl+K,Ctrl+A等等,因为你的定义不能覆盖Zmud的已有的定义。
  1.2.2.2 不要使用Windows等操作系统保留的键名,比如:F10,|ALt+A等,因为这样会影响你对操作系统的操作。
  1.2.2.3 不要使用箭头等编辑键。但当NUM LOCK 灯亮时小键盘上的键就不是编辑键,你可以使用它们作为宏定义键。
  1.2.3 当你键入宏定义键时,宏定义键代表的文本并不输入到命令行中。我们可以利用这个特性做一些富有技巧性的事,比如:如果你想迅速移动到东方,并且拣起地上的东西,可以这样做:定义数字键 6为“east”的宏,然后先在命令行中输入“get all”,按6之后,敲回车键“Enter”即可用 2个键迅速的实现“east;get all”两步操作。
  1.2.4 宏定义链。
  在定义宏的时候在命令后加一个“~”,那么当你键入这个键时,命令并是马上执行,而是先输入到命令行中去,并且把光标停留在这条命令的末尾。这样你就可以输入另一个宏定义键,于是就构成了宏定义链,这样可以减少你输入的键数。比如:如果我们定义了两个宏定义键:F8 open door,小键盘的8 north,这样当我们输入“F8,8”的时候,命令“open door;north”就被执行了,我们仅仅按了两个键,是不是特方便?
  注:其实在我们使用Zmud的时候,Zmud 已经为我们定义好了一些宏定义键,象我上面提到的“north,east”等方向键等等,你可以通过按“Ctrl+k”来查看修改这些宏定义键。
  1.3 Variable 变量。变量相当于编程语言中的变量,一旦定义可以用于命令的任何位置。
  1.3.1 定义的方法。
  1.3.1.1 在命令行中使用命令#VAR.比如:#VAR food jitui,就定义了一个变量,并将值“jitui”赋给了变量“food”。
  1.3.1.2 通过变量窗口。
  选择Zmud的顶部菜单中的“View->variables”,或按菜单项“variables”,都可以打开变量窗口。在“Variable”中添入要定义的变量的名字,可以同时指定变量的初值(Value),默认值(Default)。这样一个变量就定义完毕。比如:上例中的变量在变量窗口中可以这样定义:在“Variable”中添入“food”,在“value”中添入“jitui”,即可完成变量“food”的定义和赋值。
  1.3.2 变量的引用方法。
  在变量名之前加一个“@”,即可引用这个变量的值。比如:我们用“@food”即代表了jitui,“eat @food”即完成“eat jitui”的动作。变量的价值在于:当我们改变变量“food”的值时,我们不必改变命令“eat @food”,比如:当“food”的值变成 “gourou”时,我们一样可以用“eat @food”完成吃的动作。
  1.3.3 系统变量。
  Zmud为我们提供了一些系统变量,这些变量以“%”为前导,它们可以象普通变量一样引用,只是它们以“%”为前导,而不是“@”。
  注:在退出Zmud时,系统并不要求你保存已定义的变量,如果你想保存这些变量,那么在退出Zmud之前你必须先保存好这些变量。
  1.4 Trigger我不知道该叫它什么,触发?扳机?……我看还是叫“动作”比较恰当。也就是说,它能够根据发生的不同情况执行相应的命令。哇~这正是我们想要的!这是Zmud的最基本而有用的功能!也是做机器人的基础。打瞌睡的快醒醒,瞪大你的眼睛,竖起你的耳朵,:)
  1.4.1 定义的方法。
  1.4.1.1 利用命令行 #TRIGGER (或者 #ACTION)。
  语法:#TRIGGER {pattern} {command}比如:#TRIGGER {你气喘嘘嘘,看起来状况并不太好。} {exert recover}这样,当屏幕上出现“你气喘嘘嘘,看起来状况并不太好。”信息时,你定义的Trigger就会触发,产生“exert recover”的动作,这样你就可以自动恢复气血了。当然在command中可以使用已定义的变量(valiable)或别名(alias)。
  1.4.1.2 通过动作定义窗口。
  从Zmud的顶部主菜单中选择“View->Trigger”,就会打开动作定义窗口,所有已定义的Tigger都会显示在这个窗口中,所以我们可以随意地修改它们,当然也可以添加或者删除。在窗口中有这么几个项:Class,Pattern,Command.Class是动作的类,你可以将相关的动作放在一个类里。Pattern是模式的意思,也就是说你期望屏幕上出现的信息,你可以从屏幕上直接粘贴这些信息。Command是当你的pattern跟屏幕上出现的信息吻合时将产生的动作。另外还有几个按钮:
  “Enable class”让选定的动作起作用。
  “Disable Class”则让选定的动作暂时失去作用。
  “Testing” 可以测试你定义的动作是否正确。
  “Options”中是关于动作的一些设定,我会在以后进一步说明。
  1.4.2 对Tigger的控制。
  在通过命令行定义Trigger时,可以再加一个参数,如下:
  #TRIGGER {pattern} {command} classname
  这个classname就是你要为这个Tigger起的类名。这样在命令行中,我们可以通过“#t+ classname”来打开一个类(相当于在窗口中按“Enable class”按钮),也可以用“#t- classname”来关闭一个类(相当于在窗口中按下按钮“Disable Class”)。
  注:匹配符:
  * 可以代表一个或多个字符,也可以代表空格。? 可以代表一个字符。
  %d 代表任何十进制的数字(0-9)。
  %w 可以代表任何拉丁字母(a-z) (a word)。
  %a 可以代表任何拉丁字母或阿拉伯数字(a-z,0-9)。
  %s 可以代表空格或跳格键 (spaces, tabs)。
  %x 可以代表任何非空格字符。
  [range] 代表规定范围内所列出的任何数量的字符。
  ^ 强制从一行的开头进行匹配。
  $ 强制从一行的结尾进行匹配。
  (pattern) 将已匹配的串存入变量里,变量可以是 %1到 %9.
  ~ 将下面的字符作出注释,防止它被匹配,实际就是将它忽略。
  {val1|val2|val3|……} 匹配任何已指定的字串。
  {^string} 不匹配选定的字串。
  也许你不太明白上面的解释,不必着急,在以后的讲座中,我会结合实例进一步解释。
  1.5 button 按钮。
  通过点击按钮可以执行相应的命令,也可以显示某个参数的值,还可以方便地控制Trigger的开启或关闭等。按钮可以使我们的操作更加直观、方便。
  1.5.1 按钮的类型。
  按钮可以分成两种:点击按钮和开关按钮。当你用鼠标按下“点击按钮”时,命令被执行,当你释放鼠标时,命令被释放。而点击“开关按钮”,按钮将在“ON”和“OFF”之间循环。
  1.5.2 定义的方法。
  从主菜单中选“Action->Make buttons”或者“View->Buttons”都将弹出按钮的编辑窗口。如果选定“Toggle”,将定义一个“开关按钮”。“Off Caption”指定“OFF”状态时按钮上显示的文本:“On Caption”指定“ON”状态时按钮上显示的文本:“Off Command”指定按钮ON时执行的命令:“On Command”指定按钮OFF时执行的命令。“Variable”可以定义按钮所需的变量。如果不选定“Toggle”,将定义一个“点击按钮”。只需在“Off Caption”和“On Command”中添入相应的内容即可。
  1.5.3 按钮的高级属性。
  在按钮的“Advanced”设置里你可以指定、修改按钮的许多特性。比如:按钮的颜色,改变按钮的尺寸、位置,为按钮指定一幅图片等等。
  例子:自动study机器人的设计:
  1.变量的定义:
  book:要study的书或物品名
  st_value:用于study的心神值
  st_back:用于恢复心神的内力值
  st_loop:用于正循环的气血值
  2.triggers的设计:
  class:study
  pattern:内力 :(%s)(%1)/(%s)(%d)
  commands:#if (%1<@st_back);{#wa 3000;exercise @st_loop1;#wa 3000;exert recover;hp};{#wa 3000;study @book @st_value;#wa 500;exert refresh;hp}
  3.button的设计:
  Off caption:study off
  on caption: study on
  on commands:#prompt book;#t+ study;hp
  off commands:#t- study
  (这仅仅是一个例子,如果要用于实际当中,还要做一些改动。)这一节我介绍的只是Zmud编程中的基本要素,也许枯燥一点,但了解这些基本要素是很有必要的。有了这些基本要素,我们就可以利用他们构造出各种各样的自动操作,也就是我们常说的 robot(机器人)。下一节我会结合实际,专门讲几个例子探讨一下robot的制作方法。

  

http://7.qiankundai.com/06/myfile/yingxr/map/xyj.jpg
帅哥 dragonziwen 当前离线  
回复时引用此帖

旧 2009-04-28   #2
中级会员
级别:1 | 在线时长:12小时 | 升级还需:3小时
 
dragonziwen 的头像
 
注册: 09年02月07日
来自: 广州
帖子: 56
声望力: 16
声望: 12 dragonziwen 闻道则喜
现金:76两梁山币
资产:76两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0
回复: ZMUD编程入门 (加精加声望)

续上----ZMUD编程入门
2.实战——robot实例讲解。
  做机器人的步骤可以分如下几步:
  (1)分析动作;
  (2)定义别名(Alias);
  (3)定义变量(Variable);
  (4)定义动作(Trigger);
  (5)定义按钮(Button);
  (6)测试。
  下面我将结合实例讲解一下robot的制作过程。由于前人已有的机器人的例子太多了,在选择例子时,很难跟别人不同,我只是选择一些常用的例子,我的目的只是针对新手。

  2.1 自动应答。
  robot的最大特点是可以根据发生的事件自动作出相应的动作。如果有人狠狠地踢了你一脚,你会有什么反应?狠狠地回踢一脚?哇哇叫痛?可怜巴巴地哀求?还是满不在乎地自嘲?…… 下面的这个例子就是针对这种情况而做的,其实对于尚武一族来说,这个robot毫无价值,而对聊天族可能是有力的工具。
  如果有人,比如小鬼对你做了这个动作:小鬼对你说:来了,欢迎!
  如果你知道是小鬼在跟你说话,那么你可以直接用:你说道:谢谢你,小鬼!
  可是如果要做一个机器人,自动应答,怎样获知对方是谁呢?等等,有一个问题必须首先说明一下!一个玩家在西游记里有两个名字:一个英文名字,一个中文名字。在做动作时,动作的对象是英文名字,所以你要针对某个人物做出动作,必须获得对方的英文名字(id),比如chat* hammer xxx,tell xxx …… ,give xxx sth等等。在屏幕上显示的玩家名字是中文的,英文名字只是用于命令中。在这个例子中,我们只是跟对方说话,所以,我们可以在say 的内容中写上对方的中文名字,而不用semote做动作,这样我们只需知道对方的中文名字就足够了。
  怎样获得对方的中文名字呢?我们可以利用Trigger和variable(变量)来实现,利用Trigger 通配符匹配的特点我们可以将屏幕上显示的我们需要的字符放到系统的变量中(从%1到%8),从而更进一步将我们从屏幕上匹配到的值(%1——%8,最多一次可以获得8个)送到我们定义的变量中,就完成了从屏幕上抓取信息的目的。如下:
  1. 定义变量我们要取得对方的中文名字,所以要定义一个变量存放这个中文名字。为此按照第一节中介绍的方法,打开变量定义窗口,点击new 按钮准备定义一个新变量,依次添入:Varliable: name Value : 空Default : 空这样我们就定义了一个名叫name的变量,我们没有给它赋值,也没有指定它的缺省值。
  2. 定义Trigger——yingda1按照第一节中介绍的方法,打开定义Trigger的窗口。点击new按钮,依次添入:
  Class yingda1 定义类别yingda1
  Pattern (%x)对你说:来了,欢迎!
  Command name=%1;say 谢谢你,@name!
  (%x)的作用是将屏幕上这个位置的字符送给系统预留的变量%1,Command中语句name=%1的意思是将从屏幕上获得的字符(%x)的值送给变量name,此例中所获得的字符就是对方的中文名字。@name 的含义是取出name的值,注意:引用变量的方法是在变量名的前面加一个“@”。这里“@name” 代表的就是“%x”所取得的值。这个robot非常简单,相信即使是初学者也不会觉得难于理解。
  3. 补充——修正一个小bug.这儿还有一个小问题,有时屏幕上在一行的开头会有一个“<”,这样当我们用(%x)抓取信息时,会把这个“<”一起抓下来,结果会变成这个样子:
  你说道:谢谢你,<小鬼!
  名字的前面多了一个“<”,这真是讨厌!不过你还记得上一节中提到的“~”吗?在(%x)前面加上“~<”就会把这个讨厌的符号忽略掉,这样上面的Pattern可以改成:
  ~<(%x)对你说:来了,欢迎!
  这个例子可以再做一下延伸。
  如果你想用Tell来跟对方交流,那么你就需要对方的英文id了。怎样获得对方的英文id呢?有一个好用的命令“id”,不知你用过没有?如果你只键入“id”,不带参数,那么这个命令将显示你所带物品的英文id名称;如果你使用“id here”,那么将显示出所在房间的所有物品和人物的英文id,如下的样子:
  id here
  在这个房间中, 生物及物品的(英文)名称如下 :
  猫头鹰 = catbird
  米雪儿 = mixuer
  小鬼 = zhuang
  南城客栈留言板 = board
  千里眼 = bigeye, youchai, chai
  店小二 = xiao er, xiaoer, xiao, waiter, er
  我们可以利用这条命令得到对方的英文id.比如取得小鬼的英文id,可以这样在Trigger中添入:
  Pattern 小鬼(%s)=(%x) 将空格(%s)送给%1,%x送给%2.
  Command id_name=%2 将%x抓取的值(实际就是zhuang)送给id_name
  这样上例的trigger可改为:
  pattern ~<(%x)对你说:来了,欢迎!
  Command name=%1;id here
  再加一个trigger:
  Pattern (@name)(%s)=(%x)
  Command id_name=%3;tell @id_name 谢谢你,@name!
  还要再定义一个变量(Variable): id_name来存放对方的英文id.到此为止,你已经完成了第一个机器人的制作,这个机器人虽然简单,却反应了制作机器人的基本方法。
  2.2 练功为了节省潜能,我们有时通过Practice来提高自己的特殊外功。象这种操作,大多是一些重复劳动,所以如果做一个机器人来自动练功,既减少了我们的操作,又能提高速度,那真是一件美妙的事!我们先分析一下练特殊外功的基本操作:
  一是:practice parry;
  二是:exert recover(气血不够时用以恢复);
  三是:exercise xxx(内力不够时练气);
  四是:cast transfer(将法力转换为内力);
  五是:meditate (法力不够时冥思);
  六是:sleep(精神或法力不够时睡觉)。
  练特殊外功消耗的是气血值,补充气血的方法是exert recover,而exert recover消耗的是内力值,恢复内力的方法是exercise 或者cast transfer.理顺了这些关系,我们就可以定义动作了。
  (1)首先,我们定义一些别名来替代长的命令。打开定义别名的窗口,依次添入:
  Alias name Command 解释
  11 exert recover 恢复气血
  22 exert refresh 恢复精神
  zq cast transfer 用法力补充内力
  dz exercise 打坐练内力
  ms meditate 冥思以练法力
  pp practice parry 练特殊外功
  pp1 #20 pp;11;dz 300 练特殊外功
  pp1这个别名的意思是练20次的外功,然后恢复气血,然后用300点的气血值打坐练外功。 这里的20和300只是一个假定的数量,在使用中要根据个人情况加以调整。
  (2)定义trigger.上面的pp1中最后一个动作是打坐,我们的trigger可以从这儿开始。
  Pattern: 你行功完毕,吸一口气,缓缓站了起来。
  Command: #wa 2000;11;pp1
  由于某些动作之间有一定的时间延迟,所以在打坐完毕,我们用#wa 2000命令延迟2秒钟进行下一动作,#wa命令中参数的单位是微秒。如果你的内功足够强已进入正循环,那么只需键入pp1 即可实现自动循环练功的目的(如果你不知道什么叫正循环,可以到这儿看看)。如果你还没有达到正循环,那么你的内力和法力在这个过程中会逐渐消耗殆尽,从而这个循环就会终止。
  由于我们消耗的是气血,所以我们可以从精神上入手,如果能让精神不断转化为法力,让法力转化为内力,再让内力转化为气血。这样就能保证我们所需的气血取之不尽,那么练功的动作就会持续下去了。所以我们将上一步的trigger修改为:
  Pattern: 你行功完毕,吸一口气,缓缓站了起来。
  Command: #wa 2000;11;22;ms 400
  因为冥思要求气血和精神不能太低,所以我们要同时恢复气血和精神。这儿的400同样是一个假定值,你最好把这个值调的大一点。然后再添加如下的Trigger:
  pattern: 你冥想完毕,睁开眼睛定了定神,站了起来。
  Command: #wa 2000;zq;11;pp1
  可是当我们将精神转化为法力,内力,气血后,下一次冥思可能会导致“你现在精神太差了,进行冥思将会迷失,永远醒不过来!”,我们再添加两个Trigger
  Pattern: 你现在精神太差了,进行冥思将会迷失,永远醒不过来!
  Command: sleep
  Pattern: 你一觉醒来,只觉精力充沛。该活动一下了。
  Command: ms 400
  这儿有一个问题,一般睡觉的地方是不允许练功的,所以在sleep 之前要加上到睡觉地方的路径;而醒来之后要加上回去的路径。在冥思之前也可能出现“你现在身体状况太差了,无法集中精神!”,同样我们用睡觉的方法来解决。
  Pattern: 你现在身体状况太差了,无法集中精神!
  Command: sleep
  还有一个问题,就是在睡觉时有可能会进入红楼梦里,怎么办?再加两个Trigger:
  Pattern: 荡悠悠三更梦
  Command: u;#5 n;u;ask girl about 回去
  Pattern: 你揉揉眼睛清醒了过来
  Command: ms 400
  这个机器人还可以作出很多延伸,比如加上吃、喝的动作或者存盘的动作,如果又出现新的情况,也可以再添加Trigger ,不过如果你花在练功上的时间远远少于睡觉,打坐,冥思的时间,那么我劝你把内力,法力练练再用这个机器人吧。
  (3)最后有个有用的工作,就是设置一个按钮(Button)。在这之前,你必须把上面的所有Triggers归到一个类中,给这个类命一个名,比如:practice.选择Actions->Make button菜单,如下填写:
  Toggle 选定
  Off caption: off practice
  On caption : on practice
  On command : #t+ practice;pp1
  Off command: #t- practice
  这样,在屏幕上会出现一个控制按钮(默认的位置在窗口的左上角)。当我们按下这个按钮时,机器人就将工作;再按一下,停止工作。是不是特方便呀?
  2.3 战斗中的学习西游记中通过战斗得到的潜能最高只能是100,到了100就必须到师傅那儿去学习,然后再回来继续战斗,如果用手工的方法操作这个过程,简直不敢想象会多么麻烦!幸亏有了Zmud,有了robot,这个问题不再复杂了。怎样从屏幕上获取潜能的数值呢?我们用“hp”这个命令可以显示出如下的结果:
  气血: xxx / xxx (xxx%) 内力: xxx / xxx (xxx%)
  精神: xxx / xxx (xxx%) 法力: xxx / xxx (xxx%)
  食物: xxx / xxx 潜能: dd饮水: xxx / xxx 道行:xxxxxx
  这样我们可以定义一个变量qn存放潜能的数值。然后定义如下的Trigger:
  Pattern: 潜能:(%s)(%d)
  Command: qn=%2
  就这么简单,每次我们键入命令“hp”后,我们就会获得潜能的值,并把它放在变量qn中。然后我们可以判断这个值的大小,从而采取行动。比如:
  pattern: 潜能:(%s)(%d)
  Command: qn=%2;#if (%2>90) {gomaster;say study} Pattern: 你说道:study Command: #if (@qn<5) {#wait 3000;gofight} {learn xxx from xi for xxx;#wa xxx;11;hp;#wait 1000;study}(这条命令还可以写的灵活一点)
  这样,当潜能大于90时,就会到师傅那儿去学习(gomaster是到师傅那儿的路径);学的时候也在判断潜能,如果少于5,那么就回去继续战斗(gofight是回去战斗的路径),否则就继续学。你需要首先定义两个别名gomaster和gofight.同样为了方便操作,这个机器人也要设定一个按钮(button),方法跟上例基本一样,我就偷一下懒了,留给你们自己完成去吧!
帅哥 dragonziwen 当前离线  
回复时引用此帖
旧 2009-04-28   #3
中级会员
级别:1 | 在线时长:12小时 | 升级还需:3小时
 
dragonziwen 的头像
 
注册: 09年02月07日
来自: 广州
帖子: 56
声望力: 16
声望: 12 dragonziwen 闻道则喜
现金:76两梁山币
资产:76两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0
回复: ZMUD编程入门 (加精加声望)

ZMUD变量入门
  想要较好地把zMUD使用起来,事实上的确需要一定的编程基础,不过要求不高,一般的Basic概念即可。最重要的,是我们能对用计算机模拟我们思考解决问题的方法有一个简单的认识。在下面只是把变量的简单道理讲一下,方便更多zMUD的新手。为了更加易懂快速上手,文章中的理论概念基本上我都使用实际的例子解释,即使道理一时想不通,也不怕,知道怎么去做就行了。
  1. 为什么要使用变量
  变量的引入,是因为我们在MUD中接触到的信息基本上都是不断在变化的,为了实时处理这些信息,我们通过变量的应用,可以把很多编程的概念溶入mud play中,使我们能够通过简单的界面操作从而自动、精确地完成 MUD 中一些复杂、繁琐的动作。
  例如,前面“自动卖花”的设计中,我们使用了一个变量WH_ChineseName来存储对方的中文姓名,这样在后面我们才能再通过WH_ChineseName进一步获得买花对象的英文ID, 并存储到变量WH_IdName中,最后才可能最终使用give命令把花递到对方的手上。如果没有变量的引入,这个过程是完成不了的。

  2. 怎么定义变量
  变量包括两个组成部分: 变量名和变量值。一个变量的使用必须首先定义过变量名才行。变量名可以随便自己取,通过zMUD顶部按钮“Variable”来定义是简单的方法。例如我们前面文章中定义的WH_ChineseName,WH_IdName,WH_Class等等, 其名称上都是自己随意定的。定义一个新的变量时,我们一定要明确定义该变量的目的:即用它来做什么? 例如我们很明确WH_ChineseName是用来存储对方中文名字的,而WH_IdName是用来存储对方英文ID的等等。
  变量使用的一个忠告是:尽量能从变量名上反映出该变量的含义。如果我们把WH_ChineseName改为abcd,可想而知我们无法从abcd看出它用来做什么用,而WH_ChineseName却一目了然。
  变量使用的另一个忠告是:尽量把变量从变量名上分类。因为可能我们会用到很多变量,最后混杂在一起时,只会给自己找麻烦。就象WH_ChineseName和WH_IdName一样,字面上我们已经知道他们是用于WH(问候)的,编写其他类设计时,就不会搞混它们。

  3. 怎么给变量赋值
  zMUD中,变量可以直接赋值,并且变量不分字串、数字变量等概念,你给它们什么它们就是什么。
  例如: WH_ChineseName=东方英雄,WH_IdName=hero,WH_Class=1。
  在从triggers中获取信息时,变量可以参数形式赋值。
  例如: 屏幕上显示“东方英雄想向你购买「flower」”时,如果定义:
  pattern: (%x)想向你购买「(%x)」。
  command: WH_ChineseName=%1;WH_Object=%2
  则表示把pattern中抓取的第一个参数赋值给WH_ChineseName,把第二个参数赋给WH_Object。这样“东方英雄”字串便自动放到了变量WH_ChineseName中,“flower”字串则放到了变量WH_Object中。这里pattern中的第一个(%x)表示抓取字串“想向你购买”前面的任意字符串作为第一个参数,而第二个(%x)表示抓取字串“想向你购买”后面的任意字符串作为第二个参数。command 中的%1表示拿出第一个参数,同样%2,%3……则顺序表示拿出第二、第三……个参数。
  对于有关%x,%1……等以及其他更多参数符的说明,请自己参考zMUD的help,这里不多讲。

  4. 怎么把变量使用起来
  在“自动卖花”的设计中有下面一个 triggers:
  pattern: (@WH_ChineseName)(%s)= (%x)
  command: #if (@WH_Class=1) {WH_IdName=%3;say 10 silver 一朵。;thank @WH_IDName} {WH_IdName=%3;give flower to @WH_IDName;gongxi @WH_IDName}
  我们可以看到,变量使用的时候,只要不是赋值,变量名前面就应该加上符号“@”,这样,zMUD就会自动使用变量对应的值了。
  5. 总结
  到这里,应该可以明白,利用基本的编程思想,基于zMUD为我们提供的Variable和Triggers功能,我们的确可以在zMUD中针对mud play的具体要求来编写一些小程序,而这些程序的编写并不象想象中那样复杂,只是需要我们更多地了解zMUD到底为我们提供了什么手段来实现,我们要做的其实只是把编程思想溶入到这些手段中即可。
帅哥 dragonziwen 当前离线  
回复时引用此帖

旧 2009-04-28   #4
中级会员
级别:1 | 在线时长:12小时 | 升级还需:3小时
 
dragonziwen 的头像
 
注册: 09年02月07日
来自: 广州
帖子: 56
声望力: 16
声望: 12 dragonziwen 闻道则喜
现金:76两梁山币
资产:76两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0
回复: ZMUD编程入门 (加精加声望)

ZMUD触发入门
  一、认识TRIGGERS
  什么是TRIGGERS,TRIGGERS类似于一般编程结构中的IF……THEN结构。其中有三个主要的参数:Pattern、Command、Enable/Disable。说的通俗一点,当接收到 Pattern 的时候,自动输入 Command.而En/Disable可以另其活动或不活动。另外Class可以为TRIGGERS定义一个类名,方便操作。
  举个简单的例子:Pattern为“官兵死了”,Command为“get all from corpse”,则当ZMUD接收到“官兵死了”,自动发出“get all from corpse”。在更高级的技巧中,把TRIGGERS、ALIAS、VARIABLE、Function、ZMUD内部命令联用,可以取得相当好的效果。
  例如:
  做一个ALIAS:#alias dk drink @drinkwhat
  TRIGGERS1:
  Pattern=“你买下一个牛皮酒袋”
  Command=“drinkwhat=jiudai”
  TRIGGERS2:
  Pattern=“你捡起一个清水葫芦”
  Command=“drinkwhat=hulu”
  那么当你喝水的时候,只需要打dk,而喝什么TRIGGERS自动更改(不论你喝buy jiudai或是get hulu)。
  这当然只是个简单的例子,要想做更复杂的请先读通Help.另外在TRIGGERS有一些wild-card可以运用,详细参见ZMUD Help。

  二、和TRIGGERS相关的主要命令
  最重要的命令就是“#t+”、“#t-”。这两个命令可以激发和取消某个特定类别TRIGGERS的活动状态。另外#IG可以忽略或重新不忽略全部TRIGGERS。

  三、运用TRIGGERS应注意的问题
  在MUD中做TRIGGERS,自动练功能节省大量的时间、精力,当然也省去了输入大量命令的麻烦。但是请注意,在MUD中大量运用TRIGGERS做ROBOT是存在一定危险性的。首先,MUD中明文规定禁止用ROBOT练功,如果被巫师抓到,只能自认倒霉。
  其次,PKER可以利用TRIGGERS杀人。例如:你有一个TRIGGERS是这样的,当“你一觉醒来……”然后“xxxxx”(多个命令),那么他可以想办法让你接收到多个“你一觉醒来……”,之后嘿嘿嘿……
  再次,TRIGGERS 做的不好,输入命令过多,那么闪电是不会放过你的。你当时就晕了,别人可以kill、get all、再绝一点可以下毒、背你到杀人NPC处……,你等于把自己放在菜板上,任人宰割。即使没人害你,你也浪费了大量时间。
  还有许多应该注意的问题,这只是必须切记的三点。下篇我将结合自己的心得,讲一下做TRIGGERS应注意的问题。

  四、如何避免TRIGGERS带来的弊病
  1、在上面我说了,TRIGGERS由PATTERN激活,那么在用的时候应该尽量避免错误的接收到PATTERN。例如:关闭不使用的交谈频道(chat,rumor,tell),在TRIGGERS 中将PATTERN尽量做长,同时尽量限定其活动条件(例如用^可以使PATTERN仅在输出行头相同时作用)。练功的时候找一个不容易给人发现的地方,同时要经常更换练功地点。
  2、做TRIGGERS应该避免一些经常出现或容易被人猜到的PATTERN,如果必须这样,那么在此TRIGGERS不应激活的时候,用#t-将其至为Disable。最好在PATTERN中加入对变量,对当时情况加以判定。另外需要经常激活的TRIGGERS中,必须将命令数目缩短,防止错误活动。
  3、对于某些高频率出现的PATTERN,可以利用一个变量来判定是否输入命令。
  例:在打NPC的时候,会做以下TRIGGERS:
  A 当你输的时候的Pattern
  B 当NPC输的时候的Pattern
  那么在打10个以上NPC的时候,如果用普通方法做,那么在NPC接连跳开的时候,很容易在短时间内超过40条命令,当即晕倒。所以,应该在这时候用一个变量来判断是否已经输入了大量命令,当前是否应该输入命令(可以用变量结合#if命令来做。
  4、尽量多用主机命令alias,将常用的命令用短命令代替。这有助于减低网络通信量,解决由于缓冲区造成的问题。或者干脆关闭MODEM缓冲(这似乎不太可能)。
  5、在用TRIGGERS来du shu,lian parry等的时候可以用一个变量随机的做一些动作,不让别人知道你是ROBOT。除了丐帮,其他帮派弟子要知道多个可以sleep的安全地点,避免巫师瓮中捉鳖(嘿嘿,巫师看了不要生气哟)。另外在命令串中#wa的时候,要#t-掉一些不应该激活的TRIGGERS。
  6、在输入大量命令的时候,将命令分解为多个小命令,然后顺序执行效果比一条长命令(中间有#wa效果好)。例如你一觉醒来就xxxxxxx,不如你一觉醒来x1、之后x2、x3……这在一定程度上可以解决缓冲区问题。
  7、在TRIGGERS中加入变量,ZMUD命令等,使其带有一定的判断性。
  8、记住,目前在MUD中SLEEP大概是10秒。那么WAIT超过10秒似乎就……
  9、各位试试在被闪电击中醒来后再输入大量命令,看看有什么结果?hehe……
  下一篇将着重介绍TRIGGERS中经常使用的WILDCARDS。

  五、TRIGGERS常用技巧
  1、WILDCARDS
   * 通配任何数字、字符或空白? 通配任何单个字符%d 通配任何数字(0-9)
  %w 通配任何字母(a-z)
  %a 通配任何数字和字母(等于%d+%w)
  %s 通配任何空白(spaces,tabs)
  %x 通配任何非空白
  [range] 通配任何在range范围内的字符
   ^ 强制PATTERN在行头时显示,TRIGGERS才有作用
   $ 强制PATTERN在行尾时显示,TRIGGERS才有作用
  (pattern)将参数带给TRIGGERS(%1-%9)
  ~ 提示系统将~后字符当作字符而不是wildcards
  {val1|val2|val3|……} 在PATTERN中核对多个显示数据
  {^string} 在PATTRN中不核对该字符串同时你可以在PATTERN中运用变量,变量在PATTERN起作用之前,会被替代。
  重点:如何利用WILDCARD抓状态:
  抓气: ^%s气%s(%d)*/%s(%d)
  %s~(^^^^%1 ^^^^%2
  这个PATTERN返回两个参数%1、%2(分别表示当前气、气上限),那么在COMMAND中就可以针对以上两个参数利用ZMUD函数和命令进行自动判断,制作有智能的TRIGGERS。
  例 1:COMMAND为 '#math dazuohow %1-20;#if %1>50 {dazuo @dazuohow}'
  则:当当前气>50的时候,打坐剩下20点的气。
  例 2:COMMAND为 '#if %1<150 {yun recover}'
  则:当当前气<150的时候,利用内力补充气。
  同样道理,你可以制作更复杂的TRIGGERS,针对当前ID情况做不同的行为。例如受伤了就YUN HEAL,饿了就EAT等等……。还可以利用CASE增强TRIGGERS。
  例 3:有些人的TRIGGERS中“看起来想杀死你”马上QUIT.可能是想杀他的人太多了,不愿意一个一个做,也可能是太懒不愿意去判断。结果,hehe.某次,有人把毒蛇放在四个城门口和客店。我亲眼目睹至少10个ID碰上毒蛇就就QUIT,包括一些高手。HAHA……当时钱少,于是拣东西拣的不亦乐乎。hahaha……。其实把人物名字抓下来判断一下不是很麻烦的。
  2、TRIGGERS状态与选项
  主要选项:
  1、When load En/Disable:确定当mud文件被load的时候,TRIGGERS是否活动。
  2、Triggers on New line/Prompt:确定PATTERN是否接收完一行才核对(是否接收到CR字符)
  3、TRIGGERS ON TRIGGERS:是否在TRIGGERS中启用TRIGGERS
  主要状态:
  En/Disable 确定TRIGGERS当前是否活动
  主要命令:
  #t+ {classname} 将classname指明的TRIGGERS DISABLE
  #t- {classname} 将classname指明的TRIGGERS ENABLE
  #ig 忽略所有TRIGGERS
  3、在TRIGGERS中经常用到的运算符
  + 加
  - 减、负号
  * 乘
  / 除
  \ 取模
  &、and AND运算
  |、or OR运算
  xor XOR运算
  ! NOT运算
  = 等于
  > 大于
  < 小于
  >= 大于等于
  <= 小于等于
  <>、!= 不等于
  =~、~= 包含
  例 1:利用“|”来多重判断。“|”代表“或”的意思。
  如:“{江百胜|武将}向后”=TRIGGERS1“武将向后”+TRIGGERS2“江百胜向后”,这点在需要判断多个主体做同一动作时十分有用。
  4、综合例子:下面举一个简单的综合例子,可以从客店为基点自动把扬州4门的兵抓到中央广场,然后回到客店。
  1)变量:NPC (默认值:BING) TIME (默认值:1)
  2)ALIAS:
  get1:time=1;w;s;#3 e;hit @npc
  get2:#3 w;#3 n;hit @npc
  get3:#3 s;#3 w;hit @npc
  get4:#3 e;#3 s;hit @npc
  gobackdrop:#case (@time) {#3 w;drop @npc;#3 e} {#3 s;drop @npc;#3 n} {#3 e;drop @npc;#3 w} {#3 n;drop @npc;#3 s}
  3)TRIGGERS:
  1、所有你赢的时候:hit @npc
  2、官兵脚下一个不稳... :halt;get bing;gobackdrop;hit @npc
  3、你要攻击谁? :#if @time<4 {#add time 1;get@time} {#4 n;e}
  这是个非常简单的例子,其中有很多可以改善的地方。我以前用来抓NPC用的TRIGGERS就和上面的差不多(现在当然复杂多了,hehe……)。上面只是个基形,大家可以参考例子不断创新完善。要知道,我现在一上网就抓NPC,抓10个用不了5分钟。另外大家还可以利用每次进来地点固定的方法。例如在客店SAVE,然后一联线就抓NPC,利用丐帮秘道搬回去,之后QUIT再联,又在客店了,呵呵……再抓!(reconnect 变量不清零)。这点对于来回路途长的门派特别有用(例如少林)。
帅哥 dragonziwen 当前离线  
回复时引用此帖
旧 2009-04-28   #5
高级会员
级别:3 | 在线时长:47小时 | 升级还需:3小时级别:3 | 在线时长:47小时 | 升级还需:3小时级别:3 | 在线时长:47小时 | 升级还需:3小时
 
jsad 的头像
 
注册: 06年03月02日
帖子: 143
声望力: 20
声望: 15 jsad 闻道则喜
现金:238两梁山币
资产:426两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0
回复: ZMUD编程入门 (加精加声望)

这个我怎么好像看过了,原创?
jsad 当前离线  
回复时引用此帖
旧 2009-04-28   #6
中级会员
级别:1 | 在线时长:12小时 | 升级还需:3小时
 
dragonziwen 的头像
 
注册: 09年02月07日
来自: 广州
帖子: 56
声望力: 16
声望: 12 dragonziwen 闻道则喜
现金:76两梁山币
资产:76两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0
回复: ZMUD编程入门 (加精加声望)

自己顶一下!!!!!!!!!!!!
帅哥 dragonziwen 当前离线  
回复时引用此帖

旧 2009-04-28   #7
天平座童虎

级别:39 | 在线时长:3969小时 | 升级还需:131小时级别:39 | 在线时长:3969小时 | 升级还需:131小时级别:39 | 在线时长:3969小时 | 升级还需:131小时级别:39 | 在线时长:3969小时 | 升级还需:131小时级别:39 | 在线时长:3969小时 | 升级还需:131小时级别:39 | 在线时长:3969小时 | 升级还需:131小时
 
fengyue_xyj 的头像
 
注册: 02年05月24日
来自: 莲花宝座
帖子: 5,940
声望力: 97
声望: 1638 fengyue_xyj 脱胎换骨fengyue_xyj 脱胎换骨fengyue_xyj 脱胎换骨fengyue_xyj 脱胎换骨fengyue_xyj 脱胎换骨fengyue_xyj 脱胎换骨fengyue_xyj 脱胎换骨fengyue_xyj 脱胎换骨fengyue_xyj 脱胎换骨fengyue_xyj 脱胎换骨fengyue_xyj 脱胎换骨
积分:18
精华:29
现金:3129两梁山币
资产:1701001两梁山币
致谢数: 2
获感谢文章数:9
获会员感谢数:9
回复: ZMUD编程入门 (加精加声望)

您好,转帖请注明,谢谢!

西游记2000新纪元的历史性时刻:现在时间 Mon Oct 07 01:34:56 CDT 2003
第一个全白的人物出现了
check fengyue
你口中念了几句咒文,眼中突然精光一闪,大喝一声“顺风耳何在!”
只听嘿嘿几声奸笑,不知从哪里钻出来一个肥头大耳的家伙,在你耳边低声说了几句话。
顺风耳告诉你:痴风梦月的道行已达天人合一的境界。
顺风耳告诉你:痴风梦月的武功已达深不可测的境界。
顺风耳告诉你:痴风梦月的法力修为已达法力无边的境界。
顺风耳告诉你:痴风梦月的内力修为已有一甲子的火候。
你忽然莫名其妙地哆嗦了一下。
你急忙掐指一算,原来是痴风梦月(fengyue)正在打听你的道行。

总站最神奇的老尼姑。唯一一个死掉了15M武学还有15M武学、死掉了三万年道行还有三万年道行、拜了观音学了佛法还娶了老婆的、整天活蹦乱跳但又没人看得见的、神经兮兮、傻傻乎乎的、身受女孩子爱戴、身受男孩子痛恨的、长得很帅又风情万种的、看起来是八十多、实际上是六百多岁的、人称小甜甜的老太婆。
帅哥 fengyue_xyj 当前离线  
回复时引用此帖
旧 2009-04-29   #8
中级会员
级别:4 | 在线时长:58小时 | 升级还需:17小时
 
kkkkk 的头像
 
注册: 05年08月31日
帖子: 224
声望力: 21
声望: 10 kkkkk 闻道则喜
现金:0两梁山币
资产:30342两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0
回复: ZMUD编程入门 (加精加声望)

老帖子也不容易啊,这里现在没什么新帖子,还是我看的少的缘故?
inn
kkkkk 当前离线  
回复时引用此帖
旧 2009-05-06   #9
中级会员
级别:2 | 在线时长:24小时 | 升级还需:6小时级别:2 | 在线时长:24小时 | 升级还需:6小时
 
yingxr 的头像
 
注册: 09年04月28日
帖子: 60
声望力: 15
声望: 12 yingxr 闻道则喜
现金:1455两梁山币
资产:1455两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0
回复: ZMUD编程入门 (加精加声望)

顶一下,好用!!!!!!
yingxr 当前离线  
+500 两梁山币
回复时引用此帖

旧 2009-08-09   #10
高级会员
级别:9 | 在线时长:244小时 | 升级还需:31小时级别:9 | 在线时长:244小时 | 升级还需:31小时级别:9 | 在线时长:244小时 | 升级还需:31小时
 
yorkmars 的头像
 
注册: 05年04月16日
来自: 东海龙宫
帖子: 244
声望力: 21
声望: 52 yorkmars 初领妙道
积分:4
精华:1
现金:122两梁山币
资产:322两梁山币
致谢数: 2
获感谢文章数:1
获会员感谢数:1
回复: ZMUD编程入门 (加精加声望)

caidao yingxr beg yingxr 给我也加点lsb吧
yorkmars 当前离线  
回复时引用此帖

发表新主题 回复

添加到书签

主题工具
显示模式 对此主题评分
对此主题评分:

发帖规则
不可以发表主师
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子

论坛启用 vB 代码
论坛启用 表情图标
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为格林尼治时间 +9, 现在的时间是 07:35.


Powered by SPLS
版权所有 2001-2023 水泊梁山
皖ICP备05012024号

站长 fengyue

Content Relevant URLs by vBSEO 3.6.1