(* Maze generator in Pascal.
 * Joe Wingbermuehle
 * 2010-09-29
 *)

program maze;
const

   (* Size of the maze, must be odd. *)
   width    = 39;
   height   = 23;

type

   CellType = (Space, Wall);
   MazeType = array [0 .. width - 1, 0 .. height - 1] of CellType;

var

   maze    : MazeType;

   (* Initialize the maze matrix. *)
   procedure init_maze;
   var
      x, y  : integer;
   begin
      for y := 0 to height - 1 do
         for x := 0 to width - 1 do
            maze[x, y] := Wall;
   end;

   (* Carve the maze starting at x, y. *)
   procedure carve_maze(x, y : integer);
   var
      x1, y1     : integer;
      x2, y2     : integer;
      dx, dy     : integer;
      dir, cnt   : integer;
   begin
      dir := random(4);
      cnt := 0;
      while cnt < 4 do
      begin
         dx := 0;
         dy := 0;
         case dir of
            0:    dx := 1;
            1:    dy := 1;
            2:    dx := -1;
            else  dy := -1;
         end;
         x1 := x + dx;
         y1 := y + dy;
         x2 := x1 + dx;
         y2 := y1 + dy;
         if (x2 > 0) and (x2 < width) and (y2 > 0) and (y2 < height) 
            and (maze[x1, y1] = Wall) and (maze[x2, y2] = Wall) then
         begin
            maze[x1, y1] := Space;
            maze[x2, y2] := Space;
            carve_maze(x2, y2);
         end;
         dir := (dir + 1) mod 4;
         cnt := cnt + 1;
      end;
   end;

   (* Generate the maze. *)
   procedure generate_maze;
   begin
      maze[1, 1] := Space;
      carve_maze(1, 1);
      maze[1, 0] := Space;
      maze[width - 2, height - 1] := Space;
   end;

   (* Show the maze. *)
   procedure show_maze;
   var
      x, y  : integer;
   begin
      for y := 0 to height - 1 do
      begin
         for x := 0 to width - 1 do
            if maze[x, y] = Space then
               write('  ')
            else
               write('[]');
         writeln('');
      end;
   end;

begin

   randomize;

   init_maze;
   generate_maze;
   show_maze;

end.


