RosettaCodeData/Task/Maze-generation/JavaScript/maze-generation-1.js

64 lines
1.7 KiB
JavaScript
Raw Permalink Normal View History

2013-04-10 21:29:02 -07:00
function maze(x,y) {
var n=x*y-1;
if (n<0) {alert("illegal maze dimensions");return;}
2013-10-27 22:24:23 +00:00
var horiz =[]; for (var j= 0; j<x+1; j++) horiz[j]= [],
2015-11-18 06:14:39 +00:00
verti =[]; for (var j= 0; j<x+1; j++) verti[j]= [],
2013-10-27 22:24:23 +00:00
here = [Math.floor(Math.random()*x), Math.floor(Math.random()*y)],
path = [here],
unvisited = [];
for (var j = 0; j<x+2; j++) {
unvisited[j] = [];
2013-04-10 21:29:02 -07:00
for (var k= 0; k<y+1; k++)
unvisited[j].push(j>0 && j<x+1 && k>0 && (j != here[0]+1 || k != here[1]+1));
}
while (0<n) {
2013-10-27 22:24:23 +00:00
var potential = [[here[0]+1, here[1]], [here[0],here[1]+1],
2013-04-10 21:29:02 -07:00
[here[0]-1, here[1]], [here[0],here[1]-1]];
2013-10-27 22:24:23 +00:00
var neighbors = [];
for (var j = 0; j < 4; j++)
2013-04-10 21:29:02 -07:00
if (unvisited[potential[j][0]+1][potential[j][1]+1])
neighbors.push(potential[j]);
if (neighbors.length) {
2013-10-27 22:24:23 +00:00
n = n-1;
2013-04-10 21:29:02 -07:00
next= neighbors[Math.floor(Math.random()*neighbors.length)];
unvisited[next[0]+1][next[1]+1]= false;
if (next[0] == here[0])
horiz[next[0]][(next[1]+here[1]-1)/2]= true;
else
verti[(next[0]+here[0]-1)/2][next[1]]= true;
2013-10-27 22:24:23 +00:00
path.push(here = next);
2013-04-10 21:29:02 -07:00
} else
2013-10-27 22:24:23 +00:00
here = path.pop();
2013-04-10 21:29:02 -07:00
}
2013-10-27 22:24:23 +00:00
return {x: x, y: y, horiz: horiz, verti: verti};
2013-04-10 21:29:02 -07:00
}
function display(m) {
var text= [];
for (var j= 0; j<m.x*2+1; j++) {
var line= [];
if (0 == j%2)
for (var k=0; k<m.y*4+1; k++)
if (0 == k%4)
line[k]= '+';
else
if (j>0 && m.verti[j/2-1][Math.floor(k/4)])
line[k]= ' ';
else
line[k]= '-';
else
for (var k=0; k<m.y*4+1; k++)
if (0 == k%4)
if (k>0 && m.horiz[(j-1)/2][k/4-1])
line[k]= ' ';
else
line[k]= '|';
else
line[k]= ' ';
if (0 == j) line[1]= line[2]= line[3]= ' ';
if (m.x*2-1 == j) line[4*m.y]= ' ';
text.push(line.join('')+'\r\n');
}
return text.join('');
}