找回密码
 注册
搜索
查看: 6102|回复: 32

迷宫详解(原创)

  [复制链接]
门派:不明
发表于 2015-4-12 00:12:10 | 显示全部楼层 |阅读模式
本帖最后由 ltblue@tx 于 2015-4-12 12:20 编辑

本来想灌水多发几贴,不过考虑到其实我自己也需要整理近期的研究成果,就发在一起吧,自己看着也方便
二楼是襄阳郊外树林(拿玄铁剑)
三楼是终南山黑林
五楼是华山村菜地(4楼被插......)
六楼是长安城长街
八楼是长安城柏树林(7楼被插)
九楼是武当山小径
十楼是兰州城沙漠(梅超风处)
十二楼是天龙寺松树林(11楼被插)
十三楼是华山松树林
十四楼是峨嵋山古德林
十八楼是无量山荆棘林
十九楼是铁掌山松树林
二十楼是嵩山少林塔林
二十一楼是峨嵋山冷杉林
二十二楼是峨嵋山小竹林

目前在中原的迷宫,除了绝情谷和少林寺以外,其他都写完了,后面的目前还没研究,以后再说吧

评分

1

查看全部评分

门派:不明
 楼主| 发表于 2015-4-12 00:13:30 | 显示全部楼层
襄阳郊外树林是个随机迷宫(其他很多迷宫看起来很乱,但不随机,这个迷宫是相对很随机的迷宫了)
从我看到的代码来看(实际测试上也没发现与事实有误),迷宫由10个房间组成,分别是linhai1-linhai10
linhai=林海
十个房间的描述一样,方向一样,但其实是有一条潜在的道路的
迷宫的两端,是两条山路,我们可以定义为北端山路(通往神雕)和南端山路(通往襄阳)
林海的每个房间的出口是一个固定出口和三个随机出口。
固定出口为循环顺向,林海1的固定出口通往林海2,林海2的通往林海3......林海10的通往林海1
特殊的,林海1有固定出口可以通往南端山路,林海8有固定出口可以通往北端山路
坑爹的是,不管从哪个方向进林海,都是随机的到达10个房间中的某个房间,也就是说,我们任何时候都不知道自己在哪个房间,所以“固定路线”其实意义不大
具体的固定路线如下:
林海1:林海2n,南端出口s
2:e
3:n
4:e
5:w
6:s
7:n
8:林海9s,北端出口n
9:s
10:n
从这个角度来看,固定路线是没用的,因为我们不知道自己在哪里
但从另外的角度来说,即使我们不知道自己在哪里,如果按照固定路线走,由于走错了会随机出现在任意位置,只要我们在路线中的任意一次走对了,其他线路就跟着对了,这样可以极大的提高走出来的概率,我的测试是几乎没有失败的,最多试两次一定出来。

路线如下:
进去的路线:n(走进林海);e;n;e;w;s;n;n;s;n
为了避免不小心出来,我们把所有的s之前加上nu,就得到
n;e;n;e;w;nu;s;n;n;nu;s;n
用这个路径,不管在什么位置,基本都能一次进去了

出来的路径同理
s;e;n;e;w;s;n;s;s;n;s
加上避免再次误入的se,路径为
s;e;se;n;e;w;s;se;n;s;s;se;n;s
这样,不管在任何地方,基本都可以一次出来

整理一下路径吧,应该可以用了
进去的路径
n;e;n;e;w;nu;s;n;n;nu;s;n;nu  可以直接到山路第二步
出去的路径
s;e;se;n;e;w;s;se;n;s;s;se;n;s;se  可以直接到山间空地
门派:不明
 楼主| 发表于 2015-4-12 00:21:46 | 显示全部楼层
终南山黑林是个扯淡的迷宫,路线很简单,大概说一下原理
黑林一共4个房间,每个房间4个出口
房间1的出口:n4,s3,e1,w1
房间2的出口:n1,s4,e2,w2
房间3的出口:n2,s1,e3,w3
房间4的出口:n3,s2,e4,w4
所以,如果你身在黑林,想遍历黑林里所有房间找杀手,无脑4个n即可(4个s也行)
但光看这些出口,我们是出不去的,另外还有代码如下设置
if ( dir == "east")
            me->add_temp("mark/steps",1);
        if ( dir == "west")
            me->add_temp("mark/steps",-1);         
        if (me->query_temp("mark/steps") == 6){
            me->move(__DIR__"shulin2");
            me->delete_temp("mark/steps");
            return notify_fail("你精疲力尽,终於走出了黑林。\n");
        }  
        if (me->query_temp("mark/steps") == -6){  
            me->move(__DIR__"shulin1");
            me->delete_temp("mark/steps");
            return notify_fail("你累得半死,却仍是回到原地。\n");
        }
