背景:
阅读文章

ZMUD机器人制作(精)

机器人实例--朝廷守门机器人

[日期:2013-12-11] 来源:mud游戏网  作者: [字体: ]
这是一篇介绍机器人制作方法的帖子,因此尽管你可能不需要守门机器人,还是可以看下守门机器人的制作过程,至少没有坏处不是?
本章注释非常详细,尽管你可能不了解守门任务,仍然能很容易读懂。

建议:做机器人之前先总体规划一下,打算做成一个什么样的机器人.如果你不这样做,很多时候要花费更多的时间来修改,事实上修改比制作更费劲.更糟糕的是,有时候没法修改,你不得不重新做.

机器人的用途:仅仅为了培养朝廷大米,不适用于主id

希望机器人具备的特点:安全,稳定,效率最大化,适用面最大化,界面丰富

安全方面:拥有应付蒙面杀手和盗宝人的安全措施

稳定方面:防发呆,断线自动重连

效率最大化方面:
这是专门为大米写的机器人,守完门之后没有精力帮大米做任务,所以只希望守完门之后经验值尽可能的高,对守门的速度和花费的时间没有要求.每1次守门都力求获得8000左右的经验,由此确定效率a和b
(a):守800次门需要很长时间,不急,慢慢挂
(b):如果出现2个及以上的玩家同时守一个门,会影响守门奖励,此时退出游戏放弃守门
守完门之后有7m多,这个时候再学技能,前200级可以直接学了,高经验高读书写字高内功支持下full技能也更快更省潜能,所以晚上不守门的时候没事可做了.由此确定效率c
(c):天亮时上线守门,守完门下线

适用面方面:没什么好说的,只适用于朝廷.机器人里保存好帐号密码就可以了.

界面丰富方面:设计好status bar,显示出我关心的所有数据.
最终确定为:每次守门杀死壮汉数目@zhuanghan,获得经验@expgrain,当前贡献度@gongxian,当前经验,守门是否成功@success

开始制作

步骤一:先做好主体部分:接任务做任务完成任务下线

