递归分割迷宫生成算法生成迷宫不连通且存在缺口问题排查
递归分割迷宫生成问题修复方案
核心问题定位
- 异步递归未等待执行:你声明的
recursiveDivisionMaze是异步函数,但递归调用时未添加await关键字,会导致多层级的墙生成逻辑并发执行,pathCells全局状态冲突,墙绘制顺序错乱,是出现大量缺口的核心原因。 - 子区域边界划分错误:你生成水平墙后,上方子区域的
endRow设为drawAtRow - 1,生成垂直墙后左方子区域的endCol设为drawAtCol - 1,会导致下一轮递归生成的墙和当前墙相邻,出现无效缺口,且子区域宽高计算偏差导致连通性断裂。 - 通道保护逻辑未启用:你注释掉了
anyNeighborPathCell的判断条件,新生成的墙会直接堵住之前预留的通道,是迷宫不连通的主要原因。
具体修改点
- 异步递归添加等待逻辑:将所有递归调用
recursiveDivisionMaze的代码前添加await关键字,保证上层墙绘制完成后再执行子区域的生成逻辑。 - 修正子区域边界参数:
// 水平墙的子区域划分修改为 // 上方区域 await recursiveDivisionMaze( matrix, startRow, startCol, drawAtRow - 2, // 原drawAtRow - 1改为-2,和墙保持1行间隔 endCol, startNode, endNode, makeWall, pathCells ); // 下方区域无需修改,保持drawAtRow + 2 // 垂直墙的子区域划分修改为 // 左方区域 await recursiveDivisionMaze( matrix, startRow, startCol, endRow, drawAtCol - 2, // 原drawAtCol - 1改为-2,和墙保持1列间隔 startNode, endNode, makeWall, pathCells ); // 右方区域无需修改,保持drawAtCol + 2
- 恢复通道保护逻辑:放开绘制墙判断条件中
anyNeighborPathCell的注释,避免新墙覆盖已有的连通通道:
if ( cell !== startNode && cell !== endNode && cell !== pathCell && !anyNeighborPathCell(cell, pathCells, isHorizontal) // 取消该行注释 ) { await makeWall(cell); }
- 修正通道开口规则:限制每道墙的开口坐标和你步长为2的生成规则对齐,水平墙的开口列需取奇数,垂直墙的开口行需取奇数,保证开口可正常连通两侧子区域。
验证方法
修改完成后先测试10*10以内的小网格,暂时关闭makeWall的动画延迟,可快速验证生成的迷宫是否无多余缺口、全区域连通。
内容的提问来源于stack exchange,提问作者Riptide
相关产品推荐
相关产品推荐

