Mud--教程

  • 格式:pdf
  • 大小:271.05 KB
  • 文档页数:36

复杂Mud机器人编写指引(结束)开始起的名字不是特别恰当,修改一下本篇文章的题目,再次重申一下写本文的初衷。

我写本文不是为了鼓励全自动机器人,仅以此文帮助想要深入Zmud/Cmud系列软件编程的人员提高在这方面的技巧。

本文只是不是非常恰当的引用护镖机器人作为例子来讲解。

本文的头三章主要是对我附件提供的机器人做一些简单的铺垫,方便大家能够比较容易阅读我写的机器人。

后面第四章讲解主流的几种设计思路,第五章对如何设计path进行讲解,第六章讲解护镖出现乱入的时候如何重新定位,第七章讲解小范围区域搜索,第八章讲解大范围区域搜索(没有开发这方面的代码,主要是本人对胡一刀任务和task任务兴趣不是特别大,纯理念上讲讲,觉得不对请补充),第九章讲讲如何设计返回线路,第十章总结。

一、序言本教程主要目的是如何帮助大家提高自己的护镖机器人的自动化水平。

最近有一些人陆续向我索要自动化护镖机器人,一来这个东西传播出去确实不是特别好,本游戏官方对这个也不是特别鼓励,二来索要人和本人确实不是特别熟悉,提供出去无法保证传播范围。

我仅以写这个系列文章帮助大家提高护镖机器人的自动化水平。

本系列文章估计会有10个左右章节,目标是差不多以一到二周时间写完。

在开始护镖之前首先你要确认的是机器人的编程平台。

目前主流的平台有以下几种:Zmud462,Zmud721,Cmudpro237,Mushclient440。

我就简单分析一下几个平台的优缺点。

Zmud462平台好处是中文支持比较好,缺点是主流的一些技术都无法支持,包括列表,data record等等,基本上复杂的机器人不建议在这个平台上开发,包括护镖机器人,实际上你也很难在Zmud462平台开发出一个良好的易于维护和使用的自动护镖机器人。

Zmud721平台好处是目前常用的一些Zscript技术他基本上都能支持,而且稳定性比较好,缺点是对中文支持非常差,对结构化编程所需要的一些技术包括函数、过程等不支持。

如果你的护镖机器人需要使用到区域搜索、位置定位等等技术最好不要挑选这个平台。

Cmudpro237是Zmud系列软件的最新升级版,优点是支持多线程技术性能比较好,中文支持比较好,支持Xml,提供结构化编程的可能性,支持Lua等等,缺点是平台本身稳定性不是特别良好,对编程人员要求比较高。

Mushclient440平台没有怎么使用过,简单说一下优点吧就是使用Lua开发,语言上比较规范,稳定性非常好,缺点就是对Mud本身的支持没有Zmud/Cmud系列有非常丰富的内置功能,对开发人员有一定的素质要求。

具体到了自动护镖机器人开发上我建议新入门的选择使用Cmudpro237平台,一来是该平台兼容Zmud使用上难度比较小,二来是语言比较规范,三来是可以使用内置的Map函数。

我下面讲的东西将都是以Cmudpro237为平台的,就不再特殊说明了。

选好平台以后我讲讲一个自动化护镖机器人的几大挑战。

一共有四方面挑战:如何根据林镇南给出的目的地提示设计出一条良好的护镖线路;如何在乱入的时候回到预设的护镖线路上;如何在到达目的地没有找到伙计的情况下通过区域搜索找到伙计;在完成任务或者半路被劫匪打晕的情况下如何找到返回路径交镖或者取消任务。

我会在下一个章节以这四个方面一一展开讲解,大体设想是每个方面二个章节,每讲完一个方面提供相应的样板源代码供大家参考。

附件为护镖机器人样板源代码,包括所有的alias,events,functions,变量定义和部分的护镖机器人代码。

我在以后章节我结合该源代码逐步讲解。

本源代码和我自己设计的数据库紧密结合,直接使用是使用不了的。

在接下来讲解之前先把这个xml文件导入的一个新开的cmudpro的session里面。

二、基础环境介绍本节主要介绍设计相关的一些基础事件、基础函数、基础数据结构。

方便大家解读护镖机器人。

在本护镖机器人中地图数据库如何实现以及用什么的方法才能获取房间信息到机器人中有两个开放式接口来实现的。

分别是pubFunc|roomFunc下的函数batch_room_info和函数room_info,这两个函数如何实现需要你们根据自己的地图数据库特征自己开发。