#tri {你向多隆打听有关『守门』的消息。} {#t+ job}
//多隆的回答全部取一个class名:job
#tri {这里没有这个人。} {#t- job;#wa 20000;ask duo about job} {job}
#tri {但是很显然的,多隆现在的状况没有办法给你任何答覆。} {#t- job;#wa 20000;ask duo about job} {job}
//多隆死了或者晕了,等待20秒再要任务
#tri {多隆说道:「大人位高权重,已经不用干这种活了。」} {#t- job;#play xxx.wav;#var zhanghao {};#var mima {};quit} {job}
//守门结束了,清空帐号密码阻止自动连线,播放一首音乐轻松下
#tri {多隆说道:「大人需要升迁之后再继续作守门任务。」}
            {#t- job;do 3 s;do 4 w;s;s;ask ming zhu about bonus;ask ming zhu about 升迁;n;n;do 4 e;do 3 n;ask duo about 守门} {job}
#tri {多隆说道:「守门只有早晚两班,你到时间再来吧。」} {#t- job;#timer on} {job}
//上线时间不一定准确,此时打开tick timer以确保不会发呆10分钟掉线,然后等待天色触发
设置tick timer,每300秒输入1个hp命令,仅仅为了保证不会发呆掉线
#tri {你的任务是去(*)守门。} {#t- job;%1} {job}
//注意,这里的做法很巧妙,用任务地点做为命令,请看下面定义的alias,你就会明白了
#alias {东直门} {do 3 s;e;guarding}
#alias {阜成门} {do 3 s;do 7 w;do 3 s;guarding}
//alias是可以取中文名字的,直接用任务地点制作路径alias,可以省去很多#case#if的判断
//鉴于篇幅考虑,不一一写出18个地点的alias了,此文主要介绍机器人的制作方法,请原谅

注:我看到有的人把多隆吩咐任务这句话做成18个trigger,每个trigger单独指定去目标地点的路径和返回的路径,或者为每个门编上号码,然后通过号码来确定去和回的路径,需要用一个很长的#case命令,比我的这个方法复杂了很多很多倍

注:前面章节中曾经提到过能简洁坚决不要复杂,越简洁的东西越稳定;而且一个复杂的大型机器人拥有很多触发变量和别名,简洁一倍,花在修改和测试上的时间可能就节约10倍,至少在本例中假如我guarding拼写错误,我只需要改一个trigger而不是去改18个trigger

注:由于这里采用守门结束下线的方法,所以不需要返回的路径。鉴于有的同学需要返回多隆那里打坐吐纳或者继续守晚上,下面用紫色文字给出返回的实现方法,看是否比你的方法简单
#tri {你的任务是去(*)守门。} {#t- job;%1} {job}
#alias {东直门} {do 3 s;e;guarding;#var fanghui 东直门b}
#alias {东直门b} {w;do 3 n}
#tri {城门的钟敲了两下,你的换班时间到了。} {halt;#wa 3000;halt;@fanghui}
//在去的时候将返回的命令保存在@fanghui里面,回来时全部统一的输入@fanghui就可以了,如果你细心的话,类似方法在第三章中就已经介绍过了

步骤二:把所有天亮的天色描述做成trigger

#tri {【 天色 】风吹起来了,和着东升太阳的万道金光,清晨不似从前那般凉爽} {#timer off;ask duo about 守门} {天色}
//别忘了关掉tick timer,为了篇幅考虑,下面只给出所有的天色描述,trigger的做法完全一样
//最好为所有的天色描述去一个class名:天色,然后单独保存起来便于以后加载
【 天色 】金黄色的太阳刚从东方的地平线上冉冉升起
【 天色 】起风了,树木光秃秃的在风中瑟瑟的发抖
【 天色 】起风了,新发芽的枝叶在风中幽雅的摇弋着
【 天色 】起风了,一片片发黄的树叶,纷纷扬扬随风飘起
【 天色 】秋雨淅沥沥地下了起来,凉丝丝的
【 天色 】如雾的小雨带着春意,飘向每个闲情的窗口
【 天色 】太阳从东方的地平线冉冉升起,放射着耀眼的光芒
【 天色 】太阳从东方的地平线升起了
【 天色 】太阳从东方的地平线升起了。一片红红的朝霞
【 天色 】太阳从东方的地平线升起了,苍白无力地发射着光芒
【 天色 】太阳从东方升起来了
【 天色 】太阳刚从东方的地平线升起
【 天色 】太阳露在东方的地平线上,显示了一天的勃勃生机
【 天色 】太阳升起来了,躲在云层后面呼呼地喘着气
【 天色 】太阳吞吐着万道金芒,跃出地平线,大地一片金黄
【 天色 】太阳在东方的天边吞吐着万道金光,太阳升起来了
【 天色 】天光终于放亮了,风裹着云在天上飞速的跑着
【 天色 】微风带着一缕泥土的芳香吹了起来,天光放亮了
【 天色 】细若牛毛的春雨淅沥沥地下了起来,早起的小鸟欢快地呢喃着
【 天色 】小雪夹杂着雨无声无息的下着
【 天色 】小雨正淅沥沥地下着
【 天色 】雪加着绵绵的小雨无声的下着,不一会地上就湿了
【 天色 】一道耀眼的金光倏的从东方的天边射了出来,一轮红日喷薄而出
【 天色 】一道耀眼的金光倏的从东方的天边射了出来,一轮红日升了起来
【 天色 】一道耀眼的金光倏的从东方的天边射了出来,一轮红日跃出天际
【 天色 】一轮红艳艳太阳刚从东方的地平线升起
【 天色 】又是一个新年的早晨,从东方的天边射了万道霞光,一轮红日跃出天际

步骤三:制作守门过程

#tri {你一叉腰,对身旁的官兵道:*。} {#t+ 守门;#var success 进行中.....;#var zhuanghan 0;#var expgrain 0}
//这句话出现表示守门正式开始,打开守门class,接下来所有的触发都取一个class名:守门
//在定义status bar的时候要用到@success,用来显示守门前,守门成功,守门失败,守门进行中.....,守门被干扰5种情况,方便查看
//@zhuanghan和@expgrain也用在status bar中,用来查看守门过程中杀敌数目和守门奖励
#tri {江湖汉子快步走了过来。} {pancha jianghu hanzi} {守门}
//盘查江湖汉子。白天守门任务有2类,其中之一需要盘查江湖汉子。

#tri {*对着(*)大喝道:挡我者死!} {#if (%1!=你) {#t- 守门;退出}} {守门}
#tri {江湖汉子一言不发,陡然向(*)发难。} {#if (%1!=你) {#t- 守门;退出}} {守门}
//其他玩家也在同一个地方守门,受到干扰,退出游戏

#tri {官兵拦住(*)说道:看告示了没有?您想进带着*进城呐?先问问*大人吧!} {#if (%1!="壮汉") {#var name %1;look}} {守门}
//官兵可能拦住壮汉,也可能拦住玩家蒙面杀手盗宝人,如果是后者,把名字保存到name中,同时用look来抓去玩家蒙面杀手或者盗宝人的id
#tri {@name~((*)~)} {#t- allow;#alarm +2 {#t+ allow};#var id %lower(%1);allow %lower(%1)} {allow}
//除去壮汉之外的所有人全部放行。有时候玩家可能会疯狂闯门,为了避免输入allow命令过多导致守门失败,在这个trigger触发之后短暂的关闭2秒再打开。

#tri {你一脚踢开江湖汉子的尸体,得意地笑了笑。} {#add zhuanghan 1;hp} {守门}
#tri {你踢了一脚} {#add zhuanghan 1;hp} {守门}
//守门任务有2类分别是杀江湖汉子和壮汉,做2个trigger来计算杀敌数目

#tri {你的经验增加了(*)!} {#var expgrain %1;#var success 成功;#wa 8000;#var zhanghao {};#var mima {};halt;#t- allow;#t- 守门;quit;#alarm +690 {#var zhanghao @zhanghao2;#var mima @mima2;#connect}} {守门}
//守门成功正常退出游戏之前,为@expgrain,@success赋值,关掉放行和守门2类trigger
//清空zhanghao,mima阻止自动连线,11分半之后zhanghao,mima的值还原,重新连线

#tri {你本次守门任务看来做得并不成功!} {#var success 失败;#wa 8000;#var zhanghao {};#var mima {};halt;#t- allow;#t- 守门;quit;#alarm +690 {#var zhanghao @zhanghao2;#var mima @mima2;#connect}} {守门}
//这是由于放行次数过多导致守门失败的trigger,尽管这种情况出现可能性非常小,还是必须要考虑到的,将@success的值改变为"失败"

#tri {慢慢地你终于又有了知觉....} {jifaskills;退出} {守门}
//有放行和受伤自动退出为你的安全作双重保障,但是仍然不能100%保证安全,这个trigger有必要加上
//这里jifaskills退出都是alias,退出这个alias用于所有的非正常退出

#alias jifaskills {jifa dodge juemen-gun;jifa staff juemen-gun;jifa parry juemen-gun}
//没什么好说的,死了之后重新jifa
#alias 退出 {#var success 被干扰;#var zhanghao {};#var mima {};#var time [1440-%ctime-30];halt;quit;#alarm +@time {#var zhanghao @zhanghao2;#var mima @mima2;#connect}}
//mud中一天是24分钟,不论你何时退出游戏,只需要等待[1440-%ctime]秒之后就是天亮,这里为了提前半分钟上线,多减了30.退出前将success的值改为"被干扰".

步骤四:仅仅有放行还是不够安全,加入受伤自动退出;如果你已经将挨打的信息都做成了trigger,那么只需要载入就可以了

#TRIGGER {( 你气喘嘘嘘,看起来状况并不太好。 )} {exert recover} {安全}
#TRIGGER {( 你似乎十分疲惫,看来需要好好休息了。 )} {exert recover} {安全}
#TRIGGER {( 你受伤过重,已经有如风中残烛,随时都可能断气。 )} {halt;#untr +@time;退出} {安全}
#TRIGGER {( 你摇头晃脑、歪歪斜斜地站都站不稳,眼看就要倒在地上。 )} {halt;er;#untr +@time;退出} {安全}
#TRIGGER {( 你看起来已经力不从心了。 )} {halt;#untr +@time;退出} {安全}
#TRIGGER {( 你受了相当重的伤,只怕会有生命危险。 )} {halt;#untr +@time;退出} {安全}
//注意:这几个trigger可能有多个被触发,而触发时间略有差异,那么就会同时创建好几个alarm类型的trigger,因此这里创建新的alarm类型trigger之前用#untr +@time删除旧的trigger

步骤五:加入重新连线功能,并且做好守门之前的准备工作,吃饱喝足

#alias {atconnect} {@zhanghao;@mima;yes} {System}
#tri {欢迎来到北大侠客行!} {#var success 守门前;#t- 守门;#t- allow;#t- job;#timer off;#untr +@time;#untr +690;w;s;d;out;draw cloth;draw boots;draw head;draw surcoat;draw armor;remove all;wear all;draw staff;draw staff;wield all;#wa 4000;enter;u;hp;tell @zhanghao 已经全副武装} {准备}
//连线进入之后要做的事非常多,应该关闭的trigger全部关闭,tick timer关闭,没有及时删除的alarm也删除掉,改变success的值为"守门前"
//进入游戏领一套新手装,然后tell自己的id,然后用这句话做触发
#tri {*~(@zhanghao~)告诉你:已经全副武装} {s;s;w;drink;e;n;n;#if (@food<100) {n;n;e;buy ganliang} {#wa 3000;#say 准备就绪}} {准备}
//判断食物,小于100就去买干粮,否则准备就绪
#TRIGGER {你从店小二那里买下了一块干粮。} {#wa 3000;#10 eat ganliang;w;s;s;#wa 3000;#say 准备就绪} {准备}
#TRIGGER {穷光蛋,一边呆着去!} {#wa 3000;w;s;w;qu 30 silver;e;n;e;buy ganliang} {准备}
#TRIGGER {哟,抱歉啊,我这儿正忙着呢*您请稍候。} {#wa 3000;buy ganliang} {准备}
#tri {准备就绪} {#wa 2000;enter shudong;say 天堂有路你不走呀;d;3;ne;ne;u;sw;e;sd;e;e;do 3 ne;n;#wa 1500;do 3 e;u;e;do 4 n;#wa 1500;w;d;do 7 n;#timer off;ask duo about 守门} {准备}


还需要抓取经验,食物和贡献度,直接载入就好了
#TRIGGER {【%s饮水%s】%s(%d)%s/%s%d*【%s经验%s】%s(%d)} {#var drink %1;#var exp %2} {hp}
#TRIGGER {【%s食物%s】%s(%d)%s/%s%d*【%s潜能%s】%s(%d)} {#var food %1;#var pot %2} {hp}
#TRIGGER {贡%s献%s度:%s&gongxian$} {} {score}


步骤六:制作按钮,定义status bar

#button 0 {修改帐号} {#pr zhanghao "你的帐号";#pr mima "你的密码" "*";#var zhanghao2 @zhanghao;#var mima2 @mima}
#button 0 {删除alarm} {#untr +690;#untr +@time}
#st {杀死壮汉【@zhuanghan】个   获得经验【@expgrain】  当前经验 【@exp】 【贡献度@gongxian】  【守门@success】}


整个制作过程结束

【内容导航】
第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官方微信公众平台
热门评论