100 ' MAZE MASTER›140 ' BY STEPHEN EVERMAN & PAUL PRATT›180 ' (c)1987, ANTIC PUBLISHING INC.›190 VIDEORAM=PEEK(1102)*65536+ABS(PEEK(1104))›195 A$= CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)›197 A=VARPTR(A$):A1=INT(A/65536):A2=A-(A1*65536)'used in copyform as pointer›210 CO=1:OFF=0:OON=1:NUM=1:MZON=OFF›220 FULLW 2:CLEARW 2:HANDLE=2:A#=GB:CONTROL=PEEK(A#)›240 GINTOUT=PEEK(A#+12):GINTIN=PEEK(A#+8)›260 RANDOMIZE 0:DIM MZ%(31,31),BK%(700,2),KOL%(16),BK2%(400,2)›280 RESTORE 5780:GOSUB KOLOR›285 GOTOXY 5,15:? CHR$(189);" 1987 PRATT & EVERMAN";CHR$(7);›320 COLOR 2,0,0,0:FOR X=0 TO 30:GOSUB POLYLINE:NEXT 'hide output box›340 RESTORE 5700:GOSUB PRSTRING›360 COLOR 2:GOTOXY 49,10:?"W E":GOTOXY 52,9:?"N":GOTOXY 52,11:?"S"›380 COLOR 1:GOTOXY 48,13:?"TRACE ON":GOTOXY 52,10›400 GOTOXY 38,15:?"MAKE SHOW PATH RSET QUIT"›420 COLOR 1,1,1,9:RESTORE 6780›440 FOR X=0 TO 3:READ A,B,C,D:LINEF A,B,C,D:NEXT›460 COLOR 1,3,3:FOR X=0 TO 27:READ A,B,C,D:LINEF A,B,C,D:NEXT›480 FILL 462,93›500 GOSUB DISPLAY.MAN 'poke top man into video ram›520 GOTOXY 5,15:?"WELCOME TO MAZE MASTER ";:COLOR 2:? CHR$(3)›540 COLOR 1:GOTOXY 6,16:?"PLEASE CLICK ON MAKE"›560 MAIN:'***********************************************  ›580 WHILE FINI=OFF›600 GOSUB RAT:TI=TI+1›620 IF ABS(PEEK(1212))> 198 THEN POKE 1212,1 :S=S+1:IF S=60 THEN S=0:M=M+1›640 IF TIM=OON AND TI>20 THEN COLOR 3:GOTOXY 4,16:?" TIME:";S;"SEC ";M;"MIN " :GOSUB SHOW:TI=0›660 IF MOU=1 AND NOT(MX>436 AND MX<506 AND MY>102 AND MY<132) THEN GOSUB MAIN2›680 IF MX>434 AND MX<461 AND MY>111 AND MY<121 AND MOU=1 THEN GOSUB MOV.W›700 IF MX>461 AND MX<484 AND MY>102 AND MY<111 AND MOU=1 THEN GOSUB MOV.N›720 IF MX>483 AND MX<506 AND MY>112 AND MY<121 AND MOU=1 THEN GOSUB MOV.E›740 IF MX>460 AND MX<489 AND MY>122 AND MY<132 AND MOU=1 THEN GOSUB MOV.S›760 'GOTOXY 4,15:? MX,MY:GOSUB SHOW›780 WEND:END '***********************************************  ›800 MAIN2: '****** used to unclutter main and speed up room movement›820 IF MX>497 AND MX<552 AND MY>154 AND MY<169 AND MOU=1 AND MZON=OON THEN GOSUB RE.SET:COL=SCOL:ROW=SROW:GOSUB OUTPUT:NMOVE=0:S=-1:M=0:TI=33›840 IF MOU=1 AND F1=1 AND MY>154 AND MY<169 AND MX>331 AND MX<387 THEN GOSUB MAKE.MAZE›860 IF MOU=1 AND MY>154 AND MY<169 AND MX>387 AND MX<440 AND MZON=OON AND F1=1 THEN GOSUB ANSW›880 IF MOU=1 AND MY>154 AND MY<169 AND MX>441 AND MX<497 AND MZON=OON AND F1=1 THEN GOSUB PATH›900 IF MOU=1 AND F1=1 AND MY>137 AND MY<150 AND MX>410 AND MX<530 THEN COLOR 1: GOSUB TRAC›920 IF MOU=1 AND MY>154 AND MY<170 AND MX>553 AND MX<670 THEN COLOR 1:FINI=OON›940 RETURN '*******************************›960 COPY:'**********›980 X1=278:Y1=96:X2=404:Y2=150:OFX=130:OFY=-65›1000 GOSUB VRO.COPYFORM 'copy empty screen over man›1020 RETURN›1040 MOV.W:'************›1060 IF (MZ%(COL,ROW-1)AND 2)<>2 OR MZON=OFF THEN RETURN›1100 GOSUB COPY:ROW=ROW-1:GOSUB OUTPUT›1120 X1=300:Y1=0:X2=332:Y2=18:OFX=208:OFY=50›1140 GOSUB VRO.COPYFORM 'copy top man down into direction window›1160 RETURN›1180 MOV.E:'************›1200 IF (MZ%(COL,ROW+1)AND 8)<>8 OR MZON=OFF THEN RETURN›1240 GOSUB COPY:ROW=ROW+1:GOSUB OUTPUT›1260 X1=300:Y1=0:X2=332:Y2=18:OFX=112:OFY=50:GOSUB VRO.COPYFORM›1300 RETURN›1320 MOV.N:'************›1340 IF (MZ%(COL-1,ROW)AND 4)<>4 OR MZON=OFF THEN RETURN›1380 GOSUB COPY:COL=COL-1:GOSUB OUTPUT›1400 X1=300:Y1=0:X2=332:Y2=18:OFX=160:OFY=68:GOSUB VRO.COPYFORM›1440 RETURN›1460 MOV.S:'************›1480 IF (MZ%(COL+1,ROW)AND 1)<>1 OR MZON=OFF THEN RETURN›1520 GOSUB COPY:COL=COL+1:GOSUB OUTPUT›1540 X1=300:Y1=0:X2=332:Y2=18:OFX=160:OFY=32:GOSUB VRO.COPYFORM›1580 RETURN›1600 MAKE.MAZE: '***************›1620 GOSUB COPY:GOSUB CLEAN:GOSUB RE.SET:GOSUB GETSIZE:MZON=OON:GOSUB WORK›1660 FOR X=0 TO 31:FOR Y=0 TO 31:MZ%(X,Y)=16:NEXT:NEXT'out of bounds detector›1680 ROW=INT(RND*WID)+1:COL=1:SROW=ROW:SCOL=COL ' maze entrance›1700 BK%(NUM,1)=COL:BK%(NUM,2)=ROW 'bk% used as map of direct way through maze›1720 FOR X=1 TO HEI:FOR Y=1 TO WID:MZ%(X,Y)=0:NEXT:NEXT' clean out array›1740 MZ%(COL,ROW)=1'open entrance top wall›1760 WHILE COL0 AND MZ%(COL+1,ROW)<>0 AND MZ%(COL,ROW-1)<>0 AND MZ%(COL,ROW+1)<>0 THEN GOSUB RETRACE 'if traped back up & find new path›1860 WEND '  end loop one. now single path through maze contained in bk%›1880 ' ecol & erow = maze exit:opnum= optimum # of moves from start to exit›1900 ECOL=COL:EROW=ROW:TNUM=0:OPNUM=NUM:QN=NUM-1›1920 MZ%(COL,ROW)=MZ%(COL,ROW)+4' open botton wall of exit›1922 '›1925 '  fill in all open space with dead end hallways›1930 WHILE TNUM1 OR ONCE=1›1960 WHILE MZ%(COL-1,ROW)=0 OR MZ%(COL+1,ROW)=0 OR MZ%(COL,ROW-1)=0 OR MZ%(COL,ROW+1)=0 ' keep filling untel dead end ' 2›1970 GOSUB DIRECT:BK2%(NUM,1)=COL:BK2%(NUM,2)=ROW›1980 WEND 'reached dead end. back up again looking for openings›2300 WHILE NUM>1 AND (MZ%(COL-1,ROW)<>0 AND MZ%(COL+1,ROW)<>0 AND MZ%(COL,ROW-1)<>0 AND MZ%(COL,ROW+1)<>0)›2310 NUM=NUM-1:COL=BK2%(NUM,1):ROW=BK2%(NUM,2)›2340 WEND:ONCE=0›2350 WEND›2360 WEND›2380 '›2480 COL=SCOL:ROW=SROW'reset array to entrance›2500 GOSUB OUTPUT:GOSUB CLEAN›2520 TIM=OON:S=0:M=0:NMOVE=0›2540 X1=300:Y1=0:X2=322:Y2=18:OFX=162:OFY=34›2560 GOSUB VRO.COPYFORM:RETURN 'copy man from above into box›2580 DIRECT: '********************************************›2600 ON INT(RND*16)+1 GOSUB RIS,FALL,LFT,RHT,LFT,RHT,LFT,RHT,RIS,RIS,RHT,LFT,RIS,RIS,FALL,RIS›2620 RETURN›2640 LFT:'********›2660 IF ROW<=0 OR MZ%(COL,ROW-1)<> 0 THEN RETURN›2680 MZ%(COL,ROW)=MZ%(COL,ROW)+8:ROW=ROW-1:NUM=NUM+1›2700 MZ%(COL,ROW)=MZ%(COL,ROW)+2›2720 RETURN›2740 RHT:'*********›2760 IF ROW>=WID OR MZ%(COL,ROW+1)<> 0 THEN RETURN›2780 MZ%(COL,ROW)=MZ%(COL,ROW)+2:ROW=ROW+1:NUM=NUM+1›2800 MZ%(COL,ROW)=MZ%(COL,ROW)+8›2820 RETURN›2840 FALL:'********›2860 IF COL>=HEI OR MZ%(COL+1,ROW)<> 0 THEN RETURN›2880 MZ%(COL,ROW)=MZ%(COL,ROW)+4:COL=COL+1:NUM=NUM+1›2900 MZ%(COL,ROW)=MZ%(COL,ROW)+1›2920 RETURN›2940 RIS:'********›2960 IF COL<=1 OR MZ%(COL-1,ROW)<> 0 THEN RETURN›2980 MZ%(COL,ROW)=MZ%(COL,ROW)+1:COL=COL-1:NUM=NUM+1›3000 MZ%(COL,ROW)=MZ%(COL,ROW)+4›3020 RETURN›3040 RETRACE:'**********›3060 GOTOXY 44,2:? CHR$(7)›3080 NUM=NUM+1:'FX=0›3100 WHILE MZ%(COL+1,ROW)<>0' while space below isn't empty›3120 NUM=NUM-1›3140 COL=BK%(NUM,1):ROW=BK%(NUM,2) 'back up one step›3160 WEND›3180 RETURN›3200 GETSIZE:'*******************›3210 GOSUB CLEAN:COLOR 1›3220 GOTOXY 0,15:? " WITH POINTER IN BOX ";:COLOR 2:? CHR$(1);›3230 COLOR 1:?" HOLD BUTTON"›3240 GOTOXY 2,16:?"AND PULL TO DESIRED MAZE SIZE";›3260 GOSUB RAT›3280 WHILE MOU<>1 OR F1=0:GOSUB RAT:WEND:GOSUB CLEAN›3300 WHILE MOU<>2›3320 GOSUB RAT›3340 IF MOU=1 AND MY>23 THEN GOSUB RUBBERBOX:GOSUB CLEAN›3360 WID=INT(PEEK(GINTOUT+2)/8):HEI=INT(PEEK(GINTOUT+4)/4)›3370 IF WID<3 THEN WID=3›3380 IF HEI<3 THEN HEI=3›3400 IF WID>30 THEN WID=30›3420 IF HEI>30 THEN HEI=30›3460 GOTOXY 2,15:? WID;"X";HEI;" CLICK MOUSE 2 IF OK"›3480 GOTOXY 4,16:? "OR RESIZE USING MOUSE 1";›3500 MOU=0: WHILE MOU=0:GOSUB RAT:WEND›3520 WEND›3540 CLEAN:'*************›3560 FOR X=15 TO 16›3580 GOTOXY 0,X:?" ":NEXT›3600 RETURN›3604 WORK:'********›3606 GOSUB CLEAN:COLOR 2:GOTOXY 8,16:?"W O R K I N G";:RETURN›3620 PATH: '************›3640 GOTOXY 5,15:? CHR$(7):CL=SCOL:RW=SROW:PX=RW*8+12:PY=CL*4+6›3680 FOR X=1 TO OPNUM:CL=BK%(X,1):RW=BK%(X,2):OPX=PX:OPY=PY›3740 PX=RW*8+12:PY=CL*4+6:COLOR 1,0,2:LINEF OPX,OPY,PX,PY›3760 NEXT:RETURN›3780 TRAC: '************›3800 IF CO=1 THEN CO=0:GOTOXY 54,13:?"OFF";CHR$(7):RETURN›3820 IF CO=0 THEN CO=1:GOTOXY 54,13:?"ON ";CHR$(7):RETURN›3840 OUTPUT:'*************************›3880 GOTOXY 5,15:? CHR$(7);:NMOVE=NMOVE+1:POINTX=ROW*8+12:POINTY=COL*4+6›3900 COLOR 1,0,0:LINEF OPOINTX,OPOINTY,OPOINTX,OPOINTY›3920 OPOINTX=POINTX:OPOINTY=POINTY›3940 COLOR 1,0,CO:LINEF POINTX,POINTY,POINTX,POINTY›3960 ' north door›3980 IF ((MZ%(COL,ROW) AND 1)=1) THEN C=0 ELSE C=1›4000 COLOR 1,0,C,0:LINEF 413,7,528,7›4020 IF CO=1 THEN LINEF ROW*8+8,COL*4+4,ROW*8+16,COL*4+4›4040 ' east door›4060 IF ((MZ%(COL,ROW) AND 2)=2) THEN C=0 ELSE C=1›4080 COLOR 1,0,C,0:LINEF 538,12,538,62›4100 IF CO=1 THEN LINEF ROW*8+16,COL*4+5-C,ROW*8+16,COL*4+7+C›4120 ' south door›4140 IF ((MZ%(COL,ROW) AND 4)=4) THEN C=0 ELSE C=1›4160 COLOR 1,0,C,0:LINEF 413,67,528,67›4180 IF CO=1 THEN LINEF ROW*8+8,COL*4+8,ROW*8+15+C,COL*4+8›4200 ' west door›4220 IF ((MZ%(COL,ROW) AND 8)=8) THEN C=0 ELSE C=1›4240 COLOR 1,0,C,0:LINEF 403,12,403,62›4260 IF CO=1 THEN LINEF ROW*8+8,COL*4+5-C,ROW*8+8,COL*4+7+C›4280 IF COL=ECOL AND ROW=EROW AND FSTOP=OFF THEN GOSUB YOUDIDIT›4300 RETURN›4320 RE.SET:'**************›4340 GOTOXY 2,15:? CHR$(7):GOSUB WORK›4360 FOR Y=0 TO HEI*4+1 ' erase maze map directly from Video ram›4380 FOR X=4644 TO 4704 STEP 4›4400 POKE VIDEORAM+X+Y*160,0 'screen memory plane one›4420 POKE VIDEORAM+2+X+Y*160,0 'screen memory plane two.›4440 NEXT:NEXT:TIM=OON:RETURN›4460 YOUDIDIT:'************›4540 GOSUB CLEAN:RESTORE 6780:FOR X=0 TO 15:GOSUB KOLOR:? CHR$(7);›4560 FOR D=0 TO 100:NEXT:NEXT›4565 COLOR 1:GOTOXY 1,15:?"OPTIMUM # OF MOVES";OPNUM;"YOU'RE #"NMOVE›4570 GOTOXY 3,16:?"YOU'RE TIME WAS";M;"MIN ";S;"SEC"›4580 RESTORE 5780:GOSUB KOLOR:TIM=OFF:RETURN›4600 ANSW:'************************›4620 GOSUB CLEAN:GOTOXY 2,15:?"MOUSE BUTTON 1 FOR SCREEN"›4640 GOTOXY 2,16:?"MOUSE BUTTON 2 FOR PRINTER":GOSUB RAT›4660 WHILE (MOU<>1 AND MOU<>2) OR F1=0:GOSUB RAT:WEND›4680 IF MOU=1 THEN GOSUB ANSW2SCR›4700 IF MOU=2 THEN GOSUB ANSW2PTR›4720 GOSUB CLEAN:RETURN›4740 ANSW2PTR:'********›4760 GOSUB CLEAN:GOTOXY 6,15:?"PLEASE TURN ON PRINTER"›4780 GOTOXY 3,16:?"AND CLICK EITHER MOUSE BUTTON"›4800 GOSUB RAT:WHILE MOU=0 OR F1=0:GOSUB RAT:WEND›4820 ' Subroutine for Epson-compatible printers›4860 ESC=27 'escape key›4880 COMPRES=15 'compressed character mode›4900 SUB=83 'subscript mode›4920 LSPC=51 'set line spacing›4940 N216=14 '# of line spacings of 12/216" each›4960 LPRINT CHR$(COMPRS):LPRINT CHR$(ESC);CHR$(SUB)›4980 LPRINT CHR$(ESC);CHR$(LSPC);CHR$(N216);:LPRINT›5000 FOR COL=1 TO HEI:A$="-":B$="I":FOR ROW=1 TO WID›5020 IF ((MZ%(COL,ROW) AND 1)=1) THEN A$=A$+" -" ELSE A$=A$+"--"›5040 IF ((MZ%(COL,ROW) AND 2)=2) THEN B$=B$+" " ELSE B$=B$+" I"›5060 NEXT:LPRINT A$:LPRINT B$:NEXT›5080 A$="-":COL=HEI:FOR ROW=1 TO WID›5100 IF ((MZ%(COL,ROW) AND 4)=4) THEN A$=A$+" -" ELSE A$=A$+"--"›5120 NEXT: LPRINT A$›5140 RETURN›5160 ANSW2SCR:'********›5180 ACOL=COL:COL=SCOL:AROW=ROW:ROW=SROW›5200 COLOR 1,1,1:FOR C=1 TO HEI:FOR R=1 TO WID:'GOSUB 3520:NEXT:NEXT›5220 IF ((MZ%(C,R) AND 1)<>1) THEN LINEF R*8+8,C*4+4,R*8+16,C*4+4›5240 IF ((MZ%(C,R) AND 2)<>2) THEN LINEF R*8+16,C*4+5,R*8+16,C*4+8›5260 IF ((MZ%(C,R) AND 4)<>4) THEN LINEF R*8+8,C*4+8,R*8+16,C*4+8›5280 IF ((MZ%(C,R) AND 8)<>8) THEN LINEF R*8+8,C*4+5,R*8+8,C*4+8›5300 NEXT:NEXT›5320 COL=ACOL:ROW=AROW:FSTOP=OON:GOSUB OUTPUT:FSTOP=OFF›5340 RETURN›5360 ' %%%%%%%%%%%%%%%% VDI & GEM %%%%%%%%%%%%%%%%%%%%%›5380 RAT:'***›5400 GINTOUT=PEEK(A#+12):GEMSYS(79)›5420 MX=PEEK(GINTOUT+2):MY=PEEK(GINTOUT+4):MOU=PEEK(GINTOUT+6)›5440 IF OLDMOU<>MOU THEN F1=1 ELSE F1=0 'stops fall-through of mouse button›5460 OLDMOU=MOU:RETURN›5480 POLYLINE:'****** cover basic output window in background color›5500 POKE CONTRL,6:POKE CONTRL+2,6:POKE CONTRL+4,0:POKE CONTRL+12,HANDLE›5520 POKE PTSIN,0+X:POKE PTSIN+2,0+X:POKE PTSIN+4,639-X:POKE PTSIN+6,0+X›5540 POKE PTSIN+8,639-X:POKE PTSIN+10,199-X:POKE PTSIN+12,0+X›5560 POKE PTSIN+14,199-X:POKE PTSIN+16,0+X:POKE PTSIN+18,0+X›5580 VDISYS(0):RETURN›5600 PRSTRING:' **** print outside output window ************›5620 READ ST,XST,YST›5640 POKE CONTRL,8:POKE CONTRL+2,1:POKE CONTRL+6,ST:POKE CONTRL+12,HANDLE›5660 FOR X=0 TO ST*2-1 STEP 2:READ CH:POKE INTIN+X,CH:NEXT›5680 POKE PTSIN,XST:POKE PTSIN+2,YST:VDISYS(0):RETURN›5700 DATA 28,210,13,77,0,65,0,90,0,69,0,0,0,0,0,0,0,0,0,0›5720 DATA 77,0,65,0,83,0,84,0,69,0,82›5740 KOLOR:'**********************›5760 FOR A=0 TO 3:READ B:KOL%(A)=B:NEXT›5780 DATA 33,1808,85,1907›5800 DEFDBL K:K = 1114:POKE K,VARPTR(KOL%(0))›5820 RETURN›5840 SHOW:'**********›5860 POKE CONTRL,122:POKE CONTRL+2,0:POKE CONTRL+6,1›5900 POKE CONTRL+12,HANDLE:POKE INTIN,0›5940 VDISYS(0):RETURN›6120 RUBBERBOX: '***************›6140 COLOR 1,1,1›6160 POKE CONTRL,70:POKE CONTRL+2,4:POKE CONTRL+4,3:POKE CONTRL+6,0›6180 POKE CONTRL+8,0:POKE CONTRL+12,2›6200 POKE GINTIN,16:POKE GINTIN+2,29:POKE GINTIN+4,30:POKE GINTIN+6,15›6220 GEMSYS(70)›6240 RETURN›6260 DISPLAY.MAN:'*****›6280 VIDRAM=VIDEORAM+236:RESTORE 6380›6300 FOR Y=0 TO 15:READ A,B›6320 POKE VIDRAM+Y*160,A›6340 POKE VIDRAM+2+Y*160,B›6360 NEXT›6380 DATA 1984,0,16376,0,0,4064,12312,1984,15480,896,65278,256,65534,0›6400 DATA 57334,0,57334,0,32764,0,7920,0,7920,0,7920,0,7920,0›6420 DATA 7920,0,16120,0,0›6440 RETURN›6460 VRO.COPYFORM: '*******›6520 POKE CONTRL,109:POKE CONTRL+2,4:POKE CONTRL+6,1:POKE CONTRL+12,HANDLE›6540 POKE CONTRL+14,A1:POKE CONTRL+16,A2:POKE CONTRL+18,A1:POKE CONTRL+20,A2›6560 POKE INTIN,3›6580 POKE PTSIN,X1 ' X TOP SOURSE›6600 POKE PTSIN+2,Y1 ' Y TOP SOURSE›6620 POKE PTSIN+4,X2 ' X BOT SOURSE›6640 POKE PTSIN+6,Y2 ' Y BOT SOURSE›6660 POKE PTSIN+8,X1+OFX'X TOP DESTINATION›6680 POKE PTSIN+10,Y1+OFY 'Y TOP DESTINATION›6700 POKE PTSIN+12,X2+OFX' X BOT DESTINATION›6720 POKE PTSIN+14,Y2+OFY ' Y BOT DESTINATION›6740 VDISYS(0)›6760 RETURN›6780 DATA 393,7,548,7,393,67,548,67,538,2,538,72,403,2,403,72›6800 DATA 393,2,548,2,548,2,548,72,393,72,548,72,393,2,393,72›6820 DATA 4,2,271,2,271,2,271,133,271,133,4,133,4,133,4,2›6840 DATA 330,132,606,132,606,132,606,148,606,148,330,148,330,148,330,132›6860 DATA 386,132,386,148,440,132,440,148,496,132,496,148,552,132,552,148›6880 DATA 410,115,530,115,530,115,530,128,530,128,410,128,410,128,410,115›6900 DATA 435,90,505,90,505,90,505,100,505,100,435,100,435,100,435,90›6920 DATA 460,80,482,80,482,80,482,110,482,110,460,110,460,110,460,80›