【发布时间】:2018-02-27 03:28:24
【问题描述】:
我一直在努力在 Java 中实现递归除法算法的工作形式,以便随机生成迷宫。我正在尝试这样做:
http://weblog.jamisbuck.org/2011/1/12/maze-generation-recursive-division-algorithm
我不想复制粘贴代码,但我只是不明白我应该如何递归地划分迷宫,同时在其中创建洞而不是用新墙填充这些洞。
老实说,在这一点上,我有点不好意思发布我当前的代码,但如果有人想看到它,我会的。
我真的很想看到一个代码示例,我可以在其中了解正在发生的事情,因为我发现的所有其他内容都是用 Ruby、python 或 Javascript 编写的,并且使用糟糕的变量名构建,几乎没有 cmets。我可以弄清楚正在发生的事情的要点,但它并没有完全让我明白。
我总是让墙壁紧挨着,或者放置不正确,以至于它们不能正确地平分墙壁。
为了进一步参考,我正在处理一个项目。
class Maze
{
int[][] mazeTiles = new int[width/50][height/50];
boolean completion;
int HORIZONTAL = 0;
int VERTICAL = 1;
int slice;
int xMin, xMax;
int yMin, yMax;
int xRand;
int yRand;
int distX,distY;
int yPoint;
int horizontalSize;
int verticalSize;
Maze()
{
completion = false;
xMin = 0;
yMin = 0;
slice = 50;
verticalSize = mazeTiles[0].length;
horizontalSize = mazeTiles.length;
xMax = horizontalSize;
yMax = verticalSize;
}
void generateMaze()
{
divide(xMin, yMin, xMax, yMax);
// need to variables based on horizontal or vertical
}
void drawMaze()
{
for (int i = 0; i < mazeTiles.length; i++)
{
for (int j = 0; j < mazeTiles[0].length; j++)
{
if (mazeTiles[i][j] == 0)
{
fill(255, 0, 0);
rect(i*50, j*50, 50, 50);
fill(0);
} else if (mazeTiles[i][j] ==1)
{
fill(0, 255, 0);
rect(i*50, j*50, 50, 50);
fill(0);
}
}
}
}
void divide(int xStart, int yStart, int xEnd, int yEnd)
{
distX = xEnd - xStart;
distY = yEnd - yStart;
int yPoint = (int)random(4, yEnd-4);
int xPoint = (int)random(4, xEnd-4);
if(distX > distY)
{
slice = VERTICAL;
}
else if(distY > distX)
{
slice = HORIZONTAL;
}
else
{
slice = (int)random(HORIZONTAL, VERTICAL+1);
}
if (slice == HORIZONTAL)
{
wall(slice, xStart, yPoint, xEnd, yEnd);
if (distX >= 2 || distY >= 2)
{
println("HORIZONTAL");
divide(xStart,yStart,xEnd,yEnd-yPoint); //Top // yEnd - random y value chosen
divide(xStart,yStart+yPoint,xEnd,yEnd); //Bottom
}
else
{
return;
}
}
if (slice == VERTICAL)
{
wall(slice, xPoint, yStart, xEnd, yEnd);
if (distX >= 2 || distY >= 2)
{
println("VERTICAL");
divide(xStart+xPoint,yStart,xEnd,yEnd); //Right
divide(xStart,yStart,xEnd - xPoint,yEnd); //Left
}
else
{
return;
}
}
}
void resetMaze()
{
for (int i = 0; i < mazeTiles.length; i++)
{
for (int j = 0; j < mazeTiles[0].length; j++)
{
mazeTiles[i][j] = 0;
}
}
}
void wall(int direction, int startX, int startY, int lenX, int lenY)
{
if (lenY >= 0 && lenX >= 0 && lenX <= horizontalSize && lenY <= verticalSize && startX >= 0 && startY >= 0 && startX < horizontalSize && startY < verticalSize)
{
if (direction == HORIZONTAL)
{
for (int i = startX; i < lenX; i++)
{
int j = startY;
mazeTiles[i][j] = 1;
}
cutHole((int)random(startX+1, lenX-1), startY, mazeTiles);
}
if (direction == VERTICAL)
{
for (int i = startY; i < lenY; i++)
{
int j = startX;
mazeTiles[j][i] = 1;
}
cutHole(startX, (int)random(startY+1, lenY-1), mazeTiles);
}
}
}
void cutHole(int xLoc, int yLoc, int[][] grid)
{
grid[xLoc-1][yLoc-1] = 0;
}
}
【问题讨论】:
-
您应该发布您的代码。这毕竟是堆栈溢出。
-
如果您不需要代码方面的帮助,您想要什么?
-
张贴minimal reproducible example 说明您遇到问题的代码部分。清楚地描述您预期会发生什么,以及实际发生了什么,包括您收到的任何错误消息。
-
要添加到@shmosel 的评论中,您的标题要求“递归除法”。从数学的角度来看,除法是重复减法,并且非常容易完成。但是在您的问题中,您提到了迷宫以及如何以某种方式划分迷宫。
-
是的,我正在尝试做这样的事情:weblog.jamisbuck.org/2011/1/12/…
标签: java algorithm recursion division maze