Maze generation: Difference between revisions
Content added Content deleted
m (→{{header|Icon}} and {{header|Unicon}}: more prep for solver, mark entrance/exit) |
(→{{header|Icon}} and {{header|Unicon}}: updated in prep for solver, changed start/finish selection) |
||
Line 1,047:
mz := DisplayMaze(GenerateMaze(mh,mw))
WriteImage(mz.filename) # save file
WAttrib(mz.window,"canvas=normal") # show
until Event() == &lpress
end
$define
$define
$define PATH 128
$define SEEN 16 # bread crumbs for generator
$define NORTH 8 # sides ...
$define EAST 4
Line 1,062 ⟶ 1,065:
static maze,h,w,rd
if /maze then { # BEGING - No maze yet
/h := integer(
/w := integer(
every !(maze := list(h)) := list(w,EMPTY) # shinny new empty maze
finish := [?h,?w,(start[3]+2)%4,FINISH] # w/ opposite side exponent
▲ r := ?h # ... row,
every
case x[3] := 2 ^
NORTH :
EAST :
SOUTH :
WEST :
}
maze[x[1],x[2]] +:= x[3] + x[4] # transcribe s/f to maze
}
rd := [NORTH, EAST, SOUTH, WEST] # initial list of
GenerateMaze(
return 1(.maze,maze := &null) # return maze
}
else { # ----------------------- recursed to clear insize of maze
if iand(maze[r,c],SEEN) = 0 then { # in bounds and not SEEN yet
maze[r,c] +:= SEEN # Mark
every !rd :=: ?rd # randomize list of directions
every d := !rd do
case d of { # try all,
NORTH : maze[r,c] +:= ( GenerateMaze(r-1,c),
EAST : maze[r,c] +:= ( GenerateMaze(r,c+1),
SOUTH : maze[r,c] +:= ( GenerateMaze(r+1,c),
WEST : maze[r,c] +:= ( GenerateMaze(r,c-1),
}
return # signal success to caller
}
}
Line 1,129 ⟶ 1,133:
return mazeinfo(&window,maze,sprintf("maze-%dx%d-%d.gif",r,c,&now))
end</lang>
Note: The underlying maze structure (matrix) is uni-directional from the start
{{libheader|Icon Programming Library}}
|