搜档网
当前位置:搜档网 › Mud--教程

Mud--教程

Mud--教程
Mud--教程

复杂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:往特定文件中记录日志信息。(其中特定文件位置在本函数中写死了,需要换位置请修改本函数的日志

记录目录位置。)输入参数:$message,$mode,其中$message为日志信息,$mode为日志记录模式,其中0表示即打开

日志文件又关闭日志文件,1表示仅打开日志文件不关闭日志文件,2表示不打开日志文件仅关闭日志文件。

*lowerFirst:将特定字符串的首字母转换为小写后返回结果。举例:

@lowerFirst("Kill"),返回"kill"。

×merge_list:更新指定位置的列表元素,如果该位置有元素这替换该元素,如果该位置在最大位置+1,这添加在末

尾,如果该位置在最大位置+N,则中间填空元素后填入该元素。输入参数$list,$item,$locate,其中$list为输入列

表,$item是待更新的元素,$locate是更新到的位置。举例:

@merge_list("1|2|3",4,2),返回"1|4|3",

@merge_list("1|2|3",4,4),返回"1|2|3|4",@merge_list("1|2|3",4,5),返回"1|2|3| |4"

三、默认参数介绍

主要介绍一下本例子护镖机器人关键的默认参数,这个章节比较枯燥,有需要可以等到实际章节用到这部分内容

再回过头来查阅。大多数默认参数都需要大家根据自己的地图数据库实际情况重新设计,这个参数设定的质量高低也

是游戏稳定的关键,也不要期望于一次性弄完所有参数,慢慢在实际运行中补充吧。

1.护镖路线设定

在quest|hubiao|clPara|variables|defaults|hubiao_pathset目录下,对应于每一种护镖任务都有一个唯一的变

量hbpath_***,其中***指任务简称,变量存放data record列表,每一个record 元素的结构如下

zoneid=2,6,32|id=322|name=青石大道|cmd=gne

其中zoneid指的是该房间所处区域和相邻区域,id是指房间号,name是指房间名称,cmd是指实际推车命令,这个命令

在特殊房间可能不一样,比如北京城门就是命令gn-bj,gn-bj是有gan che to north和ask jiang about进城组合而成。

2.特殊任务地点定义

在quest|hubiao|clPara|variables|defaults目录下,变量名是hbspec_str,主要存放一些特殊迷宫的特别行镖路

线和返回路线,比如黑沼和太湖的树林。这也是一个record列表,里面record 元素的结构如下

questid=taoyuan|targetname=黑沼|backcmd="yinggu|#wa

500|yinggub"|pathlist="2120|2119|2118|2117|2116|2115|2114|567|564|563"|p

athid=24

其中questid是指属于哪个任务简称的,targetname表示林镇南给的目的地,backcmd是指返回命令,pathlist是指从该任

务默认线路的一个最近地点以后的预设线路,pathid是指该情况下预设的初始路线转折点位置。比如例子的黑沼中24指的

是2120房间号是接@hbset_taoyuan预设路线的第24号位置-房间号583(桃源驿站)。

3.公共任务头信息

在quest|hubiao|clPara|variables|defaults目录下,包括变量hbpath_list,hbstart_list,hbtarget_list,

hbtarget_num_list。这个没有转换成record列表,而是由四个字符串列表组成。其中hbpath_list表示任务英文简称,用

它来查找应该选哪条默认线路、是否有特殊房间需要设置特殊线路等等。hbstart_list是林镇南给出的托镖者名称,有这

个来确定本次护镖是哪个任务。hbtarget_list是默认目的地名称列表。hbtarget_num_list是默认目的地房间号列表。

4.过滤房间号列表

在quest|hubiao|clPara|variables|defaults目录下,变量名maze_list,主要用于区域搜索,列表内的房间将不会搜

索,主要包括迷宫、比较危险的房间、被npc拦截的房间。这个需要大家重新设置了,里面仅存房间号。

5.特殊任务返回设置

在quest|hubiao|clPara|variables|defaults目录下,包括变量

back_specpathlist,back_specnumlist,

back_speccmdlist,分别指的是特殊返回的任务简称列表,特殊返回的返回命令线路起始点列表,特殊返回的返回命令列表。

主要是考虑到向北京,襄阳,洛阳这三个地方返回的时候不能按照原线路返回(因为要坐船),要用丐帮地道返回。通过

back_specpathlist用任务英文简称找到是否需要用该列表设置特殊返回命令,back_specnumlist是指从那个位置开始执行

特殊命令,back_speccmdlist是指执行的特殊命令。比如北京的bjbiaoju(镖局)任务设置的back_specnumlist值是23,

23在bjbiaoju任务里面是指北京的永安门北面的那个正阳门外大街,也就是说你在该正阳门外大街之后的房间返回你要走到

该房间才能执行back_speccmdlist的beijingb命令,如果在23之前返回则要返回到正阳门外大街才会执行beijingb返回。

6.自动买药设置

这个变量是druglist,里面放着最小药品数量,比这个数量小会自动买药。本教程用不到这个东西就不细讲如何实现的。

7.方向设定

包括direct_type,che_direct_type,mirro_direct_type。分别指方向列表,对应的行镖命令列表,对应的反方向列表。

用来作方向转换用。有一个标准函数实现了这个转换,叫做direct_convert,在目录pubFunc|hbFunc下面。这个函数我会在

用到的时候在具体讲解。

四、设计思想

主流的复杂Mud机器人基本上都要涉及到对地图数据库的操作,在这个方面大体有三种思路,第一种思路是什么样的地图

