Javascript 递归回溯迷宫发生器

Javascript 递归回溯迷宫发生器,javascript,depth-first-search,maze,Javascript,Depth First Search,Maze,我正在尝试用DFS算法生成随机迷宫,看了几段视频后,我仍然无法理解它。我知道DFS算法是如何工作的,但我不知道如何使用这个算法来实际创建迷宫 下面是我正在使用的代码(递归实现): constdirrow=[-1,+1,0,0]; 常数dirCol=[0,0,+1,-1]; //给定一个当前单元格作为参数 异步函数递归回溯(x,y){ //而当前小区有任何未访问的相邻小区 for(设i=0;i=20 | | newX=20 | | newY

我正在尝试用DFS算法生成随机迷宫,看了几段视频后,我仍然无法理解它。我知道DFS算法是如何工作的,但我不知道如何使用这个算法来实际创建迷宫

下面是我正在使用的代码(递归实现):

constdirrow=[-1,+1,0,0];
常数dirCol=[0,0,+1,-1];
//给定一个当前单元格作为参数
异步函数递归回溯(x,y){
//而当前小区有任何未访问的相邻小区
for(设i=0;i<4;i++){
设newX=x+dirRow[i];
设newY=y+dirCol[i];
如果(newX>=20 | | newX<0)继续;
如果(newY>=20 | | newY<0)继续;
如果(值[newY][newX]。已访问===true)继续;
//将当前单元格标记为已访问
值[newY][newX]。已访问=真;
//删除当前单元格和所选单元格之间的墙
if(值[newY][newX].i]!=null)
值[newY][newX]。邻居[i]。val=-1
//动画
等待renderPath(0,newX+newY*20);
//选择一个未访问的邻居
等待递归回溯(newX,newY);
}   
}
我试着按照维基上的步骤做, 我没有得到的部分是,我不知道在我的2d网格上移除哪面墙

对于实际网格,我使用2d数组,每个X上都有节点类

function Node(val, neighbours){
    this.val = val;
    this.neighbours = neighbours;
    this.visited = false;
}

function createNodeMap(w,h){
    let grid = []
    for (let y = 0; y < h; y++){
        grid.push([]);
        for (let x = 0; x < w; x++){
            grid[y].push(new Node(0, []));
        }
    }
    
    for (let y = 0; y < h; y++){
        for (let x = 0; x < w; x++){
            let neighbours= new Array(4).fill(null);
            if (x-1 >= 0) neighbours[0] = grid[y][x-1];
            if (x+1 < 20) neighbours[1] = grid[y][x+1];
            if (y+1 < 20) neighbours[2] = grid[y+1][x];
            if (y-1 >= 0) neighbours[3] = grid[y-1][x];
            grid[y][x].neighbours = neighbours;
        }
    }
    return grid;
}
功能节点(val、邻居){
this.val=val;
这个。邻居=邻居;
this.visted=false;
}
函数createNodeMap(w,h){
让网格=[]
for(设y=0;y=0)相邻[0]=grid[y][x-1];
如果(x+1<20)邻域[1]=grid[y][x+1];
如果(y+1<20)邻域[2]=grid[y+1][x];
如果(y-1>=0)相邻[3]=grid[y-1][x];
网格[y][x]。邻居=邻居;
}
}
返回网格;
}
创建的网格(灰色柱为墙):

编辑:


我将单元格标记为迷宫的一部分的部分是错误的,因为我实际上没有为墙留出任何空间。

你能告诉我你在可视化/动画中使用了什么吗?我是说你在用哪个图书馆/软件包?另外,你可以发布你生成的网格的图片吗?我只是在使用自定义函数根据索引为HTML元素着色,我已经将网格的图像添加到了原始帖子中。你使用了吗?如果是这样的话,我在你的代码中看不到
,而
(这对我来说非常重要)。我使用的是DFS的递归方法。你能告诉我你在可视化/动画中使用的是什么吗?我是说你在用哪个图书馆/软件包?另外,你可以发布你生成的网格的图片吗?我只是在使用自定义函数根据索引为HTML元素着色,我已经将网格的图像添加到了原始帖子中。你使用了吗?如果是这样的话,我在你的代码中看不到
,而
(这对我来说非常重要)。我使用的是DFS的递归方法
function Node(val, neighbours){
    this.val = val;
    this.neighbours = neighbours;
    this.visited = false;
}

function createNodeMap(w,h){
    let grid = []
    for (let y = 0; y < h; y++){
        grid.push([]);
        for (let x = 0; x < w; x++){
            grid[y].push(new Node(0, []));
        }
    }
    
    for (let y = 0; y < h; y++){
        for (let x = 0; x < w; x++){
            let neighbours= new Array(4).fill(null);
            if (x-1 >= 0) neighbours[0] = grid[y][x-1];
            if (x+1 < 20) neighbours[1] = grid[y][x+1];
            if (y+1 < 20) neighbours[2] = grid[y+1][x];
            if (y-1 >= 0) neighbours[3] = grid[y-1][x];
            grid[y][x].neighbours = neighbours;
        }
    }
    return grid;
}