identification division.
program-id. maze.
author. Joe Wingbermuehle.
date-written. 2010-09-26.
environment division.
data division.
working-storage section.
01 width pic 99999 value 39.
01 height pic 99999 value 23.
01 maze-array.
05 maze-row occurs 39 times.
10 maze-col occurs 23 times pic 9.
01 seed pic 9999999.
01 x pic 99999.
01 y pic 99999.
01 lx pic 99999.
01 ly pic 99999.
01 x1 pic S99999.
01 y1 pic S99999.
01 x2 pic S99999.
01 y2 pic S99999.
01 dx pic S9.
01 dy pic S9.
01 dir pic 9.
01 cnt pic 9.
procedure division.
* Generate and display a random maze.
perform 100-initialize-maze
perform 200-generate-maze
perform 300-show-maze
stop run.
* Initialze the maze matrix.
100-initialize-maze.
perform varying y from 1 by 1 until y > height
perform varying x from 1 by 1 until x > width
move 1 to maze-col(x, y)
end-perform
end-perform.
* Generate a random maze.
200-generate-maze.
move function seconds-past-midnight to seed
move function random(seed) to seed
move 0 to maze-col(2, 2)
perform varying y from 2 by 2 until y >= height
perform varying x from 2 by 2 until x >= width
move x to lx
move y to ly
perform 400-carve-maze
end-perform
end-perform
move 0 to maze-col(2, 1)
move 0 to maze-col(width - 1, height).
* Display the maze.
300-show-maze.
perform varying y from 1 by 1 until y > height
perform varying x from 1 by 1 until x > width
if maze-col(x, y) = 0 then
display ' ' with no advancing
else
display '[]' with no advancing
end-if
end-perform
display ''
end-perform.
* Carve the maze starting at lx, ly
400-carve-maze.
compute dir = function random * 4.0
move 0 to cnt
perform until cnt > 3
move 0 to dx
move 0 to dy
evaluate dir
when 0 move 1 to dx
when 1 move 1 to dy
when 2 move -1 to dx
when 3 move -1 to dy
end-evaluate
add lx to dx giving x1
add ly to dy giving y1
add x1 to dx giving x2
add y1 to dy giving y2
if x2 > 1 and x2 < width
and y2 > 1 and y2 < height
and maze-col(x1, y1) = 1
and maze-col(x2, y2) = 1 then
move 0 to maze-col(x1, y1)
move 0 to maze-col(x2, y2)
move x2 to lx
move y2 to ly
compute dir = function random * 4.0
move 0 to cnt
else
add 1 to cnt
add 1 to dir
if dir = 4 then move 0 to dir
end-if
end-perform.