数据库都不使用,这种护镖机器人当然就不会特别好,编写慕容机器人是一点问题没有,编写胡一刀的机器人就根本没有办法,

更高级的任务更不用说了,这方面比较活跃的现在用zgbl的护镖机器人,我的公开版护镖机器人都在这里,还有就是bugbug的

慕容机器人也是典型。【慕容机器人部分用到了遍历,但是没用到地图数据库搜索之类】这种编写方式比较适合非常简单的机

器人,任务模式比较死板的也合适这个模式,但是具体到护镖机器人有一个大问题就是你怎么知道目的地到底是实际上的具体

位置或者乱入以后你怎么知道乱入到哪里去了?这样的问题不依靠数据库都没法回答。第二种模式就是依靠Zmud/Cmud内置的

map函数来处理房间定位之类问题,实际上系统内置的map函数功能非常丰富,包括选择路线,房间定位,模糊选择诸如此类都

能帮助你完成,而且操作性能也非常好,这方面我就不是特别擅长,主流的代表人物有maper,killunix,oolong。不过maper

现在转mushclient,估计在mushclient上就没有这个优势了。第三种模式就是不依靠系统自带的函数和地图数据库,使用自己

的地图数据库和自己的地图操作函数,基本上我一直从事这方面的开发,目前函数上还算比较完善,当然和Zmud/Cmud内置的

地图函数那样子功能强大和高性能是不太可能的。另外如果你要啊在Mushclient 上开发基本上也要遵循我这个模式来开发。不

过上面提到的人名肯定只有一部分,这里面藏龙卧虎,比我厉害的有的是,有不到的地方请指教。

要做所有工作之前首先要设计地图数据库的表结构。我这里map数据库的表结构如下:

字段字段名类型备注

objectid房间号数字

objectname房间名称文本

relateobject相邻房间号文本每个房间号之间用|分割

relateobjname相邻房间名称文本每个房间名称之间用|分割

direct方向文本每个方向之间用|分割

objectdesc房间描述文本

zoneid区域号数字

zonename区域名称文本

spacex×空间x轴数字

spacey×空间y轴数字

spacez×空间z轴数字

spaceu×空间u轴数字

具体数据库实现上其实可以仁者见仁,智者见智,我这里只是抛砖引玉,你可以用系统提供给你的map函数操作也是一样,和我

的机器人对接上只要把room_info和batch_room_info函数实现了基本上就可以无缝对接。因为除了那两个函数我其他地方不会

操作数据库。这里面标注为×的是我自己的一个设想,问题就是处在我目前的数据库没有空间坐标轴,导致寻找最优路径的时候

效率特别差,设想将relateobject和direct结合起来转换成spacex-u轴就非常完美了,其中x轴是指东西方向,y轴指南北方向,

z轴指上下方向,u轴指enter/out方向。有了这个坐标轴就可以很容易的判定两个房间之间的距离以及最优线路选择了。不用像

我目前选择最优路径往往还需要用到递归操作。当然选择Zmud/Cmud的map 函数可以省下那些事情,因为他的内置地图数据库本

身就包含了空间信息。

在开发这类使用数据库的复杂Mud机器人的时候最重要的时候是如何更好的利用Map数据库了。我个人心得是核心的操作有

以下几个方面:路线选择,信息查询,位置定位。路线选择是指给定两个点,一个是初始房间号,一个是目标房间号,给出一

条最优的路线来,路线选择还包括另外一层含义是指我给出一条固定线路,给出距离固定线路一定位置的一个房间号,重新制

作出新的最优线路来,这个设想在护镖的时候非常有用,我在下一章讲护镖线路制作的时候会具体讲我怎么实现的。信息查询

是根据你捕捉的模糊信息或者一个房间号查询出符合条件的所有房间的具体信息,这是为进一步精确定位提供信息基础,乱入

的时候往往需要根据模糊信息提供一个大致的范围,然后再根据方向,名称,描述等等信息进一步定位。位置定位根据捕捉的

实际房间名称,房间描述,房间的方向来确定输入的房间信息或者房间信息列表中符合条件的房间号,这是为了能够精确定位

你目前所处的房间位置使用的。其他人使用系统内置的Map函数实际上也要具体实现符合你实际情况的这三类地图操作功能。

五、路线计算

在路线计算中分为两种情况,一种是两点之间的路线,一种是对已有路线的调整,也就是路线和一个点之间的最优选择。

线路计算解决的两个点之间最优线路的问题,推而广之则有一个点对一个点集合的最优线路选择问题。对于两点之间的最优路

线计算一般来说通过Zmud/Cmud的内置map函数是唯一选择,因为你自己开发首先你要建立每个房间的空间坐标,然后通过坐标

计算两点之间的最优路线,这个开发难度我目前至少没有克服。如果护镖的时候比如计算镖局到北京的线路实际上你大可以预

先设计好线路,然后最后3-5个房间你根据实际情况再微调线路就可以,这样子计算量就不会太大,性能上相对好一点。胡一

刀任务实际上是需要大范围遍历,不涉及到线路计算。在我给出的例子样本中实际上路线计算使用的就是预设路线然后再微调

的办法。

下面我把这部分核心代码贴出来仔细讲解一下。核心代码位于

quest|hubiao|clQuest下面,触发条件为:

^??林震南说道:「@me把这批红货送到(%x)那里,他已经派了个伙计名叫(%x)到(%x)附近接你,把镖车送到他那里就行了。」

的脚本里面,代码的26-28行:

