iam
发表于 2011-11-16 22:41:42
看了http://pkuxkx.com/forum/viewthread.php?tid=6021&highlight=helllua,一个字,没看懂……借鉴不了。还是自力更生吧。
alucar
发表于 2011-11-16 22:48:50
有思路就行,不用受限于某一种语言
alucar
发表于 2011-11-16 22:56:08
另外,固定线路的遍历方法及相关应用在糖果的教程里已经很详细了,个人以为这是最可靠的遍历方法
中心遍历感觉不适用网状地图,除非事先制作了全部地图数据
iam
发表于 2011-11-16 23:11:01
回复 13# alucar
首先表示感谢。糖果的帖子我学习过,他使用的是zmud721,是用list变量实现zmud462慢速行走的效果,我依然使用的是462,而且想使用462的慢速行走,所以多多少少还是有些不同。不过还是会用到他的一些技术。另外对于中心遍历我初步有了个不需要制作全部地图数据的方法,以后一步步写出来吧。
trace
发表于 2011-11-16 23:49:44
sorry,我说话比较直。楼主别介意。
不过说实话,zmud462干这些事情纯粹是给自己找不自在。
当然。我相信你费很大力气也能实现721能作的事。
问题是,有人现在长途旅行还选择步行吗?
462只能适用于小型机器人,至于721,感觉和 com结合
作mud gps是比较合适的。。
iam
发表于 2011-11-16 23:57:36
回复 15# trace
吼吼,我也有些鸡冻,惭愧惭愧。
说实话,我只会用462,而且N年前上学的时候玩mud就是用的462,有感情了,而且也不想再费心去学721、mush等等其他的高端的工具。
另外我想还有很多朋友是在用462吧。
基于以上原因,我还是决定把这个坑填下去,而且尽快填满。
iam
发表于 2011-11-17 01:15:08
本帖最后由 iam 于 2011-11-17 01:18 AM 编辑
从现在开始进入正题:
由于前面有朋友说希望举具体的例子,下面就以需要坐船的北京为例,其他地方类似,把思路和实现方法一并奉上。
1、录制路径
这里的录制路径,是指录制已经到达北京地区,开始慢速行走找寻任务npc时的路径,而不是从ct到北京的路径。
录制路径要有针对性,分两种情况:
一是录制无中心区域遍历所用路径,例如对于北京外城,有很多地方叫“土路”,这时可以录制一条路径为“beijing1”,路径经过所有的“土路”
,以及每个土路附近一步或两步范围内的房间,原因请参见1楼。然后设置一个变量,#var cnbeijing1 {土路}。对此想啰嗦几句,如果刚才录制的路
径中还有很多地方叫“大道”,而且也录制了每个大道附近一步或两步范围内的房间,那么可以#var cnbeijing1 {土路|大道}。
二是录制定中心变半径区域遍历所用路径,例如对于北京内城,长安街、西单、天桥等等,这些地名是唯一的。此时可以把北京分为4个区域(不一定
最合适),对于每个区域录制路径,遍历本区域的所有房间,例如假设第一个区域包括北京内城左上方所有房间,可以将路径名存为"beijing2",然
后设置变量,#var cnbeijing2 {押签房|斗鸡房|庭院|……}(请自行补全),其他区域类似,假设已经录制好了beijing3、beijing4、beijing5,并
相应设置了变量cnbeijing3、cnbeijing4、cnbeijing5,并且这些路径包含了所有北京的房间。
以上录制好的路径待用。
2、领受任务
#TRIGGER {慕容复说道:大燕传国玉玺在『北京(%x)』附近出现*} {juti=%1;#var cunzai 0;#var bijiao 0;
#if (%ismember(@juti,@cnbeijing1)) {#alias mrlookfor {#sl .beijing1};type=wcenter} {#add cunzai 1};#add bijiao 1;
#if (%ismember(@juti,@cnbeijing2)) {#alias mrlookfor {#sl .beijing2};type=ucenter} {#add cunzai 1};#add bijiao 1;
#if (%ismember(@juti,@cnbeijing3)) {#alias mrlookfor {#sl .beijing3};type=ucenter} {#add cunzai 1};#add bijiao 1;
#if (%ismember(@juti,@cnbeijing4)) {#alias mrlookfor {#sl .beijing4};type=ucenter} {#add cunzai 1};#add bijiao 1;
#if (%ismember(@juti,@cnbeijing5)) {#alias mrlookfor {#sl .beijing5};type=ucenter} {#add cunzai 1};#add bijiao 1;
#if (@cunzai=@bijiao) {#alias mrlookfor {};#say 没有此地点} {mrb,beijing}} {murong} 519
说明:
ucenter是有中心变半径遍历方式,wcenter是无中心遍历方式,后面会用到。
juti存储要到达的具体地点。通过cunzai和比较两个变量的值来判断要求到达的地点是否在事先录制的路径里。当然如果你事先录制的路径
包含了所有的地点,而且cnbeijing1、2、3、4、5中也相应的包含了所有的地点,而且没有重复,那么完全可以不需要进行这两个变量的比较。
你可以将“#say 没有此地点”更换成任意你想更换的东西,以实现其他功能(例如ask murong about fail),为简便起见,此文中我不打算
对其加以利用。
今天太晚了,明天继续。
iam
发表于 2011-11-17 01:21:30
回复 7# poshu
很想学习一下你对路线返回问题的解决办法,方便的话,请贴出来,谢谢。
trace
发表于 2011-11-17 10:52:07
楼主啊,正好我就多说几句。我以前是做过一个cmud的慕容机器人,现在看简陋的不行。
其实慕容机器人(不考虑图片)就是一个从A地到B地,B地n层遍历,再从B返回A的过程。。
A地到B地,以及返回,只要有了地图数据库,就是一个广度优先搜索最短路径的过程。
这个lua 语言的实现你可以参考ptouch这位高手。c++的话可以看看helllua 的mapper
实现。。
iam
发表于 2011-11-17 13:23:43
继续昨天的说明:
%ismember()函数是判断某元素是否为某字串内的一个。mrb,beijing是当前流行的通用路径。在此通用路径里,很好的解决了坐船问题,向提供此路径的朋友致敬。BTW,我感觉他的思路很好,坐船时,把下船的变量进行赋值,这样统一使用一个变量xiachuan就搞定了下船后的所有问题。
3、准备寻找NPC
通过前面的触发,我们会快速行走到北京长安街(如果我没记错的话),那么怎么让zmud知道我们已经到了北京的初始地点了呢?对于需要坐船才能到达的城市,比如本例里的北京,可以在前人做好的每个包含xiachuan变量路径内手动加上“#say 开始寻找”(或者你喜欢的任何其他内容),然后以“开始寻找”做为触发语句,这样当屏幕上显示“开始寻找”的时候,zmud就知道我们已经到了北京了。对于不需要坐船的,例如xiangyang就更简单一点,可以在{mrb,xiangyang}后面直接加上“#say 开始寻找”,成为{mrb,xiangyang;#say 开始寻找}。
4、开始寻找NPC
#TRIGGER {开始寻找} {mrlookfor} {lookfor} 519
无论是有中心遍历还是无中心遍历,此处都可以先mrlook。
接下来分两种情况:对于无中心遍历,使用:
#TRIGGER {@yourname发现的%s姑苏慕容叛徒} {#stop;follow pantu;killall pantu;@pfm} {murong} 519
在遍历过程中发现目标NPC,则停止慢速行走,跟踪杀掉。这里可能出现在快速行走到北京过程中就发现目标NPC的情况,但并不影响。
拿到玉玺(拿玉玺的过程就不写了)后,如何返回呢?这就涉及到慢速行走,自定义方向的问题。关于这个问题我在另外一篇帖子《天龙新手任务 第三阶段全自动机器人实现方法
》里讲到了,链接地址是:http://pkuxkx.com/forum/thread-24664-1-1.html
这里不再赘述。