56 lines
1.4 KiB
Chapel
56 lines
1.4 KiB
Chapel
use Random;
|
|
|
|
config const rows: int = 9;
|
|
config const cols: int = 16;
|
|
if rows < 1 || cols < 1 {
|
|
writeln("Maze must be at least 1x1 in size.");
|
|
exit(1);
|
|
}
|
|
|
|
enum direction {N = 1, E = 2, S = 3, W = 4};
|
|
|
|
record Cell {
|
|
var spaces: [direction.N .. direction.W] bool;
|
|
var visited: bool;
|
|
}
|
|
|
|
const dirs = [
|
|
((-1, 0), direction.N, direction.S), // ((rowDir, colDir), myWall, neighbourWall)
|
|
((0, 1), direction.E, direction.W),
|
|
((1, 0), direction.S, direction.N),
|
|
((0, -1), direction.W, direction.E)
|
|
];
|
|
|
|
var maze: [1..rows, 1..cols] Cell;
|
|
var startingCell = (choose(maze.dim(0)), choose(maze.dim(1)));
|
|
|
|
checkCell(maze, startingCell);
|
|
displayMaze(maze);
|
|
|
|
proc checkCell(ref maze, cell) {
|
|
maze[cell].visited = true;
|
|
for dir in permute(dirs) {
|
|
var (offset, thisDir, neighbourDir) = dir;
|
|
var neighbour = cell + offset;
|
|
if maze.domain.contains(neighbour) && !maze[neighbour].visited {
|
|
maze[cell].spaces[thisDir] = true;
|
|
maze[neighbour].spaces[neighbourDir] = true;
|
|
checkCell(maze, neighbour);
|
|
}
|
|
}
|
|
}
|
|
|
|
proc displayMaze(maze) {
|
|
for row in maze.dim(0) {
|
|
for col in maze.dim(1) {
|
|
write(if maze[row, col].spaces[direction.N] then "+ " else "+---");
|
|
}
|
|
writeln("+");
|
|
for col in maze.dim(1) {
|
|
write(if maze[row, col].spaces[direction.W] then " " else "| ");
|
|
}
|
|
writeln("|");
|
|
}
|
|
write("+---" * maze.dim(1).size);
|
|
writeln("+");
|
|
}
|