我正在用Java创建一个游戏作为练习,但我对如何生成具有这些限制的随机迷宫感到难过:
它必须能够将其迷宫存储在二维数组中 它必须能够生成不同大小的迷宫 它必须有一个指定的起始图块和结束图块
一些细节: 我将迷宫存储在2d int数组中,其中0 =通道,1 =墙,2 =起始块,3 =结束块
我试图在网上找到它,但我发现的算法都没有达到这个标准。有什么建议吗?
答案 0 :(得分:2)
制定块规则并构建一个2d的int数组,其中包含元素/单元格所代表的“哪个块”: 例如。块:
public final int BLOCK_TOP 0x1 // Block has link to top;
public final int BLOCK_RIGHT 0x2 // Block has link to right;
public final int BLOCK_BOTTOM 0x4 // Block has link to bottom;
public final int BLOCK_LEFT 0x8 // Block has link to left;
现在,您可以使用此规则随机地使用整数抢占您的2d数组。 如果你想要一个块在顶部+左边,请将其设为
int maze[x][y] = BLOCK_TOP + BLOCK_LEFT;
向现有块添加方向:
int maze[x][y] |= BLOCK_TOP;
删除方向:
int maze[x][y] &= ~BLOCK_TOP;
检查块迷宫是否有右边的链接,执行
boolean canGoRight = (maze[x][y] & BLOCK_RIGHT != 0);
您的算法将使用随机选择的选项抢占一个完整的网格,随机选择向上,向下,向左或向右(并且相加地,每个块可以无处可去,但必须尊重先前的块。) 如果你从上到下做,从左到右,你每次迭代只需做2次检查。
// nested for, from top left to bottom right.
for(int x = 0; x < sizeOfMazeX; x++) {
for(y = 0; y < sizeOfMazeY; y++) {
// if [x-1][y] contains right, [x][y] must contain left.
if(x > 0 && block[x-1][y] & BLOCK_RIGHT != 0)
block[x][y] |= BLOCK_LEFT;
// if [x][y-1] contains bottom, [x][y] must contain top.
if(y > 0 && block[x][y-1] & BLOCK_BOTTOM != 0)
block[x][y] |= BLOCK_TOP;
// add n other random directions to make it feel random.
}
}
第二阶段获取前一个网格并在其中绘制一条路径:随机向上,向下,向左,向右上行,直到到达另一侧。 第三阶段采用非路径块并美化它们,添加一些指向死胡同的方法。
现在,其余部分非常直观,我不敢再这么做了。
答案 1 :(得分:1)
我会说它像拼图生成器一样。首先制作一个解决方案,看看它是否可以通过迷宫。用一些预建的迷宫编程使用你的数字过程。一旦它可以解决一些迷宫然后把它的触发器变成一个布尔函数接受一个数组,如果能解决它就返回true,否则返回false。
一旦有效,那么您可以随机生成一个数字,询问求解器是否可以通过添加新数字来解决。如果是这样,保存号码并继续前进。如果没有,则生成一个新号码。
一旦它通过添加更大的参数在小数组重构上工作,直到它破裂并找出原因。
当您学习更好的方法来解决迷宫并教导您的求解器时,这将是一个学习过程。很抱歉因为我在手机上缺少代码,但这就是我随机生成像sudoku这样的游戏的方法。