Maze generation: Difference between revisions
Content added Content deleted
m (→{{header|Wren}}: Changed to Wren S/H) |
m (Moved Wren entry into correct alphabetical order.) |
||
Line 9,666: | Line 9,666: | ||
=== rendered 10x20 maze === |
=== rendered 10x20 maze === |
||
[[File:TSMaze.png]] |
[[File:TSMaze.png]] |
||
=={{header|XPL0}}== |
|||
<syntaxhighlight lang="xpl0">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<Cols & not Cell(X+1, Y, Connected) then \go right |
|||
[Cell(X+1, Y, LeftWall):= false; ConnectFrom(X+1, Y)]; |
|||
1: if Y+1<Rows & not Cell(X, Y+1, Connected) then \go down |
|||
[Cell(X, Y+1, Ceiling):= false; ConnectFrom(X, Y+1)]; |
|||
2: 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 " "); |
|||
]; |
|||
]</syntaxhighlight> |
|||
Output: |
|||
<pre> |
|||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |
|||
| | | | |
|||
+ +--+ +--+ +--+--+--+ + +--+ + +--+--+--+--+--+--+ + |
|||
| | | | | | | | | | | | |
|||
+ + + + +--+ + +--+--+ + +--+--+ +--+--+ +--+ +--+ |
|||
| | | | | | | | | | | |
|||
+ +--+--+ + +--+ + +--+--+--+--+--+--+ + +--+ +--+ + |
|||
| | | | | | | | | | |
|||
+--+ + +--+--+ + + + +--+--+ + +--+--+--+--+--+--+ + |
|||
| | | | | | | | | | | | | |
|||
+ + + + +--+--+ + + + + +--+--+ + + + + +--+--+ |
|||
| | | | | | |
|||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |
|||
</pre> |
|||
=={{header|Wren}}== |
=={{header|Wren}}== |
||
Line 9,842: | Line 9,777: | ||
| | | |
| | | |
||
+---+---+---+---+---+---+---+---+ |
+---+---+---+---+---+---+---+---+ |
||
</pre> |
|||
=={{header|XPL0}}== |
|||
<syntaxhighlight lang="xpl0">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<Cols & not Cell(X+1, Y, Connected) then \go right |
|||
[Cell(X+1, Y, LeftWall):= false; ConnectFrom(X+1, Y)]; |
|||
1: if Y+1<Rows & not Cell(X, Y+1, Connected) then \go down |
|||
[Cell(X, Y+1, Ceiling):= false; ConnectFrom(X, Y+1)]; |
|||
2: 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 " "); |
|||
]; |
|||
]</syntaxhighlight> |
|||
Output: |
|||
<pre> |
|||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |
|||
| | | | |
|||
+ +--+ +--+ +--+--+--+ + +--+ + +--+--+--+--+--+--+ + |
|||
| | | | | | | | | | | | |
|||
+ + + + +--+ + +--+--+ + +--+--+ +--+--+ +--+ +--+ |
|||
| | | | | | | | | | | |
|||
+ +--+--+ + +--+ + +--+--+--+--+--+--+ + +--+ +--+ + |
|||
| | | | | | | | | | |
|||
+--+ + +--+--+ + + + +--+--+ + +--+--+--+--+--+--+ + |
|||
| | | | | | | | | | | | | |
|||
+ + + + +--+--+ + + + + +--+--+ + + + + +--+--+ |
|||
| | | | | | |
|||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |
|||
</pre> |
</pre> |
||