Как мне остановить мой алгоритм лабиринта, чтобы стены были перед единственным путем? - PullRequest
1 голос
/ 19 июня 2020

See here in Maze the paths are blocked by walls Это алгоритм лабиринта с рекурсивным делением. Но это работает не так, как я ожидал. На картинке ниже вы можете увидеть лабиринт, созданный алгоритмом. Есть несколько стен, которые блокируют только путь, и я этого не хочу. Другими словами, я просто хочу, чтобы ячейка не превратилась в стену где-нибудь в середине ячеек. Посмотрите на картинку, чтобы прояснить ситуацию. Какие изменения мне следует внести?

export const recursiveDivision=(grid)=>{
const visitedNodes=[];
const height=grid.length;
const width=grid[0].length;
for(let i=0;i<height;i++){
    const tempNode=grid[i][0],tempNode1=grid[i][width-1];
    tempNode.isWall=true;
    tempNode1.isWall=true;
    visitedNodes.push(tempNode);
    visitedNodes.push(tempNode1);
}
for(let i=0;i<width;i++){
    const tempNode=grid[0][i],tempNode1=grid[height-1][i];
    tempNode.isWall=true;
    tempNode1.isWall=true;
    visitedNodes.push(tempNode);
    visitedNodes.push(tempNode1);
}
recursiveDivisionMaze(grid,visitedNodes,1,height-2,1,width-2);
return visitedNodes;

}

function recursiveDivisionMaze(grid,visitedNodes,startX,endX,startY,endY){
const height=endX-startX+1;
const width=endY-startY+1;
if(height<3 || width<3){
    return;
}
if (startX < 0 || startY < 0 || endX >= grid.length || endY >= grid[0].length || startX > endX || startY > endY)
    return;

const hOrV=getOrientation(height,width);
if(hOrV==='Horizontal'){
    const wallX=getRandomInt(startX+1,endX-1);
    const skipY=getRandomInt(startY+1,endY-1);
    for(let wallY=startY;wallY<=endY;wallY++){
        if(wallY===skipY ){
            continue;
        }
        const node=grid[wallX][wallY];
        node.isWall=true;
        visitedNodes.push(node);
    }
    recursiveDivisionMaze(grid,visitedNodes,startX,wallX-1,startY,endY);
    recursiveDivisionMaze(grid,visitedNodes,wallX+1,endX,startY,endY);
  }
else if(hOrV==='Vertical'){
    const wallY=getRandomInt(startY+1,endY-1);
    const skipX=getRandomInt(startX+1,endX-1);
    for(let wallX=startX;wallX<=endX;wallX++){
        if(wallX===skipX){
           enter image description herecontinue;
        }
        const node=grid[wallX][wallY];
        node.isWall=true;
        visitedNodes.push(node);
    }
    recursiveDivisionMaze(grid,visitedNodes,startX,endX,startY,wallY-1);
    recursiveDivisionMaze(grid,visitedNodes,startX,endX,wallY+1,endY);
}

}

...