#va hb_path%item(@hbpath_list,@quest_id)

#va hb_target%item(@hbtarget_num_list,@quest_id)

#raiseevent hbInitPath

就是路线计算部分。@quest_id变量通过第12行

#va quest_id%ismember(@owner,@hbstart_list)

计算获得,就是通过触发条件捕捉的%1查询默认参数@hbstart_list获得当前任务是第几号人物,然后查询@hbpath_list获得任

务英文简称,查询@hbtarget_num_list获得默认目的点的房间号。接着就可以调用事件hbInitPath计算当前行镖路线了。

事件hbInitPath位于Events|hbEvent下面,我行镖路线计算的想法是首先通过预设的行镖路线参数获得初始的当前护镖路线

设置,这部分代码就是hbInitPath的第2-18行:

#if@exp<1000000&&@hb_path="shashoubang"{

hbset_runtime=@hbset_pker

}{

#va hbset_runtime@{%concat("hbset_",@hb_path)}

}

hbdesc_runtime=""

hbcmd_runtime=""

hbnum_runtime=""

hbzone_runtime=""

#loop%numitems(@hbset_runtime),1{

#local$hbset

$hbset=%item(@hbset_runtime,%i)

#va hbdesc_runtime%push($https://www.sodocs.net/doc/f36318673.html,,@hbdesc_runtime)

#va hbcmd_runtime%push($hbset.cmd,@hbcmd_runtime)

#va hbnum_runtime%push($hbset.id,@hbnum_runtime)

#va hbzone_runtime%push($hbset.zoneid,@hbzone_runtime)

}

其中第2-6行是指经验小于1M的玩家杀手帮任务的时候护镖走pker命令从西门出去到杀手帮,大于1M的玩家走南门用shashoubang命

令的行镖线路,其他情况下直接用任务英文简称取路线设置然后展开成字符串列表。

接着判定任务给出的目的地是否已设定好的特殊迷宫,如果是特殊迷宫行镖按照设定规则行镖。这部分代码在27-36行:

#loop%numitems(@hbspec_str){

#local$hbspec_item

#new$hbspec_item

{questid=""|targetname=""|backcmd=""|pathlist=""|pathid=0}

$hbspec_item=%item(@hbspec_str,%i)

#if($hbspec_item.questid=@hb_path&&$hbspec_item.targetname=@target) {

$target_path.pathsno=$hbspec_item.pathid

$target_path.targetpath=$hbspec_item.pathlist

#break

}

}

主要是根据默认参数@hbspec_str的定义来修改路线,这个参数说明在第三章第二节中,刚刚做了一些修改,以前的表述有些问题。

在这里我要说一下路线调整的结构$target_path,这个结构由两个key组成,键pathsno表示从原路径那个位置以后作调整,键

targetpath表示新的路线设置,举个例子:比如最初的行镖线路设置是1|2|3|4|5,现在我设置$target_path为pathsno=3,

targetpath=8|9,也就是说从位置3以后要调整为8|9,新路线就是1|2|3|8|9,并且目的地位置是房间号9。这个结构的作用明白

了吧?这里路线设置的时候只需要填充这个结构的含义也清楚了吧?只要这个结构计算出来了后面可以很容易的通过这个结构

导出完整的行镖线路来。

接下来的代码第38-50行就是一般路线计算了。代码如下:

#if$target_path.pathsno=0{

#local$condition

$c

$condition=%concat("(zoneid in(",%item(@hbzone_runtime,

%ismember(@hb_target,@hbnum_runtime)))

$condition=%concat($condition,")")

#if@hb_path="taoyuan"{

$condition=%concat($condition,"or objectid=1676")

}

$condition=%concat($condition,")and objectname='")

$condition=%concat($condition,@target)

$condition=%concat($condition,"'")

$target_path=@find_targetpath(@batch_room_info($condition),@hbnum_ru ntime,0,-1)

}

$condition的SQL条件含义是指根据林镇南给出的@target任务地点【就是刚才通过“他已经派了个伙计名叫(%x)到(%x)附近接你”

捕捉的变量】在默认目的地定义的区域范围内寻找符合条件的所有房间号(其中加上or objectid=1676是指桃源任务的山路,因

为桃源任务有时候会给出目的地是杀手帮的山路,而杀手帮并不在桃源任务的搜

素区域内,所以特别加上以免路线计算出错)。

然后调用函数@find_targetpath就可以获得路线调整结构的数据。我接下来仔细讲解一下函数@find_targetpath,事件

hbInitPath中剩下的部分就不讲了,剩下的没有什么技术含量了。

函数@find_targetpath是最优路线确定,函数位于pubFunc|hbFunc下面,包括4个参数:$targetlist,$pathlist,$level,

$targetpath,其中$targetlist是指目的地房间信息列表,$pathlist是初始线路,$level是递归层级,$targetpath是传给下一

个递归层级上一个层级的计算结果。这个函数的思想是我要寻找出$targetlist和$pathlist之间一条最优线路,这条线路首先

是两点之间距离要最短,举例来说$targetlist中能找到就是$pathlist中的元素(也就是0距离)就用0距离的,没有找距离1的

元素,一直推广下去。距离最短的那些元素中和$pathlist链接的位置一定要尽可能靠后。我的想法是尽可能保留初始路线最

大化并且调整要尽可能少的路线就是最优线路。

下面具体讲解一下这个函数的代码,所以代码一开始,在第15-20行:

#va$temppath%additem($target_room.id,$targetpath)

#loop%numitems($pathlist){

#if%item($pathlist,%j)=$target_room.id{

