UNPKG

@thewizardbear/maze_generator

Version:

A deno-compatible package for maze generation

58 lines (52 loc) 1.55 kB
import { directions, dx, dy, fullNames, opposite } from "./directions.js"; export default function braid({ maze, }) { let deadEnds = []; maze.algorithm.walls.forEach((row, y) => { row.forEach((cell, x) => { let connectedDirections = []; for (let direction in cell) { if (!cell[direction]) connectedDirections.push(direction); } if (connectedDirections.length === 1) { deadEnds.push({ x, y, direction: opposite[connectedDirections[0]], }); } }); }); deadEnds = maze.algorithm.shuffle(deadEnds); for (let deadEnd of deadEnds) { let connections = 0; for (let direction in maze.algorithm.walls[deadEnd.y][deadEnd.x]) { if (!maze.algorithm.walls[deadEnd.y][deadEnd.x][direction]) connections++; } //if it still is a dead end if (connections <= 1) { let unconnectedNeighbors = []; for (let direction of directions) { let neighbor = { x: deadEnd.x + dx[direction], y: deadEnd.y + dy[direction], }; if ( direction != opposite[deadEnd.direction] && maze.algorithm.cellIsInMaze(neighbor) ) { unconnectedNeighbors.push({ ...neighbor, direction, }); } } let chosenNeighbor = unconnectedNeighbors[ Math.floor(maze.algorithm.random() * unconnectedNeighbors.length) ]; maze.algorithm.removeWall(deadEnd, chosenNeighbor.direction); } } return maze; }