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("+"); }