Maze generation: Difference between revisions

(solution in Forth)
Line 2,032:
=={{header|EasyLang}}==
 
<lang># maze
[https://easylang.online/apps/run.html?code=size%3D20%0A%23%20%0Asz%3D2%2Asize%2B1%0A%23%20we%20only%20have%20one-dimensional%20arrays%0Alen%20f%5B%5D%20sz%2Asz%0A%23%20%0Afunc%20make_maze..%0A%23%20the%20maze%20is%20created%20by%20random%20walking%20around%0Afor%20i%20range%20len%20f%5B%5D%0Af%5Bi%5D%3D1%0A.%0Ax%3D1%2B2%2Arandom%20size%0Ay%3D1%2B2%2Arandom%20size%0Af%5Bx%2By%2Asz%5D%3D0%0Avisited%3D1%0Awhile%20visited%20%3C%20size%2Asize%0Aoldx%3Dx%0Aoldy%3Dy%0Adir%3Drandom%204%0Aif%20dir%3D0%20and%20x%2B2%20%3C%20sz%0Ax%2B%3D2%0Aelif%20dir%3D1%20and%20y%2B2%20%3C%20sz%0Ay%2B%3D2%0Aelif%20dir%3D2%20and%20x%20%3E%202%0Ax-%3D2%0Aelif%20dir%3D3%20and%20y%20%3E%202%0Ay-%3D2%0A.%0Aif%20f%5By%2Asz%2Bx%5D%3D1%0Af%5By%2Asz%2Bx%5D%3D0%0Af%5B%28y%2Boldy%29/2%2Asz%2B%28x%2Boldx%29/2%5D%3D0%0Avisited%2B%3D1%0A.%0A.%0Af%5B%28sz-1%29%2Asz%2Bsz-2%5D%3D0%0A.%0Afunc%20show_maze..%0Ac2%23%3D%28100-24/size%29/size/2%0Ac10%23%3Dc2%23/5%0Alinewidth%202%2Ac10%23%0Acolor%20997%0Amove%200%200%0Arect%20100%20100%0Acolor%20543%0Afor%20r%20range%20sz%0Afor%20c%20range%20sz%0Aif%20f%5Br%2Asz%2Bc%5D%3D1%0Aif%20r%20mod%202%3D0%0Aif%20c%20mod%202%3D1%0Amove%20c10%23%2B%28c-1%29%2Ac2%23%20c10%23%2Br%2Ac2%23%0Aline%20c10%23%2B%28c%2B1%29%2Ac2%23%20c10%23%2Br%2Ac2%23%0A.%0Aelse%0Amove%20c10%23%2Bc%2Ac2%23%20c10%23%2B%28r-1%29%2Ac2%23%0Aline%20c10%23%2Bc%2Ac2%23%20c10%23%2B%28r%2B1%29%2Ac2%23%0A.%0A.%0A.%0A.%0A.%0Acall%20make_maze%0Acall%20show_maze Run it]
'n = 51
 
# n must be odd
<lang easyprog.online>size = 20
'visited += 1
'free = 1
'endpos = 'n * 'n - 'n - 3
'startpos = 2 * 'n + 2
#
sz'f# = 2100 */ size + 1'n
c10'f2# = c2'f# / 52
# we only have one-dimensional arrays
func square pos . .
len f[] sz * sz
if pos = 'startpos
color 997900
else
color 543777
.
x = pos mod 'n
y = pos / .'n
move x * 'f# y * 'f#
rect 'f# * 1.05 'f# * 1.05
.
func mark pos . .
x = pos mod 'n
y = pos / 'n
color 900
move x * 'f# + 'f2# y * 'f# + 'f2#
circle 'f2# / 2
.
len fm[] sz'n * sz'n
#
func make_mazemake_fence . .
for ri range sz'n
# the maze is created by random walking around
m[i] = 'visited
for i range len f[]
fm['n * i] = 1'visited
f[(sz - 1)m['n * szi + sz'n - 21] = 0'visited
fm[y'n * sz('n - 1) + xi] = 0'visited
.
.
x = 1 + 2 * random size
offs[] = y =[ 1 +'n 2 *-1 random(-'n) size]
func visited pos . r .
f[x + y * sz] = 0
visitedr = 10
for i range 4
while visited < size * size
oldxr += xm[pos + 2 * offs[i]]
.
oldy = y
.
func make_maze pos . .
m[pos] = 'visited
repeat
call visited pos res
oldyuntil res = y4
dir = random 4
if dirposn = 0 and xpos + 2 <* szoffs[dir]
if m[posn] x<> += 2'visited
elif dir = 1 and ym[pos + 2offs[dir]] <= sz'free
ycall +=make_maze 2posn
elif dir = 2 and x > 2
x -= 2
elif dir = 3 and y > 2
y -= 2
.
if f[y * sz + x] = 1
f[y * sz + x] = 0
f[(y + oldy) / 2 * sz + (x + oldx) / 2] = 0
visited += 1
.
.
f[(sz - 1) * sz + sz - 2] = 0
.
func show_maze . .
color 000
c2# = (100 - 24 / size) / size / 2
c10# = c2# / 5
linewidth 2 * c10#
color 997
move 0 0
rect 100 100
for i range len fm[]
color 543
if fm[y * sz + xi] = 1'free
for r range sz
for c rangecall szsquare i
if f[r * sz + c] = 1
if r mod 2 = 0
if c mod 2 = 1
move c10# + (c - 1) * c2# c10# + r * c2#
line c10# + (c + 1) * c2# c10# + r * c2#
.
else
move c10# + c * c2# c10# + (r - 1) * c2#
line c10# + c * c2# c10# + (r + 1) * c2#
.
.
.
.
.
call make_mazemake_fence
call show_maze</lang>make_maze 'startpos
m['endpos] = 'free
call show_maze
</lang>
 
=={{header|EGL}}==
2,076

edits