大体意思就是说,进入黑林之后,往东走6步,就到了古墓内,往西走6步,就到了古墓外
就这么简单
结论:
想进去,就无脑一路e
想出来,就无脑一路w
想在黑林里找人,就在黑林里n4次,或者s4次,就算遍历结束


这类的迷宫还有很多,不过像这样简单的倒是不多见
门派:不明
 楼主| 发表于 2015-4-12 00:27:39 | 显示全部楼层
华山村菜地其实没什么可说的......
全迷宫就1个房间......不存在遍历的问题
4个方向,怎么走都是自己
有点冷的知识大概是每次行走随机减少0-39点精力,精力小于50会晕
每次行走会有0-2秒的busy
往任意方向行走的结果都一样
每次行走,有60%的概率会增加步数1
每次行走,有20%的概率会减少步数1
当步数达到10的时候,就走出来了
门派:不明
 楼主| 发表于 2015-4-12 00:37:48 | 显示全部楼层
长安城长街有两个房间,其中从南大街e的那个房间是迷宫,map如此
长街-----长街-----长街
从这个房间一路走,出去之后的房间不是迷宫,map如此
                           柏树林
                       ↗
长街-----长街-----柏树林
                      ↘
                           慈恩寺
名称虽然相同,但map不同,描述不同,所以不可同日而语

迷宫这个房间,很简单,由于就w和e两个方向,w通往南大街,e通往长街2(非迷宫)
从代码看,每次行走都判断一次是否走出去,如果行走步数大于一个5-9的随机数时,视最后一次走的方向到达出口南大街或者长街2(之前方向无所谓)
所以,走法也很简单
到南大街就一路w,为防止过量,我们要走回头路,即
#12 w;e;e
到长街2就一路e,由于长街2的东边是另外一个迷宫柏树林,因此需要慈恩寺来缓冲,即路径为
#5 e;se;e;se;e;se;e;se;e;se;e;se;nw


门派:不明
 楼主| 发表于 2015-4-12 00:49:16 | 显示全部楼层
柏树林本身也很简单,只是出口略多罢了
柏树林一共两个房间,可以命名为柏树林1和柏树林2

柏树林1的map是这样的
    柏树林              柏树林
             ↖        ↗
柏树林----柏树林----柏树林


柏树林2的map是这样的

               柏树林
                   |
柏树林----柏树林----柏树林
              ↙        ↘
    柏树林              柏树林

两个map不同,很容易发现区别

跟长街类似,柏树林也用的计算步数的方法来写的(从文件看,两者都是一个叫Yanyang的人写的)
每行走一次,增加步数1,当步数大于一个20-39的随机数时(比长街还长多了......),就离开了迷宫
离开迷宫的方向视最后一步的方向而定

柏树林1的4个方向分别通往
20-39个e:温泉
20-39个ne:始皇陵
20-39个nw:柏树林2
20-39个w:长街2

柏树林2的5个方向分别通往
20-39个e:始皇陵
20-39个n:小雁塔
20-39个se:柏树林1
20-39个sw:长街2
20-39个w:碑林
门派:不明
 楼主| 发表于 2015-4-12 01:10:08 | 显示全部楼层
武当山小径情况比较特殊,属于比较难的迷宫了吧
相关房间一共7个,其中俞莲舟为小径1,俞莲舟s为小径2,加上院门(殷梨亭),一共3个非迷宫房间
小径3-小径6,一共4个迷宫房间
房间大体出口如下:
小径1的s是小径2,这个无所谓了
小径2的s是小径3
院门的n是小径6
然后是迷宫
小径3的方向:e4,w5,n6,s3
小径4的方向:e3,w5,n4,s6
小径5的方向:e3,w4,n5,s6
小径6的方向:e3,w4,n6,s5
如果想遍历,可以这么做
首先一个e,确保在小径3或4,然后一个w,确保在小径5,然后e到3,然后e到4,再s到6即可
即遍历(找杀手用)路径为:e;w;e;e;s