$pathid=%j

}

}

先把本次房间号保存到结果列表中供最终出结果或者递归到下一个层级使用。然后寻找房间号在初始路线中最靠后的位置,找

到了这个房间号的寻找旅程就结束了。下面根据本次查找结果进行判定,决定是否替换返回结果,是否做递归等等。这段代码

如下在第22-47行:

#SWITCH($pathid!=0&&$pathid>=$rtn_struct.pathsno){

#SWITCH($rtn_struct.pathsno=0){

$rtn_struct.pathsno=$pathid

$rtn_struct.targetpath=$temppath

}

(%numitems($rtn_struct.targetpath)>%numitems($temppath)){

$rtn_struct.pathsno=$pathid

$rtn_struct.targetpath=$temppath

}

(%numitems($rtn_struct.targetpath)=%numitems($temppath)&&$pathid>$rtn_ struct.pathsno){

$rtn_struct.pathsno=$pathid

$rtn_struct.targetpath=$temppath

}

}

($pathid=0&&$rtn_struct.pathsno!=0&&%numitems($rtn_struct.targetpath)=1) {

}{

#if$level<=3{

$condition=%concat("objectid in(",%expandlist($target_room.rel_id,",")) $condition=%concat($condition,")")

$batchlist=@batch_room_info($condition)

$tmp_struct=@find_targetpath($batchlist,$pathlist,$level+1,$temppath) #if$tmp_struct.pathsno>$rtn_struct.pathsno{

$rtn_struct=$tmp_struct

}

#if

($tmp_struct.pathsno=$rtn_struct.pathsno&&%numitems($tmp_struct.targetpa th)<%numitems($rtn_struct.targetpath)){

$rtn_struct=$tmp_struct

}

}

}

首先如果找到结果了,也就是$pathid>0,并且这个位置比结果里面的pathsno 靠后或者相等,则进入下一步判定,有

三种情况下会替换原先的返回结果,第一种情况是返回结果为空,第二种情况是返回结果里面的路线房间数比新结果

的房间数大,第三种情况是两者房间数相等但是$pathid比$rtn_struct.pathsno 大。switch中第二个条件

($pathid=0&&$rtn_struct.pathsno!=0&&%numitems($rtn_struct.targetpath)=1)不作处理是指当你没有找到结果,

但是结果列表里面的结果房间数仅有一个,这时候递归没有任何意义(因为递归找到结果也会比房间数1大)。其他情

况下作递归,递归仅作五层递归(0,1,2,3,4)。将该房间的相邻房间作为源与$pathlist作路线计算,得到的结

果更新到返回结果中。

@find_targetpath函数性能不是特别好,主要原因是每次递归前都要调用

@batch_room_info查询房间信息,而这个

查询数据库操作由于我使用ADO技术进行数据库操作,性能实在不是特别好,差不多是100毫秒量级的性能,递归有时候

要做上百次或者更多次递归(比如全真的走廊就是一个例子),后来想改用Lua 语言存取数据库,但是由于技术上的

原因没有尝试成功。(Lua语言在Cmud上开发实在不熟悉,而且资料也不多)

六、空间定位

空间定位的问题在于当你处于一个未知房间的时候如何能够准确获得当前位置的正确房间信息和空间定位,来方便

下一步操作。这个问题大概在护镖任务中碰到的比较多,其他任务由于对于目标位置信息不足都需要区域级遍历来确定

任务NPC位置,不涉及到对一个模糊信息的空间位置定位上。空间定位在思想上是根据当前房间捕捉的房间名称、方向

和描述信息从数据库中确定出一个符合实际情况的唯一房间号,根据该房间的相邻信息决定下一步的行动。空间定位在

技术上存在四个审定级别,第一个级别是只要房间名称一样就认为找到符合要求的房间,这个要求最低,适合名称唯一

的那类房间,应用面比较狭窄;第二个级别是房间名称一样,并且实际房间的方向在数据库中该房间的方向中存在,这

个级别的限定相对比较实用,适合大多数情况,但是对于比如西大街、青石大道之类大众化的名称就无法精确定位了;

第三个级别是房间名称一样,房间方向一致,并且房间描述一致,这个定位相对精确,但是你要注意到我们前二个级别

中并不要求房间方向一模一样,只要是数据库定义的房间方向的子集就可以了,这是考虑到要兼容一些秘密房间会有一

些自定义命令来链接隐藏方位,比如ct到丐帮地道,华山舍身崖到紫气台之类都是这种情况,但是前两种的认定在一些

房间名称重复程度特别高,方位比较雷同的房间定位上就会出现问题,这就是第三种定位方式出现的原因,这个程度基

本上是技术上认定的终结,我们原则上认为只要名称、方向、描述都一模一样的房间就是一样的房间,但是实际上存在

很多特例,比如被洗劫以后的襄阳西大街基本上都是一模一样的,但是确实存在

多个房间,这就是理论上的第四个级别

存在的基础;第四个级别是要求房间名称一样,房间方向一致,房间描述一致,相邻房间名称一致,这个实现的难度在

于相邻房间的名称捕捉上,这个实现起来难度不是特别小,我个人建议碰到这类情况还不如作一些特殊代码比较好,毕

竟情况不会特别,有问题写死代码的工作量比作通用代码简单多了,当然你的理想是作一个通用平台的话就是另外一回

事了。这里有一个应用上的省略就是我处理房间描述比对上一般只比对第一行描述,不对其他行描述进行比对,这一方

