81 lines
1.4 KiB
Text
81 lines
1.4 KiB
Text
size = 15
|
|
n = 2 * size + 1
|
|
f = 100 / (n - 0.5)
|
|
len m[] n * n
|
|
#
|
|
gbackground 000
|
|
proc show_maze .
|
|
gclear
|
|
sz = f * 1.5
|
|
f2 = f / 2
|
|
for i = 1 to len m[]
|
|
if m[i] = 0
|
|
x = (i - 1) mod n
|
|
y = (i - 1) div n
|
|
gcolor 999
|
|
grect x * f - f2 y * f - f2 sz sz
|
|
.
|
|
.
|
|
sleep 0.01
|
|
.
|
|
offs[] = [ 1 n -1 (-n) ]
|
|
proc m_maze pos .
|
|
m[pos] = 0
|
|
show_maze
|
|
d[] = [ 1 2 3 4 ]
|
|
for i = 4 downto 1
|
|
d = random 1 i
|
|
dir = offs[d[d]]
|
|
d[d] = d[i]
|
|
if m[pos + dir] = 1 and m[pos + 2 * dir] = 1
|
|
m[pos + dir] = 0
|
|
m_maze pos + 2 * dir
|
|
.
|
|
.
|
|
.
|
|
endpos = n * n - 1
|
|
proc make_maze .
|
|
for i = 1 to len m[] : m[i] = 1
|
|
for i = 1 to n
|
|
m[i] = 2
|
|
m[n * i] = 2
|
|
m[n * i - n + 1] = 2
|
|
m[n * n - n + i] = 2
|
|
.
|
|
h = 2 * random 1 size - n + n * 2 * random 1 size
|
|
m_maze h
|
|
m[endpos] = 0
|
|
.
|
|
make_maze
|
|
show_maze
|
|
#
|
|
proc mark pos col .
|
|
x = (pos - 1) mod n
|
|
y = (pos - 1) div n
|
|
gcolor col
|
|
gcircle x * f + f / 4 y * f + f / 4 f / 3.5
|
|
.
|
|
found = 0
|
|
proc solve dir0 pos .
|
|
if found = 1 : return
|
|
mark pos 900
|
|
sleep 0.05
|
|
if pos = endpos
|
|
found = 1
|
|
return
|
|
.
|
|
of = random 0 3
|
|
for h = 1 to 4
|
|
dir = (h + of) mod1 4
|
|
posn = pos + offs[dir]
|
|
if dir <> dir0 and m[posn] = 0
|
|
solve (dir + 1) mod 4 + 1 posn
|
|
if found = 0
|
|
mark posn 888
|
|
sleep 0.08
|
|
.
|
|
.
|
|
.
|
|
.
|
|
sleep 1
|
|
solve 0 n + 2
|