韩世忠的遍历应该怎么做啊?
哪位高手给个思路?这种完全不着四六的迷宫怎么遍历?北大侠客行MUD,中国最好的MUD 举个例子出来 韩世忠任务的随机路径也能用这种遍历方法么?每次迷宫的路径都不是固定的呀 韩世忠这种迷宫,用的就是深度遍历,论坛上有几篇文章的,不过蛮难的 这种还是用随机遍历比较好吧 本帖最后由 littleknife 于 2014-5-25 08:37 PM 编辑
huacuoh 发表于 2014-5-22 08:09 AM http://pkuxkx.com/forum/images/common/back.gif
---【【
本帖最后由 huacuoh 于 2012-4-24 09:06 PM 编辑
所谓的乱入,就是本来我设计好的行走路线是a b c d e,结果在走到c房间的时候却被系统推到m房间去了。
所以解决乱入的基本思路就是以m房间为中心点进行深度遍历,一直找到c房间时遍历停止。记录从m到c的路径,添加到原来的路径当中。
也就是:
1, 当在c房间时候记录下c房间的所有信息。
2,乱入到m房间,打完劫匪后,镖车放下,深度遍历,、每走到一个房间和以前记录的正确的c房间信息作对比,如果相同遍历停止,找到c房间,记录下从m到c房间的路径为n e的话,那么修正原来的路径(变量lj)为a b c (w s n e) d e,然后回到m房间从lj的第bianli_i+2步开始行走就ok了,
具体的代码实现:---------------深度遍历-------------------------------------------------------------
--】】
这种思路将面临的问题:
按指定线路推车,然后遇到乱入遍历的第一个问题,就是你得记住每一步走到哪里了。以便判断在哪一步发生的乱入。
但是若是多层乱入,这个问题就很复杂了,一次乱入你刚记录好房间,然后再次发生乱入
怎么办?如:你记录的顺序a、b、c、d,c点发生乱入到m。但是你从m推到c的过程中再
次发生n次乱入。嚯嚯。。甚至乱入在一定时间都不停,你又咋办。。。最后就是根本无法还原线路。
1、乱入点是随机的,你无法判断在哪步发生,除非每推车一步就记录房间信息。可是在当前网络狂卡LAG的情况下,每推走一步就记录房间信息
(你指的是房间名吗?那信息可太少了)基本不太可能。abcd,在c点发生乱入,你只知道走到了第几步发生的乱入,可是这步对应的房间信息如何获取?事先录制好?
所以我称按线路推车为‘闭眼睛’推车,很不好控制。
我的早期解决方法:
所以一定要遍历的话,可以采用投掷标记物的方法:就是每推车一步,刚推到新房间就仍一个东西(比如铜钱、酒袋等等)最妥善的标记物就是自己的大米,呵呵。然后发生乱入了就去遍历标记物。在推下一步之前收回标记物。无论多少层乱入,标记物找到后就可以计算路线返回了。
2、放下镖车遍历房间信息,尤其是重复房间很难处理。若你的镖车跟前还有个镖车(两个镖车在一个房间)甚至此房间还是重复房间,嚯嚯。。采用上面的思路吧。
3、最麻烦的、最根本核心的其实归根结底还是房间信息的获取问题。
最终的解决办法:录制地图库吧。线路自动查询生成GPS。乱入去吧。。到哪里我都知道在哪里。呵呵。
对于韩世忠的JOB:副本地图内由于本身有其自身的“特点”,所以其实不用完全靠遍历来解决。比如,开始的时候就带你到NPC地点等,再比如在某某一定出现NPC等等。。若用遍历解决。还是深度遍历(中心点遍历)比较合适。但是韩世忠的副本出现多个NPC需要记录其个数,其流程设计反倒是重于遍历。
附一段早期的线路代码仅供参考吧:
-----------------------------------------------------------------------------
function inter_path(pathstring,startpoint,endpoint)
----给一条路线,截取起始点到终止点的正向路线。
----如:pp="e;w;s;n;e;n;e;n;e",总步数:9步。截取第3步开始到第5步的路线。
----第3-第5的路线:s;n;e,即抽出第3、4、5步单存成为一个串。s;n;e
----pp,3,0意思是从3开始到最后即s;e;e;n;e;n;e,pp,0,3意思是从开始到第三步即e;w;s
----5,5,意思是从5开始到回扣到5,e;n;e;n;e; e;w;s;n;e
local temp_steps_tb={}
_,_,blpath_tb,_=convert_path(pathstring)
fullsteps=table.maxn(blpath_tb)
if startpoint<=1 then startpoint=1 end
if endpoint>fullsteps then endpoint= fullsteps end
if startpoint<=endpoint then
for i= startpoint,endpoint do
table.insert(temp_steps_tb,blpath_tb)
end
blpath_string=table.concat(temp_steps_tb,";")
return blpath_string
else
for i= startpoint,fullsteps do
table.insert(temp_steps_tb,blpath_tb)
end
for i=1,endpoint do
table.insert(temp_steps_tb,blpath_tb)
end
blpath_string=table.concat(temp_steps_tb,";")
return blpath_string
end
end 回复 9# littleknife
这是mush代码吧?zmud党完全看不懂。。。。
录制地图库应该是个一劳永逸的方法,我之前也录过大部分地图数据,但网上一直没找到比较全面的介绍如何使用地图库的文章,大侠有相关帖子能介绍一下吗? /bow 我记得zmud里有个mazone的命令是可以遍历区域地图的。
地图的录制主要目的:1、确定你在当前房间和地图库的房间是否一致的问题。也就是定位。2、生成到目标的路线以便行走。3、遍历指定房间。
第一个问题的关键是你能否有效的抓取当前房间的尽可能详细的信息。比如出口、描述、房间名等。抓的越全面对比起来越精确。。具体的抓取方法在mush中可以考虑用线程暂停的方法。在zmud中也可以考虑发送设定变量抓取结束标志的方法。
第二个问题,就是用函数计算两个目标房间的最短路线的事情了。基本的MUSH中,可以自编或参考城际互联的寻路方式。zmud中好像就有个find命令直接解决吧。
第三个问题,首先要定位你所处位置反馈给地图库。然后遍历地图库相邻房间形成遍历路线。比如深度5层遍历,其实质是遍历地图库。另外一种就是不依靠地图库,只依靠出口信息来实现遍历,但是也有弊端:就是遇到环形路线时易形成错误路线。
至于地图库的录制方法可以查阅ptouch大侠的帖子,写的很详细了。 本帖最后由 hasea 于 2014-5-26 01:03 PM 编辑
1、多次乱入的问题,如果最后偏移原点房间太远,遍历回去是很麻烦的。但大部分时候这样解决还是可以的,最好的当然是有gps了。错叔的方法贵在简单,出错也不会很多。
2、最短路径很好解决,直接广度优先搜索就行了。数据不多的话很快。
3、最困难的是重复房间判断。一般可用以下几种解决方法。
A、不判断重复,但设定深度,这样虽然会有房间被循环遍历到,但最后还是能回到原点房间。
B、look周边房间,再对比判断。很多时候也判断不出。当然可以同时进入周边多个房间再look判断,但问题很多。
C、使用大米判断。这要两个号。这里注意可能有很多房间类似的(7,8个以上)
D、使用扔铜钱的方式判断
E、你有所有房间数据的地图库,直接与地图库循环对比。
4、在随机迷宫中出现的周边房间遍历。只能采用以上A方法为好。比如设定遍历深度为5,不管重复。
5、如果不是遍历周边房间,而想在迷宫中从一头找到另一头的出口。又不想识别重复的情况下,有以下的简易方法可用。
a、不保存走过的路径,不保存房间数据,不识别重复
b、不允许走回头的出口,除非是最后一个房间
c、排除回头的的出口后,按顺序选取一个出口,并存储此选择顺序。比如预定出口有。返回上个房间的出口假设是n。那么现在可用的出口就是。选择第一个w出口进入,以后所以房间都一样,直到没有w出口的房间,然后选择e,把w插入后面变成。这样,将一直向西走,然后折向东。
d、另一种出口选择的方法是随机选择。在除去返回出口的其它出口中随机。比如随机在中选择一个出口。
e、这样,一般不大的迷宫也能在几十步内找到出口。
f、其实就是暴力乱走。没啥特别的。
6、不过,看楼主同学的样子,应该还处在迷惑基本遍历实现的阶段。这个不知从何说起,就是发现出口,储存起来,再一个一个进去而已,思考一下,应该不难才是。 本帖最后由 littleknife 于 2014-5-26 01:18 PM 编辑
其实,重复房间也好,环形路径也罢。其核心还是影响你的定位判断而已。也就是说,让你无法定位你当前的位置。也就无从和数据库也好、地图信息列表也罢来进行对比。
不判断重复,但设定深度。这是路线搜索问题,而非定位问题。深度N层遍历其实基本上还属于闭着眼睛走路(也就是不去判断房间信息)的方式。楼主使用zmud客户端。可以参考糖果seagate的做法。另外,楼上的look模式也是解决之道之一。还有就是若采用深度遍历,可能还要面临你有可能遍历到老林、沙漠、树林等特殊地形中,得事先屏蔽或处理。
页:
[1]
2