138 lines
2.3 KiB
JavaScript
138 lines
2.3 KiB
JavaScript
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;
|
|
}
|
|
|
|
}
|