Maze generation using backtracking.
Log in to post a comment.
const OFFSETS = [[-1, 0], [0, -1], [1, 0], [0, 1]]
const getRandomInt = max => Math.floor(Math.random() * max)
const getRandomElement = array => array[getRandomInt(array.length)]
class Nodes {
static offset([x, y]) {
return [x - 100, y - 100]
}
constructor() {
this.nodes = Array.from(Array(201)).map(() => Array.from(Array(201)))
this.queue = []
}
hasNext() {
return this.queue.length > 0
}
next() {
const index = getRandomInt(this.queue.length)
return this.queue.splice(index, 1)[0]
}
visit([x, y]) {
this.nodes[x][y] = true
this.queue.push([x, y])
return this
}
visible([x, y]) {
return 0 <= x && x <= 200 && 0 <= y && y <= 200
}
getAdjacent([x, y]) {
return OFFSETS.map(([xOffset, yOffset]) => ([x + xOffset, y + yOffset]))
.filter(([_x, _y]) => this.visible([_x, _y]))
}
getUnvisitedNodes(node) {
return this.getAdjacent(node).filter(([x, y]) => !this.nodes[x][y])
}
}
Canvas.setpenopacity(-1)
const turtle = new Turtle()
const nodes = new Nodes()
nodes.visit([getRandomInt(201), getRandomInt(201)])
const walk = i => {
if (!nodes.hasNext()) {
console.log('done')
return
}
const current = nodes.next()
const neighbors = nodes.getUnvisitedNodes(current)
if (neighbors.length) {
const neighbor = getRandomElement(neighbors)
turtle.penup()
turtle.goto(...Nodes.offset(current))
turtle.pendown()
turtle.goto(...Nodes.offset(neighbor))
nodes.queue.push(current)
nodes.visit(neighbor)
}
return i < 1000000
}