Maze generation: Difference between revisions
Content added Content deleted
No edit summary |
|||
Line 1,038: | Line 1,038: | ||
===Alternative version === |
===Alternative version === |
||
See [[Maze_solving#D]] |
See [[Maze_solving#D]] |
||
=={{header|EGL}== |
|||
<lang EGL>package com.dandarnell.server; |
|||
program MazeGen |
|||
// First and last columns/rows are "dead" cells. Makes generating |
|||
// a maze with border walls much easier. Therefore, a visible |
|||
// 20x20 maze has a maze size of 22. |
|||
mazeSize int = 22; |
|||
south boolean[][]; |
|||
west boolean[][]; |
|||
visited boolean[][]; |
|||
function main() |
|||
initMaze(); |
|||
generateMaze(); |
|||
drawMaze(); |
|||
end |
|||
private function initMaze() |
|||
visited = createBooleanArray(mazeSize, mazeSize, false); |
|||
// Initialize border cells as already visited |
|||
for (col int from 1 to mazeSize) |
|||
visited[col][1] = true; |
|||
visited[col][mazeSize] = true; |
|||
end |
|||
for (row int from 1 to mazeSize) |
|||
visited[1][row] = true; |
|||
visited[mazeSize][row] = true; |
|||
end |
|||
// Initialize all walls as present |
|||
south = createBooleanArray(mazeSize, mazeSize, true); |
|||
west = createBooleanArray(mazeSize, mazeSize, true); |
|||
end |
|||
private function createBooleanArray(col int in, row int in, initialState boolean in) returns(boolean[][]) |
|||
newArray boolean[][] = new boolean[0][0]; |
|||
for(i int from 1 to col) |
|||
innerArray boolean[] = new boolean[0]; |
|||
for(j int from 1 to row) |
|||
innerArray.appendElement(initialState); |
|||
end |
|||
newArray.appendElement(innerArray); |
|||
end |
|||
return(newArray); |
|||
end |
|||
private function createIntegerArray(col int in, row int in, initialValue int in) returns(int[][]) |
|||
newArray int[][] = new int[0][0]; |
|||
for(i int from 1 to col) |
|||
innerArray int[] = new int[0]; |
|||
for(j int from 1 to row) |
|||
innerArray.appendElement(initialValue); |
|||
end |
|||
newArray.appendElement(innerArray); |
|||
end |
|||
return(newArray); |
|||
end |
|||
private function generate(col int in, row int in) |
|||
// Mark cell as visited |
|||
visited[col][row] = true; |
|||
// Keep going as long as there is an unvisited neighbor |
|||
while (!visited[col][row+1] || !visited[col+1][row] || !visited[col][row-1] || !visited[col-1][row]) |
|||
while (true) |
|||
r float = MathLib.random(); // Choose a random direction |
|||
case |
|||
when(r < 0.25 && !visited[col][row+1]) // Go south |
|||
south[col][row] = false; // South wall down |
|||
generate(col, row + 1); |
|||
exit while; |
|||
when(r >= 0.25 && r < 0.50 && !visited[col+1][row]) // Go east |
|||
west[col+1][row] = false; // West wall of neighbor to the east down |
|||
generate(col+1, row); |
|||
exit while; |
|||
when(r >= 0.5 && r < 0.75 && !visited[col][row-1]) // Go north |
|||
south[col][row-1] = false; // South wall of neighbor to the north down |
|||
generate(col, row-1); |
|||
exit while; |
|||
when(r >= 0.75 && r < 1.00 && !visited[col-1][row]) // Go west |
|||
west[col][row] = false; // West wall down |
|||
generate(col-1, row); |
|||
exit while; |
|||
end |
|||
end |
|||
end |
|||
end |
|||
private function generateMaze() |
|||
// Pick random start position (within the visible maze space) |
|||
randomStartCol int = MathLib.floor((MathLib.random() * (mazeSize-2)) + 2); |
|||
randomStartRow int = MathLib.floor((MathLib.random() * (mazeSize-2)) + 2); |
|||
generate(randomStartCol, randomStartRow); |
|||
end |
|||
private function drawMaze() |
|||
line string; |
|||
// Iterate over wall arrays (skipping dead border cells as required). |
|||
// Construct a row at a time and output to console. |
|||
for(row int from 1 to mazeSize - 1) |
|||
if( row > 1) |
|||
line = ""; |
|||
for(col int from 2 to mazeSize) |
|||
if (west[col][row]) |
|||
line ::= "| "; |
|||
else |
|||
line ::= " "; |
|||
end |
|||
end |
|||
Syslib.writeStdout(line); |
|||
end |
|||
line = ""; |
|||
for(col int from 2 to mazeSize - 1) |
|||
if (south[col][row]) |
|||
line ::= "+---"; |
|||
else |
|||
line ::= "+ "; |
|||
end |
|||
end |
|||
line ::= "+"; |
|||
SysLib.writeStdout(line); |
|||
end |
|||
end |
|||
end</lang> |
|||
<pre> |
|||
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ |
|||
| | | | | |
|||
+ +---+ + + + +---+ +---+---+---+ + +---+---+---+---+---+ + + |
|||
| | | | | | | | | | | | |
|||
+---+ + + +---+ +---+ + + + +---+---+---+---+ + +---+---+ + |
|||
| | | | | | | | | | | | |
|||
+ +---+ +---+ + + +---+ +---+---+---+ +---+ +---+ + + +---+ |
|||
| | | | | | | | | | | | |
|||
+ +---+---+---+ + +---+ +---+ +---+ +---+ +---+ +---+ +---+ + |
|||
| | | | | | | | | | | | |
|||
+---+ + +---+---+ + + + +---+---+ +---+---+---+---+ + + + + |
|||
| | | | | | | | | | | |
|||
+---+---+ + +---+---+ +---+---+---+ + + + + + + +---+ + + |
|||
| | | | | | | | | | | | | | |
|||
+ + +---+---+ + +---+---+ + + +---+ + + + +---+ +---+---+ |
|||
| | | | | | | | | | | | | |
|||
+ +---+ + +---+ + +---+---+ +---+---+---+ + +---+ +---+ + + |
|||
| | | | | | | | | | | | | |
|||
+ + + + + + +---+ + +---+ +---+---+---+ +---+ + +---+ + |
|||
| | | | | | | | | | | | | |
|||
+---+ +---+---+ +---+---+ +---+---+ + +---+ + + +---+ + + + |
|||
| | | | | | | | | | | | | |
|||
+ +---+---+ + + +---+---+ + + +---+---+ +---+---+ + +---+ + |
|||
| | | | | | | | | | | | | |
|||
+ +---+ +---+---+---+---+ +---+ + + + +---+ + + + + + + |
|||
| | | | | | | | | | | | | | |
|||
+ + +---+ +---+---+---+---+ + + +---+ + +---+ + + + + + |
|||
| | | | | | | | | | | | | |
|||
+ + + +---+ +---+ + + +---+---+ + + + +---+---+---+---+ + |
|||
| | | | | | | | | | | | | |
|||
+ +---+ + +---+ +---+ + + + +---+ + +---+---+ + +---+ + |
|||
| | | | | | | | | | |
|||
+---+---+---+---+---+ + +---+---+---+---+---+---+ +---+---+---+---+ + + |
|||
| | | | | | | |
|||
+ +---+ +---+ +---+---+---+---+---+---+ + +---+ + + +---+---+ + |
|||
| | | | | | | | | | | | |
|||
+---+---+ + +---+ +---+ + + + +---+---+ + + +---+ +---+---+ |
|||
| | | | | | | | | | | | | | |
|||
+ +---+---+---+---+ + + + + +---+ + + + +---+ +---+---+ + |
|||
| | | | | | |
|||
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ |
|||
</pre> |
|||
=={{header|F_Sharp|F#}}== |
=={{header|F_Sharp|F#}}== |