var cols, rows; var w = 40; var grid = []; var current; var stack = []; function setup(){ createCanvas(800, 800); cols = floor(width/w) rows = floor(height/w) //frameRate(6); for (var j = 0; j < rows; j++){ for (var i = 0; i < cols; i++){ var cell = new Cell(i,j); grid.push(cell); } } current = grid[0]; } function draw(){ background(150); for (var i = 0; i < grid.length; i++){ grid[i].show(); } current.visited = true; current.highlight(); var next = current.checkNeighbors(); if (next) { next.visited = true; stack.push(current); removeWalls(current, next); current = next; } else if (stack.length > 0){ current = stack.pop(); } } function index(i, j){ if(i < 0 || j < 0 || i > cols-1 || j > rows-1){ return -1 } return i + j * cols; } function cell(i, j){ this.i = i; this.j = j; this.walls = [true, true, true, true]; this.visited = false; this.checkNeighbors = function(){ var neighbors = []; var top = grid[index(i, j-1)]; var right = grid[index(i+1, j)]; var bottom = grid[index(i, j + 1)]; var left = grid[index(i-1, j)]; if (top && !top.visited){ neighbors.push(top); } if (right && !right.visited){ neighbors.push(right); } if (bottom && !bottom.visited){ neighbors.push(bottom); } if (left && !left.visited){ neighbors.push(left); } if (neighbors.length > 0){ var r = floor(random(0, neighbors.length)); return neighbor[r]; } else { return undefined; } this.highlight = function(){ var x = this.i*w; var y = this.j*w; noStroke(); fill(0, 0, 255, 125); rect(x,y,w,w); } } this.show = function(){ var x = this.i*w; var y = this.j*w; stroke(255); if (this.walls[0]){ line(x,y,x+w,y); } if (this.walls[1]){ line(x+w,y,x+w,y+w); } if (this.walls[2]){ line(x+w,y+w,x,y+w); } if (this.walls[3]){ line(x,y+w,x,y); } if (this.visited){ fill(255, 0, 255, 125); rect(x,y,w,w); } } } function removeWalls(a, b){ var x = a.i - b.i; if (x === 1){ a.walls[3] = false; b.walls[1] = false; } else if (x === -1){ a.walls[1] = false; b.walls[3] = false; } var y = a.j - b.j; if (y === 1){ a.walls[0] = false; b.walls[2] = false; } else if (y === -1){ a.walls[2] = false; b.walls[0] = false; } }