Javascript 递归回溯迷宫发生器
我正在尝试用DFS算法生成随机迷宫,看了几段视频后,我仍然无法理解它。我知道DFS算法是如何工作的,但我不知道如何使用这个算法来实际创建迷宫 下面是我正在使用的代码(递归实现):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
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;
}