100 CLS:CLS #0
110 xl=18:yl=37
120 DIM a$(xl,yl),xsp(60),ysp(60),xd(4),yd(4)
130 lv$=CHR$(0):hv$=CHR$(255):b$=FILL$(lv$,yl)
140 a$(0)=b$:a$(xl)=b$:a$(xl-1)=b$
150 c$=FILL$(hv$&lv$,yl):c$(1 TO 2)=lv$&lv$:c$(yl-1 TO yl)=lv$&lv$
160 FOR n=1 TO xl-2 STEP 2:a$(n)=b$:a$(n+1)=c$
170 RESTORE :FOR n=1 TO 4:READ xd(n),yd(n)
180 DATA -1,0,0,1,1,0,0,-1
190 sp=0
200 x1=RND(2 TO xl):y1=RND(3 TO yl):IF a$(x1,y1)=lv$ THEN GO TO 200
210 a$(x1,y1)=" "
220 CSIZE 2,0:PRINT a$
230 FOR n=1 TO 4
240 READ x,y:IF a$(x,y)=hv$ THEN a$(x,y)="@":sp=sp+1:xsp(sp)=x:ysp(sp)=y
250 END FOR n
260 DATA x1-2,y1,x1+2,y1,x1,y1-2,x1,y1+2
270 REPeat loop
280 IF sp<1 THEN EXIT loop
290 p=RND(1 TO sp)
300 x=xsp(p):xsp(p)=xsp(sp):y=ysp(p):ysp(p)=ysp(sp):sp=sp-1
310 b$=""
320 IF a$(x-2,y)=" " THEN b$="1"
330 IF a$(x,y+2)=" " THEN b$=b$&"2"
340 IF a$(x+2,y)=" " THEN b$=b$&"3"
350 IF a$(x,y-2)=" " THEN b$=b$&"4"
360 b=b$(RND(1 TO LEN(b$)))
370 x1=xd(b):y1=yd(b)
380 a$(x,y)=" ":a$(x+x1,y+y1)=" "
390 a$(x+x1+x1,y+y1+y1)=" "
400 x=x+2
410 IF a$(x,y)=hv$ THEN a$(x,y)="@":sp=sp+1:xsp(sp)=x:ysp(sp)=y
420 x=x-4
430 IF a$(x,y)=hv$ THEN a$(x,y)="@":sp=sp+1:xsp(sp)=x:ysp(sp)=y
440 x=x+2:y=y+2
450 IF a$(x,y)=hv$ THEN a$(x,y)="@":sp=sp+1:xsp(sp)=x:ysp(sp)=y
460 y=y-4
470 IF a$(x,y)=hv$ THEN a$(x,y)="@":sp=sp+1:xsp(sp)=x:ysp(sp)=y
480 AT x,y+1:PRINT " ":AT x+x1,y+y1+1:PRINT " "
490 END REPeat loop
500 FOR n=1 TO RND(5 TO 15)
510 x=RND(2 TO xl-2)&&-2:y=RND(3 TO yl-2):IF a$(x,y)=" " THEN GO TO 510
520 a$(x,y)=" ":AT x,y-1:PRINT " "
530 END FOR n
540 x=RND(7 TO xl-2):y=RND(7 TO yl-2):IF a$(x,y)<>" " THEN GO TO 540
600 a$(2,2)=" "
610 d=1:out=0
620 jumps=0:views=0
630 DIM d$(4,5):FOR n=1 TO 4:READ d$(n)
640 DATA "North","East","South","West"
650 SCALE 300,0,0
660 INK 0:INK #0,0
670 PAPER 7:PAPER #0,7
680 CLS:CLS #0
690 CSIZE 3,1:AT 4,6:FLASH 1:PRINT "GO GO GO !!!":FLASH 0
700 CSIZE 2,0
710 base_date=DATE
1000 REPeat loop
1010 IF out THEN EXIT loop
1020 move_
1030 print_
1040 END REPeat loop
1050 CLS #0:PRINT #0,"You are out of the maze! ":time
1060 INPUT #0,"Again ?"!q$
1070 IF q$(1)=="Y" THEN RUN
1080 STOP
1090 DEFine PROCedure time
1100 time$=DATE$(DATE-base_date)
1110 time$=time$(17 TO 20)
1120 AT #0,0,28:PRINT #0,time$
1130 END DEFine 
1140 DEFine PROCedure move_
1150 time:in$=INKEY$:IF in$="" THEN GO TO 1150
1160 in=CODE(in$)
1170 SELect ON in
1180 =74,106:jump
1190 =86,118:view_maze
1200 =81,113:quit
1210 =192:left
1220 =200:right
1230 =48 TO 57:forward
1240 END SELect 
1250 AT #0,0,0
1260 PRINT #0," Facing"!d$(d)!\
1270 PRINT #0,x-2!"South,",y-2!"West",
1280 time
1290 END DEFine 
1300 DEFine PROCedure jump
1310 IF jumps>3 THEN PRINT #0,"You've already had 3 jumps!":PAUSE 100:RETurn 
1320 x=RND(7 TO xl-2):y=RND(7 TO yl-2):IF a$(x,y)<>" " THEN GO TO 1320
1330 BEEP 32767,20,0,5,5,10
1340 d=RND(1 TO 4):jumps=jumps+1
1350 END DEFine 
1360 DEFine PROCedure view_maze
1370 IF views>3 THEN PRINT #0,"You've already had 3 views!":PAUSE 100:RETurn 
1380 CLS
1390 PRINT a$
1400 AT 2,1:PRINT "*"
1410 AT x,y-1
1420 SELect ON d
1430 =1:PRINT CHR$(190)
1440 =2:PRINT CHR$(189)
1450 =3:PRINT CHR$(191)
1460 =4:PRINT CHR$(188)
1470 END SELect 
1480 views=views+1
1490 FOR n=1 TO 20000
1500 time:IF INKEY$<>"" THEN EXIT n
1510 END FOR n
1520 END DEFine 
1530 DEFine PROCedure quit
1540 CLS
1550 views=0::VIEW
1560 PRINT #0\\\"You quit."
1570 STOP
1580 END DEFine 
1590 DEFine PROCedure left
1600 d=d-1:IF d=0 THEN d=4
1610 END DEFine 
1620 DEFine PROCedure right
1630 d=d+1:IF d=5 THEN d=1
1640 END DEFine 
1650 DEFine PROCedure forward
1660 IF in$=0 THEN RETurn 
1670 x1=xd(d):y1=yd(d)
1680 FOR n=1 TO in$
1690 IF a$(x+x1,y+y1)<>" " THEN 
1700 PRINT #0,"Ouch! That's a wall !",:PAUSE 100:EXIT n
1710 ELSE 
1720 x=x+x1:y=y+y1
1730 END IF 
1740 END FOR n
1750 END DEFine 
1760 DEFine PROCedure print_
1770 CLS
1780 x1=xd(d):y1=yd(d)
1790 FOR n=0 TO 5
1800 floor n:time
1810 IF a$(x+n*x1-y1,y+n*y1+x1)=" " THEN left_ n
1820 IF a$(x+n*x1+y1,y+n*y1-x1)=" " THEN right_ n
1830 IF y+y1*n<3 THEN exit_ n:EXIT n
1840 IF a$(x+n*x1+x1,y+n*y1+y1)<>" " THEN wall_ n:EXIT n
1850 END FOR n
1860 END DEFine 
1870 DEFine PROCedure floor(di)
1880 FILL 0:INK 0
1890 SELect ON di
1900 =0:SCALE 300,-50,0
1910 =1:SCALE 475.4679,-196.2232,-87.73397
1920 =2:SCALE 753.5659,-427.9716,-226.7829
1930 =3:SCALE 1194.322,-795.2679,-447.1607
1940 =4:SCALE 1892.872,-1377.393,-796.436
1950 =5:SCALE 3000,-2300,-1350
1960 END SELect 
1970 LINE 400,0 TO 400,300,0,0 TO 0,300:FILL 1
1980 IF di=5 THEN LINE 200,150 TO 400,0 TO 0,0 TO 200,150 TO 400,300 TO 0,300 TO 200,150:RETurn 
1990 LINE 0,0 TO 74,55,400,0 TO 326,55,400,300 TO 326,245,0,300 TO 74,245
2000 END DEFine 
2010 DEFine PROCedure left_(di)
2020 IF di<5 THEN LINE 0,0 TO 0,300
2030 END DEFine 
2040 DEFine PROCedure right_(di)
2050 IF di<5 THEN LINE 400,0 TO 400,55,400,245 TO 400,300
2060 END DEFine 
2070 DEFine PROCedure wall_(di)
2080 IF di<5 THEN FILL 0:LINE 74,55 TO 74,245,326,55 TO 326,245
2090 END DEFine 
2100 DEFine PROCedure exit_(di)
2110 wall_ di
2120 FILL 1:INK 0
2130 IF di<4 THEN LINE 134,55 TO 134,215,266,55 TO 266,215
2140 out=di=0
2150 INK 0
2160 END DEFine 
