Maze generation: Difference between revisions

→‎{{header|Icon}} and {{header|Unicon}}: updated in prep for solver, changed start/finish selection
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 itmaze in hidden window
until Event() == &lpress close(mz.window) # donewait for afterleft anymouse eventpress
close(mz.window) r := ?h # ... row,
end
 
$define SEENFINISH 3264 # bread crumbs for generatorexit
$define FOYERSTART 1632 # entrance and exit
$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(01 < r) | runerr(r,205) # valid size ?2x2 or better
/w := integer(01 < c) | runerr(r,205)
every !(maze := list(h)) := list(w,EMPTY) # shinny new empty maze
everystart := [?h,?w,?4-1,START] to 2 do { # random [r,c] start & finish # two random openings ...
finish := [?h,?w,(start[3]+2)%4,FINISH] # w/ opposite side exponent
r := ?h # ... row,
every cx := ?w start #| ...finish col,do {
case x[3] := 2 ^(?4 - 1)x[3] of { # get side from exponent # ... sideand
NORTH : mazex[r1] := 1,c] +:= NORTH + FOYER # project r,c to selected edge
EAST : mazex[r, c2] := w] +:= EAST + FOYER
SOUTH : mazex[r1] := h,c] +:= SOUTH + FOYER
WEST : mazex[r,c2] := 1] +:= WEST + FOYER
}
maze[x[1],x[2]] +:= x[3] + x[4] # transcribe s/f to maze
}
rd := [NORTH, EAST, SOUTH, WEST] # initial list of all directions
GenerateMaze(rstart[1],cstart[2]) # recurse through maze
return 1(.maze,maze := &null) # return maze and, reset for next
}
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 the current cell as visited
every !rd :=: ?rd # randomize list of directions
every d := !rd do
case d of { # try all, clearingsucceed wall& onclear successwall
NORTH : maze[r,c] +:= ( GenerateMaze(r-1,c), dNORTH)
EAST : maze[r,c] +:= ( GenerateMaze(r,c+1), d EAST)
SOUTH : maze[r,c] +:= ( GenerateMaze(r+1,c), dSOUTH)
WEST : maze[r,c] +:= ( GenerateMaze(r,c-1), d WEST)
}
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}}
Anonymous user