其中room_info是送入一个房间编号输出房间信息结构,batch_room_info是输入一个模糊条件返回一个房间信息结构列表(SQL语言标准条件)。

这里首先要说的本机器人公用的房间信息结构如下:#new$room_desc{id=0|name=""|direct=""|rel_id=""|rel_name=""|desc=""}其中id是房间号,name是房间名称,direct是本房间的所有方向(其中自定义命令统一变成commands),rel_id是相邻房间号,rel_name是相邻房间名称,desc是房间描述(不能存在换行,必须进行trim处理去掉空格)。

比如取中央广场的房间信息命令如下:#show@room_info(5)结果如下:direct="west|east|north|south|up|commands|down|northwest"|id=5|desc=这里是城市的正中心,一个很宽阔的广场,铺着青石地面。

一些游手好闲的人在这里溜溜达达,经常有艺人在这里表演。

中央有一棵大榕树,盘根错节,据传已有千年的树龄,是这座城市的历史见证。

树干底部有一个很大的洞(shudong)。

你可以看到北边有来自各地的行人来来往往,南面人声鼎沸,一派繁华景象,东边不时地传来朗朗的读书声,西边则见不到几个行人,一片肃静。

|name=中央广场|rel_id="4|6|10|13|42|350|1371|2527"|rel_name="西大街|东大街|北大街|南大街|赏月台|树洞内部|销金窟|北侠饺子馆"batch_room_info函数返回的房间信息结构列表是一个list,里面的元素是房间信息结构。

比如取扬州的所有西大街的命令如下:#show@batch_room_info("zoneid=1and objectname='西大街'")结果如下:"direct=""west|east|south|north""|id=2|desc=你走在西大街上,感到这里的街面要比别处的干净、整洁。

南面是红娘庄,常常有一对对男女来往。

北边则是飞龙帮的总部。

|name=西大街|rel_id=""1|3|44|48""|rel_name=""西门|西大街|红娘庄大门|飞龙帮总部"""|"direct=""west|east|north|south""|id=3|desc=你走在西大街上,感到这里的街面要比别处的干净、整洁。

大概因为靠近衙门、兵营可受保护的缘故,富人们都喜欢住在这里。

东边静悄悄地没有几个行人,西边是西城门通往郊外。

南边是一座镖局,北边是一所富丽堂皇的大宅院。

|name=西大街|rel_id=""2|4|49|53""|rel_name=""西大街|西大街|财主大门|福威镖局"""|"direct=""west|east|south|north""|id=4|desc=这是一条宽阔的青石板街道,向东西两头延伸。

西大街是衙门所在,行人稀少,静悄悄的很是冷清。

东边是一个热闹的广场。

南边是兵营。

北边就是衙门了。

|name=西大街|rel_id=""3|5|55|57""|rel_name=""西大街|中央广场|兵营大门|衙门大门"""获得三个房间的信息:房间号2,3,4三个房间的信息。

1.基础事件×evtLog事件:位置events|baseEvent,主要作用以事件形式记录日志信息。

调用事件记录函数@log_info,具体祥见事件记录函数@log_info×onConnect事件:位置events|baseEvent,实现系统事件onConnect,用以自动登录。

2.基础函数×change_list:位置pubFunc|baseFunc,实现功能是列表中两个元素交换位置,有三个输入参数$list,$locate1,$locate2,其中$list为待交换的列表,$locate1为位置1,$locate2为位置2。

返回交换完为止的结果列表。

举例:@change_list("1|2|3",1,2),返回"2|1|3"×convChtNum:汉字数字计数变成阿拉伯数字计数。

举例:@convChtNum("一千零五十一"),返回1051*del_list_tail:删除列表中某一位置之后的所有元素。

输入参数:$list,$max,其中$list为列表,$max是保留的最后一个列表位置,输出删除后的列表。

比如:@del_list_tail("1|2|3",2),返回"1|2"*getItemFromRecords:从一个record列表中根据某一个key的值来寻找特定的一个record。

输入参数$recordlist,$key,$searchvalue,其中$recordlist为record列表,$key为键名称,$searchvalue为键值。

返回record。

比如:@getItemFromRecords("id=1|name=武庙"|"id=2|name=客栈",id,2),返回结果"id=2|name=客栈"*getKeyList:从一个record列表中取出某一个特定键的键值列表。

输入参数$dblist,$key,其中$dblist为record列表,$key为键名称。

举例:@getKeyList("id=1|name=武庙"|"id=2|name=客栈",id),返回"1|2"*log_info:往特定文件中记录日志信息。