Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归分割迷宫生成算法_Java_Recursion_Tail Recursion_Maze - Fatal编程技术网

Java 递归分割迷宫生成算法

Java 递归分割迷宫生成算法,java,recursion,tail-recursion,maze,Java,Recursion,Tail Recursion,Maze,我目前正在做一个递归除法迷宫生成算法,我想我差不多做到了。我现在有一个二维数组,20个单元格宽,15个单元格高。数组包含单元格对象,其中包含行、列和一个布尔变量,用于指示它是否为墙 每当我取消注释时 generateMaze(height, maxWidth-randomColumn, 1, randomColumn+1); 我收到了一封信。没有它,它只会向左和向上移动,我需要让它也向右和向下移动。我已经盯着这个看了很长时间,想弄明白为什么,但就是看不见怎么做 编辑:我现在可以生成一些东西,但

我目前正在做一个递归除法迷宫生成算法,我想我差不多做到了。我现在有一个二维数组,20个单元格宽,15个单元格高。数组包含单元格对象,其中包含行、列和一个布尔变量,用于指示它是否为墙

每当我取消注释时

generateMaze(height, maxWidth-randomColumn, 1, randomColumn+1);
我收到了一封信。没有它,它只会向左和向上移动,我需要让它也向右和向下移动。我已经盯着这个看了很长时间,想弄明白为什么,但就是看不见怎么做

编辑:我现在可以生成一些东西,但是迷宫经常被阻塞,也就是说,有些路径被阻塞了。所以如果我设置一个随机的起始位置,它可能会被墙包围

    private void generateMaze(int minColumn, int maxColumn, int minRow, int maxRow){

        int width  = maxColumn - minColumn;
        int height = maxRow-minRow;

        if (width > 2 && height > 2){
            if ("VERTICAL".equals(getOrientation(height, width))){
                splitVertical(minColumn, maxColumn, minRow, maxRow);
            }
            else{
                splitHorizontal(minColumn, maxColumn, minRow, maxRow);
            }
        }
    }

    private void splitVertical (int minColumn, int maxColumn, int minRow, int maxRow){
        int randomColumn = getRandomNumber(minColumn, maxColumn);
        for (int i= minRow; i < maxRow; i++){
            maze[i][randomColumn] = new Cell (i+1, randomColumn+1, true);
        }
        maze[(getRandomNumber(minRow, maxRow))][randomColumn].setWall(false);

        generateMaze(minColumn, randomColumn, minRow, maxRow);
        generateMaze(randomColumn, maxColumn, minRow, maxRow);
    }

     private void splitHorizontal (int minColumn, int maxColumn, int minRow, int maxRow){
        int randomRow = getRandomNumber(minRow, maxRow);
        for (int i = minColumn; i < maxColumn; i++){
            maze[randomRow][i] = new Cell (randomRow+1, i+1, true);
        }
        generateMaze(minColumn, maxColumn, minRow, randomRow);
        generateMaze(minColumn, maxColumn, randomRow, maxRow);
    }



    private String getOrientation(int height, int width) {
        Random rand = new Random();
        if (height > width){
            return "HORIZONTAL";
        } else if (width > height){
            return "VERTICAL";
        } else {
            int randomNumber = rand.nextInt(2);
            if (randomNumber == 0){
                return "HORIZONTAL";
            } else{
                return "VERTICAL";
            }
        }
    }

    private int getRandomNumber(int x, int y){
        int minimum = x;
        int maximum = y;
        int randomNumber = 0;
        Random rand = new Random();
        randomNumber = rand.nextInt((maximum-minimum)+1)+ minimum;
        return randomNumber;
    }
}
private void generateMaze(int-minColumn、int-maxColumn、int-minRow、int-maxRow){
int-width=maxColumn-minColumn;
int height=maxRow-minRow;
如果(宽度>2和高度>2){
如果(“垂直”。等于(getOrientation(高度、宽度))){
垂直拆分(minColumn、maxColumn、minRow、maxRow);
}
否则{
水平拆分(minColumn、maxColumn、minRow、maxRow);
}
}
}
私有void splitVertical(int-minColumn、int-maxColumn、int-minRow、int-maxRow){
int randomColumn=getRandomNumber(minColumn,maxColumn);
for(int i=minRow;i宽度){
返回“水平”;
}否则,如果(宽度>高度){
返回“垂直”;
}否则{
int randomNumber=rand.nextInt(2);
如果(随机数==0){
返回“水平”;
}否则{
返回“垂直”;
}
}
}
私有整数getRandomNumber(整数x,整数y){
int最小值=x;
int最大值=y;
int随机数=0;
Random rand=新的Random();
randomNumber=rand.nextInt((最大值-最小值)+1)+最小值;
返回随机数;
}
}

编辑:我注意到您在Begging有停止条件。我的错

如果代码无限长,则添加一些调试打印,以查看重新融合的进度。宽度和高度似乎没有正确更新。可能您计算的尺寸不正确

我没有完全检查算法,但通常问题是没有停止条件

在递归函数中,您总是递归。这是错误的,你必须检查你是否必须再深入一步


如果出现问题,在递归函数中,您必须检查剩下的电路板是否仍然可以分割。如果函数中还剩下1x1网格,那么它就是死胡同。

在下一行中取消注释:

generateMaze(height, maxWidth-randomColumn, 1, randomColumn+1);
调用递归函数时,随机值在允许值内,因此它将无限递归,因为大小不会减小,因此永远不会满足停止条件:

if (height >= 2 && width >= 2)
为什么要用随机值来调用它?也许正如jnovacho所建议的,您应该添加另一个条件,例如,最大递归级别或类似的条件

建议您尝试在Eclipse中调试代码,如果可能的话,添加一些单元测试,以检查您测试的配置是否仍然有效…

EDIT 您的新代码要好得多,但仍存在以下问题:

  • 您没有在
    splitHorizontal
    中创建墙间隙

  • 当我做width>=10时,您可能想循环到
    i,它在没有stackoverflow的情况下运行,但从9开始,它将开始有时生成stackoverflow,以此类推。男..:(代码已编辑,不再有stackoverflow,只是不准确。@user2472706我已经更新了关于新代码的注释,不过对我来说,这似乎是一个不同的问题。
    
    generateMaze(height, randomColumn-1, 1, 1);
    //generateMaze(height, maxWidth-randomColumn, 1, randomColumn+1);
    
    private void generateMaze(int startRow, int startCol, int endRow, int endCol){
        //...
    }
    
    int randomColumn = getRandomNumber(mWidth, maxWidth);
    
    for (int i = minHeight; i <= height; i++){
        maze[i][randomColumn] = new Cell (i+1, randomColumn+1, true);
    }
    //Make random passage in the column
    maze[rand.nextInt(height)+1][randomColumn].setWall(false);