如果想走到院门,必须看灯光了,说哪里有亮光就去哪里
一共需要看9次亮光,全部成功就能到达院门
如果失败1次,成功次数清零(如果本来就不大于0,则每次失败-1,即负数),计算失败次数1
失败次数大于一个4-6的随机数时,送到小径2(即俞莲舟s处)

所以,如果要进去,就请飞蛾扑火成功9次
如果想出来,失败4-6次即可
门派:不明
 楼主| 发表于 2015-4-12 01:16:42 | 显示全部楼层
兰州城沙漠(找梅超风的)是记步式迷宫
一共两个房间
沙漠1:4个出口,除s到沙漠2外,均为保持在沙漠1
沙漠2:5个出口,多出来的是enter到梅超风,其他4个出口均到沙漠1
需要注意的是,每走一步,饮水减10,直到0为止
要走出沙漠很简单
每s一步,步数减1
每n一步,步数加1
当步数的绝对值大于一个1-9的随机数时,就走出来了
换句话说,要想出来,一路s或者一路n即可
如果想找梅超风,只要在沙漠里enter;s;enter即可

不过,带足水比较好
理论上说,想出来,最多可能损失90%的饮水
门派:不明
 楼主| 发表于 2015-4-12 01:39:16 | 显示全部楼层
天龙寺松树林总体来说比较麻烦,但不难

首先澄清,天龙寺松树林共两个迷宫,描述不同
松树林1的描述是
这里是一片茂密的松树林,松树高大,枝叶茂盛,你一走进来差点便迷失了方向。这里灌木丛生,路都给挡住了。

松树林2的描述是
这里是一片茂密的松树林,松树高大,枝叶茂盛,你一走进来差点便迷失了方向。一条长廊由西向东通往松林深处。

首先说松树林1
松树林1是大家常走的迷宫(至少我等天龙寺和尚常走),迷宫一共4个房间,出口如下:
1的出口:e2,w3,n4,s1
2的出口:e4,w3,n2,s3
3的出口:e2,w4,n3,s1
4的出口:e4,w1,n4,s3
如果想遍历(找杀手),可以先e到2或者4,再s到3,然后e;e;w即可
即e;s;e;e;w
当然,遍历路径很多,这只是其中一个

关键是出口和入口
直接说结果吧
如果想出去,一路s即可,如果之前没走过n,那么#10 s就行,每多走一个n,就得多走一次s
但不管怎么说,一路s按到底,必然可以出去
到龙书院,只有一条路:进松树林后#5 w;#6 n
没有其他路径,是定点的。如果你进来松树林已经行走过,而且不记得怎么走的,必须先一路s出迷宫,然后再进来找
说句题外话:除了龙书院,进到迷宫后还可以找到一个叫”小洞天“的地方,不知道有啥用
小洞天路径为:进入迷宫后#6 e;#7 n,同时进该房间要求先天悟性的随机值大于20,我先天悟性只有20,所以无论如何是进不去了,大家可以试试。

再说松树林2
这个迷宫不常见,在去牟尼堂的位置
这个迷宫一个3个房间,其中一个房间不是迷宫房间,map如下
            松树林
               |
长廊----松树林----长廊
               |
            松树林

这个房间的s和n,分别通往另外两个迷宫房间,但这个房间本身不是迷宫,e的长廊通往牟尼堂

另外两个房间是迷宫,map四周都是松树林,不贴了

这两个房间的n和s方向,分别通往彼此,即房间1的n和s是房间2,反之亦然。
所以,要遍历这个松树林,一个n或一个s即可
这两个房间的w方向,都是自身
这两个房间的e方向,其中房间1的e方向是自身,房间2的e方向为松树林迷宫1的3号房间
因此,松树林迷宫2的出口是通往松树林迷宫1的,再从松树林迷宫1,一路s再出来

好吧结论最后整理一下:
松树林1的遍历路径为:e;s;e;e;w
松树林1的出口方法:一路s
松树林1去龙书院:进松树林后直接#5 w;#6 n,之前不能动,否则必须出来再进
松树林1去小洞天:进松树林后直接#6 e;#7 n,之前不能动,否则必须出来再进,要求先天悟性的乘以0-0.999的随机值大于20

