133 lines
2.5 KiB
JavaScript
133 lines
2.5 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;
|
|
}
|
|
}
|