面是为了技术实现的简便起见,另外一方面是由于很难保证地图数据库中的房间描述高质量,而且就是这么处理你在捕

捉房间描述的时候也一定不要把空行捕捉进去,否则一样会出问题。(第一行是空行当然怎么比对都是失败的)

具体在护镖任务上由于存在镖车乱入所以会存在你和镖车随机到一个相邻1到N格的未知位置上,这里面定位分为三

个级别:第一个级别是乱入后的房间在预订行镖线路的房间范围内进行定位上,这时候定位基本上按照第二种方式进行

定位就可以了,特殊的路线上有多个房间符合条件就需要用第三种定位方式了;第二个级别是乱入后的房间在原先位置

的邻居房间中定位,这个定位模式按照第二种定位方式就足够了;第三个级别是乱入后的房间在路线定位的相邻区域范

围内进行定位,对于单一结果按照第二种定位方式进行验证,对于多重结果按照第三种定位方式进行严格验证。

下面简单分析一下我的护镖定位代码,入口代码是quest|hubiao|clWalk下面的id为walk_room_check的那个触发,

这部分代码在子触发2下面的第10-36行:

#if@error_path_flag="ERROR"{

#t-hbWalk

#raiseevent hbRoomCheck@locate_desc@locate_directlist

@locate_description

}{

room_desc=@room_info(%item(@hbnum_runtime,%eval(@locate_pathid-1)))

$rtn=@compare_room(@room_desc,@locate_desc,@locate_directlist)

#if$rtn=1{

#if@locate_pathid>@target_pathid{

#raiseevent hbEndWalk@target_pathid

}{

#t-HbFoundFlag

#t-hbWalkEnd

#SECTION SingleThread{

#va error_path_flag START

}

room_desc=@room_info(%item(@hbnum_runtime,@locate_pathid))

#win hubiao Locate:@locate_desc,Next Room:@room_https://www.sodocs.net/doc/f36318673.html,,Next Pathid:@locate_pathid

#t+hbWalk

#raiseevent hbWalk%item(@hbcmd_runtime,@locate_pathid)1

#alarm almWalk{1}{

#raiseevent hbWalk%item(@hbcmd_runtime,@locate_pathid)1

}

}

}{

#raiseevent hbRoomCheck@locate_desc@locate_directlist

@locate_description

}

}

这里主要是判断是否需要进行重新定位,如果有需要调用定位事件hbRoomCheck,首先是只要error_path_flag这个变量

为ERROR的时候关闭行走事件hbWalk,进行重新定位。其他首先取出本地房间的数据库信息(使用函数@room_info,这

个函数是一个接口函数,需要个人自己实现,具体参见第二章的相关内容),然后进行第二种方式的定位认证(使用函

数@compare_room,这个函数在pubFunc|roomFunc下面,主要是验证名称一致性,实际方向是否是设定方向的子集,成

功返回1,失败返回-1)。如果一致的情况下,下一个目标的序号超过了最大序号,则启用护镖结束事件hbEndWalk,这

个事件就不解释了,否则进行下一步行走,如果比对发现不一致,则启用定位事件hbRoomCheck。

接着我们仔细分析一下定位事件hbRoomCheck,这个事件位于

Events|hbEvent下面,首先开始进行护镖定位的第一个

级别认证,也就是和预设路线上的房间进行比较来定位。定位代码为第15-51

行,如下:

$condition=%concat("objectid in(",%expandlist(@hbnum_runtime,",")) $condition=%concat($condition,")and objectname='")

$condition=%concat($condition,$locate_name)

$condition=%concat($condition,"'")

$batch_room=@batch_room_info($condition)

#loop%numitems($batch_room){

#local$rtn,$room,$direct

$direct=""

$room=%item($batch_room,%i)

$rtn=0

//存在多个符合条件的结果的情况下用名字,方向和房间描述来定位

#if%numitems($batch_room)>1{

$rtn=@compare_room2($room,$locate_name,$locate_direct,$locate_desc)

}{

//仅存在一个结果的情况下用名字和方向定位

$rtn=@compare_room($room,$locate_name,$locate_direct)

}

#if$rtn=1{

$direct=%item(@hbcmd_runtime,%eval(%ismember($room.id,

@hbnum_runtime)+1))

//确定该位置的行镖路线对应的方向在本地所有方向中是否存在

#if%ismember($direct,@che_direct_type)>0{

#if%ismember(@direct_convert($direct,2),$locate_direct)=0{

$rtn=-1

}

}

}

#if$rtn=1{

#if%ismember($room.id,$detect_roomlist)=0{

$detect_roomlist=%push($room.id,$detect_roomlist)

}

}

}

//如果存在多个结果则进行严格判定,过滤由于方向键非严格判定造成的数据冗

#if%numitems($detect_roomlist)>1{

$detect_roomlist=@detect_room2($detect_roomlist,$locate_name,$locate_d irect,$locate_desc,2)

#win hubiao判定结果:$detect_roomlist

}

首先是用@batch_room_info函数取出路线中和所在房间名称一样的房间列表(@batch_room_info函数说明请见第二章)。

对于有多个结果的情况下首先是按照第三种定位方式的一个变种来进行验证,就是方向哪里不判断一致性,还是仅判断

实际方向是数据库中设定方向的子集就可以了,单一结果的按照第二种定位方式判断名称和方向就可以了。比对成功的

情况下查看下一步行镖方向是否在本房间中实际存在(比如小山村的碎石路、全真的石阶、武当的石阶都可能会出现类

似情况),这个问题是由于第二种认证方式对方向处理的局限性造成的,认证成功的将房间号写入成功列表

