Это алгоритм лабиринта с рекурсивным делением. Но это работает не так, как я ожидал. На картинке ниже вы можете увидеть лабиринт, созданный алгоритмом. Есть несколько стен, которые блокируют только путь, и я этого не хочу. Другими словами, я просто хочу, чтобы ячейка не превратилась в стену где-нибудь в середине ячеек. Посмотрите на картинку, чтобы прояснить ситуацию. Какие изменения мне следует внести?
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);
}
}