Maze solving: Difference between revisions

Content added Content deleted
Line 1,100: Line 1,100:
[https://easylang.online/apps/_r_maze.html Run it]
[https://easylang.online/apps/_r_maze.html Run it]


<lang># maze
<lang># maze generation and solving
#
'n = 51
'size = 25
# n must be odd
'visited = 1
'n = 2 * 'size + 1
'free = 1
'free = 1
'endpos = 'n * 'n - 'n - 3
'endpos = 'n * 'n - 'n - 3
'startpos = 2 * 'n + 2
'startpos = 2 * 'n + 2
#
'f# = 100 / 'n
'f# = 100 / 'n
'f2# = 'f# / 2
'f2# = 'f# / 2
#
func draw_square pos . .
func draw_square pos col . .
x = pos mod 'n
x = pos mod 'n
y = pos / 'n
y = pos / 'n
color col
move x * 'f# y * 'f#
move x * 'f# y * 'f#
rect 'f# * 1.05 'f# * 1.05
rect 'f# * 1.05 'f# * 1.05
Line 1,128: Line 1,129:
color 000
color 000
rect 100 100
rect 100 100
color 777
for i range len m[]
for i range len m[]
if m[i] = 'free
if m[i] = 'free
call draw_square i
call draw_square i 777
.
.
.
.
call draw_square 'startpos 900
color 900
call draw_square 'startpos
.
func make_outside . .
for i range 'n
m[i] = 'visited
m['n * i] = 'visited
m['n * i + 'n - 1] = 'visited
m['n * ('n - 1) + i] = 'visited
.
.
.
offs[] = [ 1 'n -1 (-'n) ]
offs[] = [ 1 'n -1 (-'n) ]
Line 1,152: Line 1,143:
.
.
.
.
func make_maze pos . .
func m_maze pos . .
m[pos] = 'visited
m[pos] = 'free
repeat
repeat
call visited pos res
call visited pos res
Line 1,159: Line 1,150:
dir = random 4
dir = random 4
posn = pos + 2 * offs[dir]
posn = pos + 2 * offs[dir]
if m[posn] <> 'visited
if m[posn] <> 'free
m[pos + offs[dir]] = 'free
m[pos + offs[dir]] = 'free
call make_maze posn
call m_maze posn
.
.
.
.
.
func make_maze . .
for i range 'n
m[i] = 'free
m['n * i] = 'free
m['n * i + 'n - 1] = 'free
m['n * ('n - 1) + i] = 'free
.
call m_maze 'startpos
m['endpos] = 'free
.
.
func solve dir0 pos . found .
func solve dir0 pos . found .
call mark pos
call mark pos
sleep 0.01
sleep 0.05
if pos = 'endpos
if pos = 'endpos
sleep 0.5
call show_maze
found = 1
found = 1
else
else
Line 1,177: Line 1,176:
if dir <> dir0 and m[posn] = 'free and found = 0
if dir <> dir0 and m[posn] = 'free and found = 0
call solve (dir + 2) mod 4 posn found
call solve (dir + 2) mod 4 posn found
if found = 1
if found = 0
call mark posn
call draw_square posn 777
sleep 0.05
.
.
.
.
Line 1,184: Line 1,184:
.
.
.
.
#
call make_outside
call make_maze 'startpos
call make_maze
m['endpos] = 'free
call show_maze
call show_maze
sleep 0.5
sleep 1
found = 0
call solve -1 'startpos found
call solve -1 'startpos found
</lang>
</lang>