$detect_roomlist。如果上面认证的结果还有多个,则通过严格的第三种定位进行进一步认证,去除由于上面对方向处

理的局限性造成的数据冗余。(相关的定位基础函数

compare_room,compare_room2,detect_room,detect_room2请查询

pubFunc|roomFunc,相对都比较简单,compare*类是处理单个房间的,detect*类是处理多个房间的,*room2类一般是

实现第三种定位方式或者是第三种定位方式的一种变种,×room类函数一般是实现第二种认证方式。)处理的时候对房

间定位进行从宽处理原则,一方面是考虑到秘密房间的因素,另外一方面是出于对数据库质量不过关的忧虑。下面还有

一大段代码是成功找到正确位置后如何根据一个原则挑选并进行行走的问题,这个很多和实际情况无关,纯粹是个人喜

好问题,就不一一细说了。

接下来进行护镖定位的第二个级别认证,就是根据原先位置的邻居房间范围内进行定位,代码在108-117行,如下:

$room=@room_info(%item(@hbnum_runtime,%eval(@locate_pathid-1))) #loop%numitems($room.rel_id){

#if$locate_name=%item($room.rel_name,%i){

$rtn=@compare_room2(@room_info(%item($room.rel_id,%i)),$locate_n ame,$locate_direct,$locate_desc)

#if$rtn=1{

$direct=%item($room.direct,%i)

#break

}

}

}

这部分代码就比较简单了,取出所有邻居房间,循环按照第二种定位方式进行,只有有一个定位成功,则认为找到结果

了,循环中断,进行下一步具体行走处理上。

上一种方式定位失败的情况(这种情况会实际发生的,比如青石大道之类实际上有可能乱入的时候重新定位就定位

错了,但是不影响具体行走,只是下一次行走的时候由于预先的位置并不是你实际乱入前的位置,用那个位置的邻居来

定位乱入后的房间当然找不到想要的结果)下我们就是用第三个级别认证,就是根据预先位置所定义的相邻区域范围内

所有跟乱入房间名称一样的所有房间内进行定位,代码在第137-199行(这部分代码有更新,可能和提供的xml稍微有区

别,以文章所列代码为准:

#switch(@locate_pathid>%numitems(@hbzone_runtime)+1){

$condition=%concat("zoneid in(",%item(@hbzone_runtime,

@target_pathid))

}(@locate_pathid=1){

$condition=%concat("zoneid in(",%item(@hbzone_runtime,

@locate_pathid))

}{

$condition=%concat("zoneid in(",%item(@hbzone_runtime,

%eval(@locate_pathid-1)))

}

$condition=%concat($condition,")and objectname='")

$condition=%concat($condition,$locate_name)

$condition=%concat($condition,"'")

$batch_room=@batch_room_info($condition)

#loop%numitems($batch_room){

#local$position,$rel_roomid,$directid

$room=%item($batch_room,%i)

$rtn=0

#if%numitems($batch_room)>1{

$rtn=@compare_room2($room,$locate_name,$locate_direct,$locate_d esc)

}{

$rtn=@compare_room($room,$locate_name,$locate_direct)

}

$directid=0

$rel_roomid=0

//仅选取匹配的候选对象中邻居在行镖路线或者曾经出错位置列表中的进行出错纠正

#if$rtn=1{

#loop%numitems($room.rel_id){

$rel_roomid=%item($room.rel_id,%j)

$position=@room_position(@hbnum_runtime,$rel_roomid,@locate_p athid-1)

#if$position>0{

$directid=%j

}

}

#if$directid=0{

#loop%numitems($room.rel_id){

$rel_roomid=%item($room.rel_id,%j)

$position=@room_position(@error_locate_list,$rel_roomid,99)

#if$position>0{

$directid=%j

}

}

}

#if$directid>0{

$direct_str.direct=%item($room.direct,$directid)

$direct_str.room=$room

#va$directlist%push($direct_str,$directlist)

}

}

}

#if%numitems($directlist)>1{

如何练就武林高手[武功秘籍]

