C++ 三维迷宫算法

C++ 三维迷宫算法,c++,algorithm,maze,C++,Algorithm,Maze,有生成三维迷宫的算法吗?基本上与2D迷宫相同,但Z深度轴可以穿过?不过,从开始到结束,这个想法还是一样的。还可以使用回溯吗 我应该使用哪种算法生成3D迷宫 看。我的意思是,你也可以进入立方体,而不仅仅是迭代立方体的面。几年前我用Kruskal的算法制作了二维迷宫。你所描述的3d案例应该没有理由不起作用。基本上,你会考虑一个立方体,并且有一个大数组(对于每个单元),在+/-x,y和z方向上有6个墙。该算法最初从所有墙壁开始,并随机使墙壁消失,直到迷宫中的每个细胞都连接起来。我有生成二维迷宫的代码,

有生成三维迷宫的算法吗?基本上与2D迷宫相同,但Z深度轴可以穿过?不过,从开始到结束,这个想法还是一样的。还可以使用回溯吗

我应该使用哪种算法生成3D迷宫


看。我的意思是,你也可以进入立方体,而不仅仅是迭代立方体的面。

几年前我用Kruskal的算法制作了二维迷宫。你所描述的3d案例应该没有理由不起作用。基本上,你会考虑一个立方体,并且有一个大数组(对于每个单元),在+/-x,y和z方向上有6个墙。该算法最初从所有墙壁开始,并随机使墙壁消失,直到迷宫中的每个细胞都连接起来。

我有生成二维迷宫的代码,在所有东西中,RPGLE(我在学习语言时做的自我练习)。由于我写它的方式,对于一般算法来说唯一必要的改变就是增加Z维度作为附加维度

整个过程有20页长(虽然这包括输入/输出),所以这里有一些代码。你应该能够把它翻译成你需要的任何语言:我是从意大利面条代码BASIC翻译过来的(
goto
s在这里被过度使用了,是的。但这是一个有趣的练习)

//设置最大迷宫大小
maximumMazeSquareCounter=mazeHorizontalSize*mazeVerticalSize+1;
//生成起始水平位置GetRandomNumber(种子:randomNumber);
currentHorizontalPosition=%inth(随机数*(mazeHorizontalSize-1))+1;
当前垂直位置=1;
mazeSquareCounter=1;
//生成迷宫的顶行(带入口)
mazeTopRow=发电机状态(当前水平位置);
//写入打印机文件
writeMazeDataLine(mazeTopRow);
mazeSquareCounter+=1;
//设置迷宫中的第一个位置(入口广场
设置路径点(当前水平位置:当前垂直位置);
//直到我们到达迷宫中的每一个广场
dou mazeSquareCounter>=最大平方计数器;
//获取下一个可用的随机方向
mazeDirection=getNextRandomDirection(getNextAvailableDirection(currentHorizontalPosition:currentVerticalPosition));
//根据返回的结果选择要执行的操作
选择;
//当返回FALSE时-当迷宫被捕获时
当mazeDirection=FALSE时;
//如果不是在迷宫的水平端
如果当前水平位置为mazeHorizontalSize;
//给这个职位加一个
当前水平位置+=1;
//否则,如果不是在迷宫的垂直端
elseif currentVerticalPosition mazeVerticalSize;
//重置水平位置
当前水平位置=1;
//增加垂直位置
当前垂直位置+=1;
//否则
其他的
//重置两个位置
当前水平位置=1;
当前垂直位置=1;
endif;
//返回“N”时-向上(其他方向已删除)
当mazeDirection=向北行驶时;
//将点设置为高于当前值
设置路径点(currentHorizontalPosition:currentVerticalPosition-1);
//设置墙点以允许通过
设置墙方向(当前水平位置:当前垂直位置:向北);
//更改位置变量以反映更改
当前垂直位置-=1;
//递增平方计数器
mazeSquareCounter+=1;
endsl;
enddo;
//生成一个随机出口
//得到一个随机数
getRandomNumber(种子:randomNumber);
//设置为水平位置
currentHorizontalPosition=%inth(随机数*(mazeHorizontalSize-1))+1;
//设置垂直位置
currentVerticalPosition=mazeVerticalSize;
//设置墙以允许出口
设置墙方向(当前水平位置:当前垂直位置:向南);
整个过程由两个二维数组(好吧,RPG等价物)支持:一个用于占据“广场”的墙壁,另一个用于是否访问过该广场。迷宫是在每个广场访问后创建的。仅添加一条路径,worm会转迷宫


要使其三维化,请使用三维阵列,并添加必要的维度索引。

不久前,我为方形网格上的二维迷宫设计了一个算法,没有理由不适用于立方体网格上的三维迷宫


从最初完全填充墙单元的三维网格开始

在网格的边缘启动一个代理,代理沿X、Y、Z、-X、-Y或-Z方向沿直线移动,在移动过程中清除墙

操作“N”在每个步骤中发生的几率很小

当代理正前方的单元格为墙且前面的单元格为空时,会发生动作“M”

“N”是以下各项的随机选择:

  • 移除该代理
  • 向左或向右转90度
  • 在同一个正方形上创建一个代理向左、向右或同时向左、向右旋转90度(两个代理)
  • “M”是以下各项的随机选择:

  • 移除该代理
  • 移除该代理前面的墙,然后移除该代理
  • 什么也不做,继续
  • 向左或向右转90度
  • 在同一个正方形上创建一个代理向左、向右或同时向左、向右旋转90度(两个代理)

  • 迷宫与众不同,它们的特点是高度灵活,通过调整“M”的触发(与有效的交叉点有关)以及调整1到8发生的几率。您可能希望删除一两个动作,或者引入您自己的动作,例如一个小的清除动作或一步一步的回避动作

    “N”的触发器也可以是另一种随机性,例如,下面的示例可用于创建仍然有一些长直部分的相当分支的迷宫

    float n = 1;
    
    while (random_0_to_1 > 0.15)
    {
        n *= 1.2;
    }
    
    return (int)n;
    

    根据我的简单描述,需要进行一些小的调整,例如,动作“M”的触发器也需要检查与其检查的单元格相邻的单元格,具体取决于检查的内容
    float n = 1;
    
    while (random_0_to_1 > 0.15)
    {
        n *= 1.2;
    }
    
    return (int)n;