100 REM ***************
110 REM *             *
120 REM *  3-D Maze   *
130 REM *             *
140 REM * Written  By *
150 REM * Nigel Sharp *
160 REM *             *
170 REM *  July 1985  *
180 REM *             *
190 REM ***************
200 RANDOMIZE TIME:PRINT CHR$(22)CHR$(0)CHR$(23)CHR$(0)
210 GOSUB 260 'Initialisation
220 GOSUB 490 'Instructions
230 GOSUB 810 'Play Game
240 GOSUB 1160 'Hiscores
250 GOTO 230
260 REM Initialisation
270 DIM ma%(35,15,4)
280 MODE 1:INK 0,0:INK 1,26
290 PAPER 0:PEN 1:LOCATE 13,10
300 PRINT "Please Wait ..."
310 FOR level=1 TO 4
320 FOR row=1 TO 15
330 READ maze$
340 FOR column=1 TO 35
350 IF MID$(maze$,column,1)=" " THEN ma=0 ELSE ma=1
360 ma%(column,row,level)=ma
370 NEXT column,row,level
380 DIM s(15):FOR a=0 TO 15
390 s(a)=0.7^a*200-1:NEXT
400 ORIGIN 200,200
410 DIM view(15,3)
420 DIM hi(15),hi$(15)
430 FOR a=1 TO 15
440 hi(a)=500:hi$(a)="Nobody in particular"
450 NEXT
460 ENT -1,5,-1,1,10,1,1:ENT -2,1,15,1
470 ENV 1,5,-1,1,100,0,100:ENV 2,15,-1,1
480 RETURN
490 REM Instructions
500 MODE 1:INK 0,0:INK 1,26
510 INK 2,12:INK 3,14:BORDER 11
520 PAPER 0:PEN 1:LOCATE 17,2
530 PRINT "3-D Maze":LOCATE 16,3
540 PRINT "==========":LOCATE 10,4
550 PEN 2:PRINT "Written By Nigel Sharp"
560 PEN 3:PRINT
570 PRINT "   The object of this laberynth game is"
580 PRINT " to work your way down through the four"
590 PRINT " levels  of  the  maze,  to  the ground"
600 PRINT " floor, where you must find the  target"
610 PRINT " location, marked with  a blue cross on"
620 PRINT " the floor. On each level  there  is  a"
630 PRINT " hole which leads to the next level."
640 PRINT "  There are several things to help you."
650 PRINT " These are to the right of  the 3D view"
660 PRINT " of the maze shown on the left. The one"
670 PRINT " which should prove most useful is  the"
680 PRINT " map at the bottom, which is  built  up"
690 PRINT " as you explore the maze. The hole ( or"
700 PRINT " target, on the last level) is shown as"
710 PRINT " a black dot, and your current position"
720 PRINT " is shown flashing.Use the left & right"
730 PRINT " cursor keys to turn, and the copy  key"
740 PRINT " to move forwards."
750 LOCATE 13,25:PAPER 1:PEN 2
760 LOCATE 13,25:PAPER 1:PEN 2
770 PRINT "PRESS ANY KEY";
780 WHILE INKEY$<>"":WEND
790 IF INKEY$="" THEN 790
800 RETURN
810 REM Play Game
820 moves=0:lev=0
830 REM new level
840 dir=INT(RND(1)*4)+1:lev=lev+1:mx=520:my=48:ORIGIN 520,48
850 FOR a=-32 TO 32 STEP 2:PLOT -72,a,2:DRAWR 144,0,2:NEXT
860 GOSUB 2100
870 x=INT(RND(1)*33)+2
880 y=INT(RND(1)*13)+2
890 otx=x:oty=y
900 IF lev=1 THEN otx=1:oty=1
910 IF ma%(x,y,lev)=1 THEN 870
920 tx=INT(RND(1)*33)+2
930 ty=INT(RND(1)*13)+2
940 IF ma%(tx,ty,lev)=1 THEN 920
950 ORIGIN 520,48:PLOT (tx-x)*2,(ty-y)*2,3
960 GOSUB 2890
970 WHILE INKEY$<>"":WEND
980 PLOT mx,my,2:FOR a=1 TO 25:NEXT:PLOT mx,my,0:a$=INKEY$:FOR a=1 TO 15:NEXT:IF a$="" THEN 980
990 ke=ASC(a$)
1000 IF ke<>242 AND ke<>243 AND ke<>224 THEN 980
1010 IF ke=224 AND view(1,2)=1 THEN 980
1020 SOUND 129,50,0,15,2,2
1030 IF ke=242 THEN dir=dir-1
1040 IF ke=243 THEN dir=dir+1
1050 IF dir=0 THEN dir=4
1060 IF dir=5 THEN dir=1
1070 IF ke<>224 THEN 960
1080 moves=moves+1
1090 IF dir=1 THEN y=y+1:my=my+2
1100 IF dir=2 THEN x=x+1:mx=mx+2
1110 IF dir=3 THEN y=y-1:my=my-2
1120 IF dir=4 THEN x=x-1:mx=mx-2
1130 IF x<>tx OR y<>ty THEN 960
1140 GOSUB 3240:IF lev<4 THEN 830
1150 RETURN
1160 REM Hiscores
1170 IF hi(15)<sc THEN wfc=1:GOTO 1230
1180 hi(15)=moves:hi$(15)="":place=15
1190 FOR a=15 TO 2 STEP -1
1200 IF hi(a-1)>hi(a) THEN hi=hi(a):hi$=hi$(a):hi(a)=hi(a-1):hi$(a)=hi$(a-1):hi(a-1)=hi:hi$(a-1)=hi$:pl=a-1
1210 NEXT:wfc=0
1220 GOSUB 1230:LOCATE 10,pl+8:PAPER 2:PEN 0:INPUT hi$(pl):wfc=1
1230 PAPER 2:MODE 1:CLS
1240 LOCATE 15,2:PEN 3
1250 PRINT "************"
1260 LOCATE 15,3
1270 PRINT "* 3-D Maze *"
1280 LOCATE 15,4
1290 PRINT "************"
1300 LOCATE 17,6:PEN 0
1310 PRINT "HISCORES"
1320 LOCATE 16,7
1330 PRINT "=========="
1340 PEN 3:LOCATE 1,9
1350 FOR a=1 TO 15
1360 IF a<10 THEN PRINT " ";
1370 PRINT a;CHR$(8);") ";hi(a);:IF hi(a)<100 THEN PRINT " ";
1380 PRINT hi$(a)
1390 NEXT a
1400 LOCATE 13,25:PAPER 0:PEN 1
1410 PRINT "Press Any Key";
1420 IF wfc=0 THEN LOCATE 13,25:PRINT "  Enter Name  ";
1430 WHILE INKEY$<>"":WEND
1440 IF INKEY$="" AND wfc=1 THEN 1440
1450 RETURN
1460 REM Level 1
1470 DATA XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1480 DATA X                    X  X         X
1490 DATA X XXX X X XXXX XXX X X XX X X X X X
1500 DATA X X X X X X    X   X X  X X X X X X
1510 DATA X X X X X X XX XXX X XX X XXX X X X
1520 DATA X X X X X X  X X   X    X X X X   X
1530 DATA X X XXX X XXXX XXX XXXX X X X X X X
1540 DATA X                                 X
1550 DATA X X X X X XXXX XXX X X XXX X X XXXX
1560 DATA X XXXXX X X  X       X X   X XXX  X
1570 DATA X X X X X XX X X X X   X X X     XX
1580 DATA X       X    X     X X   X X X X  X
1590 DATA X XXXXX XXXXXX X XXX X XXX X X XX X
1600 DATA X                                 X
1610 DATA XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1620 REM Level 2
1630 DATA XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1640 DATA X   XX   X       X       X   XX   X
1650 DATA X X   X XX XXX X X X XXX XX X   X X
1660 DATA X   X   X    X X   X X    X   X   X
1670 DATA X X   X   XX X XX XX X XX   X   X X
1680 DATA X   X   X   XX       XX   X   X   X
1690 DATA X X   X   X   XX X XX   X   X   X X
1700 DATA X   X   X   X    X    X   X   X   X
1710 DATA X X   X   X   XX X XX   X   X   X X
1720 DATA X   X   X   XX       XX   X   X   X
1730 DATA X X   X   XX X XX XX X XX   X   X X
1740 DATA X   X   X    X X   X X    X   X   X
1750 DATA X X   X XX XXX X X X XXX XX X   X X
1760 DATA X   XX   X       X       X   XX   X
1770 DATA XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1780 REM Level 3
1790 DATA XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1800 DATA X     X   X    X X      X        XX
1810 DATA X XXX X XXX X X   X XXX X XXXX X  X
1820 DATA X X   X     X X X X     X X    XX X
1830 DATA X   X X X X   X   X XXX   X XX X  X
1840 DATA X XXX   X X XX  X   X X X      X XX
1850 DATA X   X X X X  X X  X   X  XX XX    X
1860 DATA X X   XX  XX  X  XX X  X     X XX X
1870 DATA X XXX X  XX X   XX   X  XX X X   XX
1880 DATA X     X X    X X   X XX    X XXX  X
1890 DATA X XXXX  XX X X X X     X X X   X XX
1900 DATA X      X   X X X   X X X   X X    X
1910 DATA X XXXX X XXX X X X     X X X XX X X
1920 DATA X                  X X   X X    X X
1930 DATA XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1940 REM Level 4
1950 DATA XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1960 DATA X    X   X   X X   X   X  X       X
1970 DATA X XX   X X X     X   X  X X X XXX X
1980 DATA X    X   X XX XXXXX XXX     X X X X
1990 DATA X XXX X X   X X   X    X X XX X   X
2000 DATA X   X     X X X X XXXX  X   X X XXX
2010 DATA XXX  XXXXXX X   X X   X X X   X   X
2020 DATA X  X        XXXX    X     X XX  X X
2030 DATA X X  XXXXXX      XXX  X X      X  X
2040 DATA X   X X     X XX     X  XXXXXX X XX
2050 DATA X XXX X XXXXX   XXXXX  X X  XX X  X
2060 DATA X     X     XXX       X    X   XX X
2070 DATA X XXXXXXXXX X XX XXXXX  XX   X X  X
2080 DATA X                      X   X X   XX
2090 DATA XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2100 REM Set up screen
2110 REM
2120 MODE 1:BORDER 2
2130 INK 0,0:INK 1,14:INK 2,12:INK 3,3
2140 WINDOW #1,26,40,1,25:WINDOW #2,1,25,1,25
2150 PAPER #1,3:CLS #1
2160 PEN #1,1:LOCATE #1,3,2:PRINT #1,"Moves Taken"
2170 LOCATE #1,4,3:PRINT #1,"So  Far:"
2180 LOCATE #1,4,7:PRINT #1,"Moves  To"
2190 LOCATE #1,5,8:PRINT #1,"Target:"
2200 LOCATE #1,6,12:PRINT #1,"Level"
2210 LOCATE #1,8,16:PRINT #1,"N"
2220 LOCATE #1,10,18:PRINT #1,"E"
2230 LOCATE #1,8,20:PRINT #1,"S"
2240 LOCATE #1,6,18:PRINT #1,"W"
2250 PAPER #1,2:FOR a=21 TO 24
2260 LOCATE #1,4,a:PRINT #1,SPACE$(9)
2270 NEXT
2280 RETURN
2290 REM Set up view info (North)
2300 en=0
2310 FOR a=0 TO 15
2320 IF en=1 THEN 2420
2330 view(a,1)=ma%(x-1,y+a,lev)
2340 IF tx<>x OR ty<>y+a THEN 2370
2350 IF lev=4 THEN view(a,2)=2 ELSE view(a,2)=3
2360 GOTO 2380
2370 view(a,2)=ma%(x,y+a,lev)
2380 IF x=otx AND oty=y+a AND ma%(otx,oty,lev)<>1 THEN view(a,2)=4
2390 view(a,3)=ma%(x+1,y+a,lev)
2400 en=view(a,2)
2410 NEXT
2420 FOR a=1 TO 2:NEXT
2430 RETURN
2440 REM Set up view info (East)
2450 en=0
2460 FOR a=0 TO 15
2470 IF en=1 THEN 2570
2480 view(a,1)=ma%(x+a,y+1,lev)
2490 IF ty<>y OR tx<>x+a THEN 2520
2500 IF lev=4 THEN view(a,2)=2 ELSE view(a,2)=3
2510 GOTO 2530
2520 view(a,2)=ma%(x+a,y,lev)
2530 IF y=oty AND otx=x+a AND ma%(otx,oty,lev)<>1 THEN view(a,2)=4
2540 view(a,3)=ma%(x+a,y-1,lev)
2550 en=view(a,2)
2560 NEXT
2570 FOR a=1 TO 2:NEXT
2580 RETURN
2590 REM Set up view info (South)
2600 en=0
2610 FOR a=0 TO 15
2620 IF en=1 THEN 2720
2630 view(a,1)=ma%(x+1,y-a,lev)
2640 IF x<>tx OR ty<>y-a THEN 2670
2650 IF lev=4 THEN view(a,2)=2 ELSE view(a,2)=3
2660 GOTO 2680
2670 view(a,2)=ma%(x,y-a,lev)
2680 IF x=otx AND oty=y-a AND ma%(otx,oty,lev)<>1 THEN view(a,2)=4
2690 view(a,3)=ma%(x-1,y-a,lev)
2700 en=view(a,2)
2710 NEXT
2720 FOR a=1 TO 2:NEXT
2730 RETURN
2740 REM Set up view info (West)
2750 en=0
2760 FOR a=0 TO 15
2770 IF en=1 THEN 2870
2780 view(a,1)=ma%(x-a,y-1,lev)
2790 IF y<>ty OR tx<>x-a THEN 2820
2800 IF lev=4 THEN view(a,2)=2 ELSE view(a,2)=3
2810 GOTO 2830
2820 view(a,2)=ma%(x-a,y,lev)
2830 IF y=oty AND otx=x-a AND ma%(otx,oty,lev)<>1 THEN view(a,2)=4
2840 view(a,3)=ma%(x-a,y+1,lev)
2850 en=view(a,2)
2860 NEXT
2870 FOR a=1 TO 2:NEXT
2880 RETURN
2890 REM Draw 3-D view of maze
2900 ON dir GOSUB 2290,2440,2590,2740
2910 CLS #2:ORIGIN 200,200:en=0
2920 FOR d=0 TO 10
2930 IF view(d,2)<>1 THEN 2980
2940 PLOT -s(d),s(d),2:DRAW s(d),s(d),2:PLOT -s(d),-s(d),2:DRAW s(d),-s(d),2
2950 IF view(d-1,1)=1 THEN PLOT -s(d),s(d),2:DRAW -s(d),-s(d),2
2960 IF view(d-1,3)=1 THEN PLOT s(d),s(d),2:DRAW s(d),-s(d),2
2970 en=1
2980 IF en=1 THEN 3080
2990 IF view(d,1)=1 THEN PLOT -s(d),s(d),2:DRAW -s(d+1),s(d+1),2:PLOT -s(d),-s(d),2:DRAW -s(d+1),-s(d+1),2 ELSE PLOT -s(d),s(d+1),2:DRAW -s(d+1),s(d+1),2:PLOT -s(d),-s(d+1),2:DRAW -s(d+1),-s(d+1),2
3000 IF view(d,3)=1 THEN PLOT s(d),s(d),2:DRAW s(d+1),s(d+1),2:PLOT s(d),-s(d),2:DRAW s(d+1),-s(d+1),2 ELSE PLOT s(d),s(d+1),2:DRAW s(d+1),s(d+1),2:PLOT s(d),-s(d+1),2:DRAW s(d+1),-s(d+1),2
3010 IF (view(d,1)<>view(d+1,1)) AND view(d+1,2)<>1 THEN PLOT -s(d+1),s(d+1),2:DRAW -s(d+1),-s(d+1),2
3020 IF (view(d,3)<>view(d+1,3)) AND view(d+1,2)<>1 THEN PLOT s(d+1),s(d+1),2:DRAW s(d+1),-s(d+1),2
3030 IF view(d,2)=2 THEN PLOT -s(d),-s(d),1:DRAW s(d+1),-s(d+1),1:PLOT s(d),-s(d),1:DRAW -s(d+1),-s(d+1),1
3040 IF view(d,2)=3 THEN PLOT -s(d+1),-s(d+1),2:DRAW -s(d+1),-s(d),2:PLOT s(d+1),-s(d+1),2:DRAW s(d+1),-s(d),2:PLOT -s(d),-s(d),2:DRAW s(d),-s(d),2:DRAW s(d+1),-s(d+1),2:DRAW -s(d+1),-s(d+1),2:DRAW -s(d),-s(d),2
3050 IF view(d,2)=4 THEN PLOT -s(d+1),s(d+1),2:DRAW -s(d+1),s(d),2:PLOT s(d+1),s(d+1),2:DRAW s(d+1),s(d),2:PLOT -s(d),s(d),2:DRAW s(d),s(d),2:DRAW s(d+1),s(d+1),2:DRAW -s(d+1),s(d+1),2:DRAW -s(d),s(d),2
3060 en=view(d,2)
3070 NEXT
3080 FOR a=1 TO 2:NEXT
3090 PEN #1,2:PAPER #1,3:LOCATE #1,6,5
3100 PRINT #1,moves:LOCATE #1,6,10
3110 dtt=INT(SQR(ABS(tx-x)^2+ABS(ty-y)^2))
3120 PRINT #1,dtt:LOCATE #1,7,14
3130 PRINT #1,lev
3140 LOCATE #1,8,17:PRINT #1," "
3150 LOCATE #1,9,18:PRINT #1," "
3160 LOCATE #1,8,19:PRINT #1," "
3170 LOCATE #1,7,18:PRINT #1," "
3180 IF DIr=1 THEN LOCATE #1,8,17:PRINT #1,CHR$(240)
3190 IF DIr=2 THEN LOCATE #1,9,18:PRINT #1,CHR$(243)
3200 IF dir=3 THEN LOCATE #1,8,19:PRINT #1,CHR$(241)
3210 IF dir=4 THEN LOCATE #1,7,18:PRINT #1,CHR$(242)
3220 ORIGIN 0,0:PLOT mx,my,0
3230 RETURN
3240 REM Sound for reaching next level
3250 GOSUB 2890:IF lev=4 THEN 3310
3260 SOUND 129,50,200,15,0,1
3270 FOR a=31 TO 1 STEP -1
3280 SOUND 1,0,2,a/4,0,0,a
3290 NEXT
3300 RETURN
3310 REM Music for when final target   reached
3320 RESTORE 3370
3330 FOR a=1 TO 12
3340 READ no,le
3350 SOUND 1,no,le*10,15,1
3360 NEXT
3370 DATA 119,2,119,1,119,1,119,2
3380 DATA 95,2,95,1,95,1,95,2
3390 DATA 80,2,80,2,80,2
3400 DATA 60,6
3410 RETURN