code Ran=1, CrLf=9, Text=12; \intrinsic routines def Cols=20, Rows=6; \dimensions of maze (cells) int Cell(Cols+1, Rows+1, 3); \cells (plus right and bottom borders) def LeftWall, Ceiling, Connected; \attributes of each cell (= 0, 1 and 2) proc ConnectFrom(X, Y); \Connect cells starting from cell X,Y int X, Y; int Dir, Dir0; [Cell(X, Y, Connected):= true; \mark current cell as connected Dir:= Ran(4); \randomly choose a direction Dir0:= Dir; \save this initial direction repeat case Dir of \try to connect to cell at Dir 0: if X+1=0 & not Cell(X-1, Y, Connected) then \go left [Cell(X, Y, LeftWall):= false; ConnectFrom(X-1, Y)]; 3: if Y-1>=0 & not Cell(X, Y-1, Connected) then \go up [Cell(X, Y, Ceiling):= false; ConnectFrom(X, Y-1)] other []; \(never occurs) Dir:= Dir+1 & $03; \next direction until Dir = Dir0; ]; int X, Y; [for Y:= 0 to Rows do for X:= 0 to Cols do [Cell(X, Y, LeftWall):= true; \start with all walls and Cell(X, Y, Ceiling):= true; \ ceilings in place Cell(X, Y, Connected):= false; \ and all cells disconnected ]; Cell(0, 0, LeftWall):= false; \make left and right doorways Cell(Cols, Rows-1, LeftWall):= false; ConnectFrom(Ran(Cols), Ran(Rows)); \randomly pick a starting cell for Y:= 0 to Rows do \display the maze [CrLf(0); for X:= 0 to Cols do Text(0, if X#Cols & Cell(X, Y, Ceiling) then "+--" else "+ "); CrLf(0); for X:= 0 to Cols do Text(0, if Y#Rows & Cell(X, Y, LeftWall) then "| " else " "); ]; ]