松树林2的遍历路径为:n
松树林2的出口:e;n;e,到松树林1
门派:不明
 楼主| 发表于 2015-4-12 02:32:59 | 显示全部楼层
本帖最后由 ltblue@tx 于 2015-4-12 02:33 编辑

华山松树林是大家每天最长走的迷宫,没有之一
可是,很遗憾,这个迷宫是随机迷宫,没有绝对路径
而且,由于随机房间很少,相对路径也较难,详解如下:
松树林一个5个房间,其中只有2个房间是迷宫,其他3个房间都不是迷宫

第一个房间的名字叫”树林“,不叫松树林
树林的map如下:
               松树林
                  |
松树林-----树林-----松树林
他的出口分别为:
e到松树林1
n到松树林2
w到松树林3

松树林1的map如下:

               松树林
                  |
松树林----松树林----松树林
                  |
                 空地
他的出口分别为:
s到空地
n到松树林2
w和e均为自身

松树林2和松树林3的map不贴了,四周均为松树林,且出口均为松树林1-4

松树林4的map为
                 空地
                   |
松树林----松树林----石屋
                   |
                山脚下
出口w是自身,其他如图了


房间出口就是如此简单,也没有其他问题,但这个迷宫还是不好走
从山脚下进来,到树林1,然后如果不想遍历,则走n或者w到树林2或3即进入迷宫
在迷宫里则随便走,直到找到松树林4为止

人走好走,机器走就麻烦了
在松树林里,不能一路e或w,因为可能随机到松树林1,而松树林1的w和e均为自身,就困在那里了
也不能一路s,因为松树林1的s是空地,空地的s没出口,而且松树林4的s是山脚下,很容易不小心再走进来
也不能一路n,因为松树林4的n是空地,而空地的n又回到松树林了,没意义

所以这个迷宫就比较蛋疼了
主流的做法是n;#5 e,然后找到石屋
其实,如果想直接出来,可以
#6 {n;n;#5 e;w;s;se}
也可以直接到莎萝坪,但其实这个也是n;#5 e



客观的考虑哈,这事是这样的
从概率上讲,每次出现到1-4的概率都相同
如果到1,有25%的概率,这时候必须n,其他没意义
如果到2或3,有50%的概率,这时候什么都行,目标是4
如果到4,绝对不能n,又回去了,其他都可以
这样就是个悖论,不管2或3怎么随机,都有可能在最后一个指令到4,那么这时候n就回去了

我们的目标是增加2和3的随机率,确保不在1卡死,尽量避免在4n的回流

n的数量可以是1个或者2个,如果是1个,有可能在1的时候浪费时间,如果是2,有可能在4回流
总体来说,1个比较好
1个n之后,跟e还是跟w区别不大,但w之后也要e到石屋,所以还是e比较好
跟几个e有概率问题:
跟e多了,导致如果在1房间浪费;跟e少了,可能随机次数不够
如果不考虑到卡的情况,其实e越多越好,这样可以有效避免随机次数不够的问题
理论上,只要e的够多,那么可以保证每次结束,都出现在1或者4的地点
第1次e,有25%的概率到石屋,25%的概率到1然后本轮失败,50%的概率继续
第2次e,有12.5%的概率到石屋,12.5%的概率到1然后本轮失败,25%的概率继续
第3次e,有6.25%的概率到石屋,6.25%的概率到1然后本轮失败,12.5%的概率继续
第4次e,有3.125%的概率到石屋,3.125%的概率到1然后本轮失败,6.25%的概率继续
第5次e,有1.5625%的概率到石屋,1.5625%的概率到1然后本轮失败,3.125%的概率继续
第6次e,有0.78125%的概率到石屋,0.78125%的概率到1然后本轮失败,1.5625%的概率继续

一个n后面6个e的结果,就是有49.22%的概率到石屋,49.22%的概率在松树林1,1.56%的概率在松树林2或者3或者4

可以说,n;#6 e应该是最好的办法了
相当于抛硬币,每次都有差不多一半的概率出去
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|书剑永恒MUD ( 闽ICP备14012032号|闽公网安备 35050202000162号 )

GMT+8, 2024-5-15 15:13 , Processed in 0.039407 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表