(初级) 一、正道内功初级功法 下面介绍本校独特的内功修炼方法——正道内功初级功法: 第一步:①双腿与肩同宽,双手自然下垂体侧。脚尖触墙,面墙而立。眼微闭,凝神静气逆呼吸十二息(即吸气时腹部内凹,呼气时外凸,一呼一吸为一息)准备练功。 ②双肩稍内扣,鼻子轻触墙,双膝微触墙。吸气时缓慢下蹲,徐徐吸气入下丹田(脐下),直至臀部触及脚后跟为止,整个过程为吸气。 ③起立时,缓慢呼气,徐徐站立起身。 注意:①自始至终,动作与呼吸必须协调一致,即气吸至尽时下蹲到底,起立站直时气呼完,意念守在下丹田处。②自始至终鼻、膝、脚尖不能离开墙壁,尤其是头部绝对不能向左右偏斜(即眼不能左右看),否则使脊柱偏斜,影响功效。③呼吸在胸部不憋闷的前提下,越慢越好。 本法虽然简单,但大多数人初练时蹲不下去,此时把脚站立比肩宽亦可,不会影响功效。能站下去之后,逐渐合拢双脚练习,直至双脚并立,脱去鞋袜之后亦能蹲下者,即初步功成。 刚习时如蹲下一两次,其吃力之感不亚如挑百斤重物行走数公里。勤修本功,自然达到气沉丹田之效,久练自然丹田充实气足,桩步沉稳灵活,更能在激烈的实战对抗中气定神闲,发力迅猛持久,全身可达无意识活性抗打。 本功的功法原理即通过任督二脉的修炼达到丹田气足圆活,尤其是对颈、胸、腰、骶、脊椎的伸拉、压缩,可牵扯到常常运动不到的肌肉、韧带、神经,从被动运动到主动运动,日久自然感应异常灵敏,而使肌肉、骨骼达到坚韧有弹性,在实战中不惧暴力击打。 现代医学证明:脊椎的错位或伤损,可引起众多疾病的发生。脊椎的修正复位可减轻各种神经痛、心绞痛、头痛眩晕症等。现在很多武术修炼者只知脊椎的修炼对发力相当重要,却忽略了一旦脊椎发生偏差(错位)可引起严重的内脏的疾病,首当其冲的是颅脑血管疾病、心脏血管疾病的发生。此皆缘于不正确的成千上万次的脊椎扭转切削发力,而产生脊体错位压迫神经血管而引起的。许多惨痛的实例已应引起足够的重视了。 当第一步功练至赤足并立亦能49次上下之后,第一步功成。此时进行实战搏击,身轻步稳,腿部力量即有抬腿伤人的威力。此时可转入第二步练习:要领基本同第一步功,唯一不同的是双手各持20—40斤重的哑铃上下练习,当亦能上下49次时,第二步功成。唯此负重练习之时劲非自然本能之“灵劲”,尤应进行下面第三步之练法:其余同第一步功,不同的是把双手背在腰背上,上下练功。亦能上下49时“灵劲”上身,此时周身通灵圆活,感应异于常人数倍,在毫无防范之下亦能承受常人之击打,不伤分毫。 此时进行中级内功的修炼可达事半功倍之效。 二、练多久可达文中之功效? 若专业训练一月左右即可赤脚起立49次左右;业余训练约需30—60天左右。此时的腿功功力及腰背、丹田之力绝不同于没练之前,平时不论练习套路还是进行实战搏击体能即可明显提高,任一拳一脚常人绝难抵挡。再逐练下一步即可。每天不少于五次练习。 三、练本功有何禁忌? 练本功无什么特别禁忌!随时随地皆可练习,有一墙即可;唯练完后1小时内勿冲冷水澡,切记! 四、本功对哪些疾病有改善作用? 本功对严重肥胖症、遗精、腰腿痛、胃肠病、各种内伤等有显著效果。在练功过程中有哪一处平时无痛感的部位,练功一段时间后突然有痛感的即为病所,此时更应坚持练下去,不痛之后病即痊愈。对增高亦有显著作用。 二、卧虎功法 本功最主要增加全身肌肉韧性及内脏的抗震及减震功能,从而使全身无点皆成弹性抗击,勤者修炼1-2

中国梅花桩训练大法

中国梅花桩训练大法中国梅花桩训练大法 章节目录 第一章桩步五势及其基本变化 第一节梅花桩拳法中的头、手、足 第二节梅花桩架子中的桩步五势 第三节桩步五势的变化 第二章行步三法的基本练法 第一节梅花桩架子中的行步 第二节摆法的基本练法 第三节撤法的基本练法 第四节扎法的基本练法 第五节梅花桩架子中的行步三法 第三章梅花桩架子的基本拳路

第一节梅花桩武功的基本训练方法 第二节梅花桩架子的练功方法 第三节梅花桩架子的拳路 第四节梅花桩架子的进一步练习 第五节梅花桩架子的两人、四人、八人等多人的相对练习 第四章梅花桩架子中桩步五势的变化 第一节桩步五势变化的练法 第二节桩步五势变化的根据 第三节桩步五势变化的规律 第四节桩步五势的转换为什么要有各种变化 第五章梅花桩架子中行步三法的变化 第一节行步摆法练法的变化 第二节行步撤法练法的变化 第三节行步扎法练法的变化 第四节行步三法的变化在梅花桩武功基本训练中的意义第六章梅花桩架子中两个上斜角行步的变化 第一节由正角上左侧斜角行步的变化 第二节由正角上右侧斜角行步的变化

第三节梅花桩架子中两个上斜角行步的变化在基本功训 练中的意义 第七章梅花桩武功训练的方法与要求 第一节梅花桩武功训练入门 第二节梅花桩武功随机变化的训练 第三节梅花桩武功对练功者心性、道德的培养 第四节梅花桩武功不同形式的分级训练 21、“涅磐妙心”在拳法中怎么理解? 答、“涅磐妙心”是佛家“以心治心”的追求的最高境界,据说这时候人就能获得大智慧、大神通、就能无不为。如《西游记》中所描述的释迦牟尼、观音菩萨等成佛之人,都已经达到了“涅磐妙心”的境界。练武者如果能把拳法练到心里,他就会明白“佛法即拳法也”。例如,佛家追求的最高境界“涅磐妙心”,佛经解释为“一真一切真,法法皆真;一如一切如,法法皆如。”也就是武功达最高层次的一种境界。世上有无数种拳法,各门各派的拳法练法也各不相同。但不管那门那派的拳法,只要练出“真”功夫来,其结果是一样的。这就叫“殊途同归”,因为宇宙的真理就是一个。我在西藏工作时时常来往于四川成都,那时我才30来岁,曾同年近古稀的杨式太

中国传统武术功力训练部分专用器械:

中国传统武术功力训练部分专用器械: 传统意义上的功力训练,必须要有正确的发力做基础,不然,练习时会很费力的,我说的传统意义,并不是现在流行的那些个什么散打,拳击练习用沙包,速度球什么的,而是中国传统的武术功力器械,具体有下面几种:1.练习前发力的挡板,就是靠墙埋一块一个高、厚度约在5公分的木板,离墙大约一横砖的距离,然后,用双手作虎扑式前发力,随着功力提高,板可能会变得有点软了,这时,就在板后加砖,日积月累,功力会大大提高的2.抖大杆,这是练习横发力的,大杆的长度最好在3-4米,粗约一握,白腊的最好,实在找不到的话,竹杆也能凑和着用3.揉球,球用石头的或者铁的都无所谓,大小在一个篮球左右吧,关键是揉的方式,把球摁在墙上用手控制着去揉,注意事项是那个“摁”字,别变成托着球了,那就不叫揉球了,那叫举重4.掷三角包,三角包最好是两个人一起,你扔过来,我扔过去,此功大长腰腿之力5.拧千斤棒,这个最简单了,一个长30公分,一握粗的短棒,居中钉一个钉子,在钉上拴一个尼龙绳,绳长比手臂前平举稍长,另一头系两块青砖或者哑铃,然后,双手前平举,慢慢将系绳子的短棒绞起,绳绞到头后,再慢慢往回绞,力尽为止,大长指掌功力以上几种,都是古传功力的练习方法,只需坚持数月,即可使自己的功力大长,但前提是,你

要先掌握正确的发力方式,不然效果事倍而功半。李连杰早期的功力训练:视频来自:新浪视频9 传统武术基本功力训练之-----石锁 练石锁是传统运动项目,在中国已有千年历史,是古代习武之人以及军人锻炼臂、腕、腰、腿等部位力量的一种方法,后广泛流传于民间,玩石锁花样、技法很多,如推磨、招财进宝、猴子戴帽、喜鹊登梅、雪花盖顶、二郎担山等几十套,石锁表演讲究高、飘、正、稳、活,表演者的身形、步伐及腾挪、躲闪、抛接等技巧的掌握都非一日之功,多人表演时更要讲究默契配合。视频来自:ku6视频武术的桩功 中国武术讲究桩功,站桩的过程是求“形正、劲整的过程,也是增长力量、磨练意志的过程,还是逐渐学习和掌握拳术要领的过程。所以初学时要多 站桩,以便打下扎实的基础。站桩也是练习内功的方法。所谓内功就是练内的功夫,每个拳种都有自己的内功,内功是为自己拳种的技术服务的。形意拳内功有一整套功法,通过内功的联系可以使技术更快地提高,更重要的是通过内功的练习,可以使自己身体强壮,达到养身健身的目的。只有有了强壮的身体,才能使武术技术更上一层楼。长期练习内功能促进人境界的提高。武术的桩功,既是筑基的功夫,又是

千年 成长指南

千年成长指南 作者:善良的大灰狼 2001年被人称作是“网络游戏年”,除了原有的《笑傲江湖》、《万王之王》、《网络三国》将继续发扬光大外,在韩国、日本和台湾地区有着超人气销量的网络游戏《千年》和《石器时代》等等也将被汉化推出,我们今天来看一看颇受瞩目的网络武侠RPG游戏——《千年》。 2001年被人称作是“网络游戏年”,除了原有的《笑傲江湖》、《万王之王》、《网络三国》将继续发扬光大外,在韩国、日本和台湾地区有着超人气销量的网络游戏《千年》和《石器时代》等等也将被汉化推出,我们今天来看一看颇受瞩目的网络武侠RPG游戏——《千年》。 ??人物创建 登录游戏后,首先必须要创建一个人物,《千年》中的人物创建很简单,只要给自己取一个好听的名字,然后选择好性别,再选择一个出生地,点击确定,一位千年侠客就诞生了(说明:千年世界由两大地图组成,而且两大地图的核心分别是以书生村和侠客村来定义,因此大家选择出生地时,最好选择书生村或侠客村)。 终于进入游戏了,但怎么身上光溜溜的,除了一点贴身的内衣外,什么也没有穿,嘿嘿,不要着急,游戏为每一位新玩家都准备了一身简单的衣服,大家只要在命令输入栏中输入下面的 指令,就可以结束半裸,回归常人了,不过俗话说的好,便宜无好货,何况是免费的了,这些衣服不仅毫无防护作用,并且样式奇丑,所以大家如果不是太过怕羞,不穿也罢??衣服创造命令: ??@物品(空格)男子上衣 ??@物品(空格)男子长裤 ??@物品(空格)女子上衣 ??@物品(空格)女子长裤 ??武功总分 ??《千年》是一款武侠游戏,因此练习武功也就成了游戏中最重要的一项内容。游戏中的武功可以分为这四大种类: ??无名武功——无名系列的武功是大家一出生,不用学就会的基本武功,这类武功的效果平均,只适宜游戏初期使用,当然如果有特殊练法,这也将会是游戏中最强的武功哦(详细介绍见后) 寻常武功——寻常武功是大家必须通过购买武功书籍,学习后掌握的武功,这类武功较之无名武功有了更加明显的杀伤效果,但同时各种武功之间的相生相克关系也更为严重,寻常武功在整个游戏过程中都会使用到 特殊武功——《千年》世界中散落着很多神奇的武功密芨,虽然年代久远,已经很少有人知道这些密芨的下落了,但无数的江湖后人仍然不锲地寻找着,因为学会这些神奇的武功,往往意味着称霸江湖的实现。特殊武功都隐藏在各种任务迷题之中,只有通过完成各种特殊任务才能

相关主题