0010  // Labyrint
0020
0030 USE UNIGRAPHICS
0040
0050 GLOBAL e,l,b,h,xs,ys
0060 graphicscreen(0)
0070 pen:=2
0080 pencolor(pen);background(1)
0090 clear
0100 e:=18; l:=8 // Cellebredde og -højde
0110 b:=30; h:=20 // Antal celler vandret og lodret
0120 xs:=20; ys:=10
0130
0140 RANDOMIZE
0150 moveto(xs+e,ys) // Lav først ydre ramme med et hul
0160 draw((b-1)*e,0)
0170 draw(0,(h-1)*l)
0180 move(0,l) // .. i hvert hjørne
0190 draw(-e*b,0)
0200 draw(0,-l*h)
0210 laby(0,0,b,h) // Lav en labyrint i det indre
0220 textstyle(16)
0230 plottext(24,185,"Tegne vejen (j/n)? ")
0240 CURSOR 2,24
0250 REPEAT
0260   sv$:=inkey$
0270 UNTIL sv$ IN "jJnN"
0280 plottext(184,185,sv$)
0290 IF sv$ IN "jJ" THEN find'vej
0300 pencolor(1);background(0)
0310
0320 PROC laby(x,y,b,h) CLOSED
0330   IF b>1 AND h>1 THEN
0340     moveto(xs+x*e,ys+y*l) // Start i nederste venstre hjørne
0350     IF rnd>h/(h+b) THEN  // del med lodret streg
0360       d:=rnd(1,b-1) // vælg et tilfældigt delepunkt
0370       move(d*e,0) // .. og lav lodret delestreg
0380       hul:=rnd(0,h-1) // .. med et hul et tilfældigt sted
0390       draw(0,hul*l)
0400       move(0,l)
0410       draw(0,(h-hul-1)*l)
0420       laby(x,y,d,h) // lav en labyrint i venstre halvdel
0430       laby(x+d,y,b-d,h) // .. og en i højre
0440     ELSE  // del med vandret streg
0450       d:=rnd(1,h-1) // vælg et tilfældigt delepunkt
0460       move(0,d*l) // .. og lav vandret delestreg
0470       hul:=rnd(0,b-1) // .. med et hul et tilfældigt sted
0480       draw(hul*e,0)
0490       move(e,0)
0500       draw((b-hul-1)*e,0)
0510       laby(x,y,b,d) // lav en labyrint i nedre halvdel
0520       laby(x,y+d,b,h-d) // .. og en i øvre
0530     ENDIF
0540   ENDIF
0550 ENDPROC laby
0560
0570 PROC find'vej
0580   PROC undersøg(c1,c2,rx,ry) CLOSED
0590     IMPORT fundet,pen
0600     FUNC åben
0610       RETURN pen<>getcolor(xs+c1*e+(1+rx)*e/2,ys+c2*l+(1+ry)*l/2)
0620     ENDFUNC åben
0630
0640     rx:=-rx; ry:=-ry
0650     IF c1=0 AND c2=0 THEN
0660       fundet:=true
0670       moveto(xs+e/2,ys-l/2)
0680       draw(0,l)
0690     ELSE
0700       LOOP 3 TIMES
0710         temp:=rx; rx:=-ry; ry:=temp
0720         IF åben THEN
0730           undersøg(c1+rx,c2+ry,rx,ry)
0740           IF fundet THEN
0750             draw(-2*rx*e/2,-2*ry*l/2)
0760             RETURN
0770           ENDIF
0780         ENDIF
0790       ENDLOOP
0800     ENDIF
0810   ENDPROC undersøg
0820
0830   fundet:=false
0840   pencolor(3)
0850   undersøg(b-1,h-1,-1,0)
0860   draw(e,0)
0870   pencolor(1)
0880 ENDPROC find'vej
