Wikipedia defines 8 steps in total for the algorithm. And it really is not more. Most of the code I programmed is for displaying things. But first things first.
To draw a grid I created a class called MazeCell. Its constructor excpects 4 parameters:
constructor(x, y, w, h) {
this.i = x;
this.j = y;
this.width = w;
this.height = h;
this.x = x * this.width;
this.y = y * this.height;
this.visited = false;
this.neighbors = [];
this.top = true;
this.right = true;
this.bottom = true;
this.left = true;
}
In my setup function I first create a two dimensional array representing a grid of MazeCell objects. In the second for-loop I teach every cell who its neighbors are. Once this is done I do the first step of the algorithm: Make the first cell the current cell and set it to visited. Then put it on the stack.
function setup() {
var myCanvas = createCanvas(width, height);
myCanvas.parent("p5_div");
cells = new Array(cols);
for(let i=0; i < cols; i++) {
cells[i] = new Array(rows);
}
for(let i = 0 ; i < cols; i++) {
for(let j = 0 ; j < rows; j++) {
cells[i][j] = new MazeCell(i, j, width/cols, height/rows);
}
}
for(let i = 0 ; i < cols; i++) {
for(let j = 0 ; j < rows; j++) {
addCellNeighbors(i, j);
}
}
// STEP 1
current = cells[0][0];
current.visited = true;
stack.push(current);
}
In my draw function I do the second step of the algorithm once all cells are drawn: While the stack is not empty, pop a cell from the stack and make it a current cell. If the current cell has any neighbours which have not been visited. Push the current cell to the stack and choose one of the unvisited neighbours. Remove the wall between the current cell and the chosen cell and mark the chosen cell as visited and push it to the stack
function draw() {
for(let i = 0 ; i < cols; i++) {
for(let j = 0 ; j < rows; j++) {
cells[i][j].show();
}
}
// STEP 2
if(stack.length>0) {
var current = stack.pop();
var next = current.checkNeighbors();
if(next) {
stack.push(current);
removeWall(next, current);
next.visited=true;
stack.push(next);
}
} else {
noLoop();
}
}
Last edit: 2022-12-18