0 ' MAZE3D.BA written for the Model 100 by Tim Ekdom 72575,1473 1 ' Based on "Caves of Ice" by Robert Tsuk, published in COMPUTE! 5 GOTO 200 9 ' Subroutines: 10 CLS:LINE(41,15)-(96,50),1,B:'Draw room 11 LINE(28,2)-(41,15):LINE(96,15)-(109,2):LINE(28,63)-(41,50):LINE(96,50)-(109,63) 12 LINE(23,2)-(23,63):LINE(114,2)-(114,63) 13 LINE(22,2)-(22,63):LINE(115,2)-(115,63):RETURN 15 X1=61:Y1=7:X2=75:'Draw upper door 16 FOR K=0 TO 5:LINE(X1,Y1-K)-(X2,Y1-K):X1=X1-1:X2=X2+1:NEXT K 17 LINE(62,6)-(74,3),2,BF:RETURN 20 X1=61:Y1=58:X2=75:'Draw lower door 21 FOR K=0 TO 5:LINE(X1,Y1+K)-(X2,Y1+K):X1=X1-1:X2=X2+1:NEXT K 22 LINE(62,59)-(74,62),2,BF:RETURN 25 LINE(109,15)-(109,63):LINE(108,16)-(104,20):'Draw right door 26 LINE(104,21)-(108,58),1,BF:LINE(105,59)-(108,62),2:RETURN 30 LINE(28,15)-(28,63):LINE(29,16)-(33,20):'Draw left door 31 LINE(29,21)-(33,58),1,BF:LINE(29,62)-(32,59),2:RETURN 35 LINE(60,50)-(76,24),1,BF:'Draw middle door 36 X1=64:X2=72:FOR Y1=46 TO 50:LINE(X1,Y1)-(X2,Y1),2:X1=X1-1:X2=X2+1:NEXT Y1 37 LINE(61,25)-(63,27),2:LINE(75,25)-(73,27),2 38 LINE(64,46)-(72,28),2,BF:RETURN 40 RETURN:'Do nothing 45 WA=6*EW+30*NS+150*UD+I:RETURN:'Calculate wall number 50 RA!=RND(1):'Print nasty message 51 IF RA!<=.3 THEN PRINT@222,"Sorry, you can't":PRINT@262,"go that way. ";:GOTO 58 52 IF RA!>.3 AND DI<=2 THEN 55 53 IF RA!>=.3 AND RA!<.6 THEN PRINT@222,"You can't walk ":PRINT@262,"through walls!! ";:GOTO 58 54 IF RA!>=.6 AND RA!<.9 THEN PRINT@222,"Oops! You bumped":PRINT@262,"into a wall! ";:GOTO 58 55 IF RA!<.9 AND DI=1 THEN PRINT@222,"There's no way ":PRINT@262,"to go up!! ":GOTO 58 56 IF RA!<.9 AND DI=2 THEN PRINT@222,"There's no door ":PRINT@262,"on the floor! ":GOTO 58 57 PRINT@222,"Getting ":PRINT@262,"frustrated? " 58 FOR N=1 TO 700:NEXT N 59 PRINT@222,SPACE$(17);:PRINT@262,SPACE$(17);:RETURN 60 ON FA GOSUB 62,63,64,65:'Print Facing 61 PRINT@62,"Facing: "P$DR$Q$:RETURN 62 DR$=" North ":RETURN 63 DR$=" South ":RETURN 64 DR$=" East ":RETURN 65 DR$=" West ":RETURN 70 PRINT@142,"N S E W U D ? * F":RETURN:'Prompt 71 PRINT@150,P$"U"Q$:FOR K=1 TO 20:NEXT K:RETURN:'Highlight choice 72 PRINT@152,P$"D"Q$:FOR K=1 TO 20:NEXT K:RETURN 73 PRINT@146,P$"E"Q$:FOR K=1 TO 20:NEXT K:RETURN 74 PRINT@148,P$"W"Q$:FOR K=1 TO 20:NEXT K:RETURN 75 PRINT@142,P$"N"Q$:FOR K=1 TO 20:NEXT K:RETURN 76 PRINT@144,P$"S"Q$:FOR K=1 TO 20:NEXT K:RETURN 77 PRINT@154,P$"?"Q$:FOR K=1 TO 40:NEXT K:RETURN 78 PRINT@156,P$"*"Q$:FOR K=1 TO 40:NEXT K:RETURN 79 PRINT@158,P$"F"Q$:FOR K=1 TO 40:NEXT K:RETURN 80 PRINT@222,"Position: ";STR$(EW+1);STR$(NS+1);STR$(UD+1):RETURN:'Print position 85 PRINT@262,"Exit: ";STR$(EE+1);STR$(EN+1);STR$(EU+1):RETURN:'Print exit 90 PRINT@62,"Face which way?":GOSUB 70:'Change direction facing 91 A$=INKEY$:IF A$="" THEN 91 92 IF A$="N" OR A$="n" THEN FA=1:GOSUB 75:RETURN 93 IF A$="S" OR A$="s" THEN FA=2:GOSUB 76:RETURN 94 IF A$="E" OR A$="e" THEN FA=3:GOSUB 73:RETURN 95 IF A$="W" OR A$="w" THEN FA=4:GOSUB 74:RETURN 96 IF A$=CHR$(13) THEN RETURN 97 BEEP:GOTO 91 99 ' Main program: 100 FA=1:'Facing North 102 GOSUB 10:'Draw current room 104 FOR N=1 TO 6:I=N 106 GOSUB 45 108 IF MZ(WA)<>1 THEN 112 110 J=FC(FA,N):ON J GOSUB 15,20,25,30,35,40 112 NEXT N 114 GOSUB 60:GOSUB 70:DI=0:'Prompts & coords 115 IF PO THEN GOSUB 80 116 IF EX THEN GOSUB 85 117 A$=INKEY$:IF A$="" THEN 117:'Keypress 118 IF A$="U" OR A$="u" THEN DI=1:GOSUB 71:GOTO 142 120 IF A$="D" OR A$="d" THEN DI=2:GOSUB 72:GOTO 142 122 IF A$="E" OR A$="e" THEN DI=3:GOSUB 73:GOTO 142 124 IF A$="W" OR A$="w" THEN DI=4:GOSUB 74:GOTO 142 126 IF A$="N" OR A$="n" THEN DI=5:GOSUB 75:GOTO 142 128 IF A$="S" OR A$="s" THEN DI=6:GOSUB 76:GOTO 142 130 IF A$="*" AND PO=1 THEN GOSUB 78:PO=0:PRINT@222,SPACE$(16):GOSUB 70:GOTO 117:'Turn off pos'n & exit coords 132 IF A$="?" AND EX=1 THEN GOSUB 77:EX=0:PRINT@262,SPACE$(16):GOSUB 70:GOTO 117 134 IF A$="*" THEN GOSUB 78:PO=1:GOSUB 80:DI=0:A$="":GOSUB 70:GOTO 117:'Turn on pos'n & exit coords 136 IF A$="?" THEN GOSUB 77:EX=1:GOSUB 85:DI=0:A$="":GOSUB 70:GOTO 117 138 IF A$="F" OR A$="f" THEN GOSUB 79:GOSUB 90:GOTO 102 140 BEEP:GOTO 117 142 I=DI:GOSUB 45 144 IF MZ(WA)=0 THEN BEEP:GOSUB 50:GOSUB 70:GOTO 115:'No door in wall 146 ON DI GOTO 148,150,152,154,156,158:'Move to next cell 148 UD=UD+1:GOTO 160 150 UD=UD-1:GOTO 160 152 EW=EW+1:GOTO 160 154 EW=EW-1:GOTO 160 156 NS=NS+1:GOTO 160 158 NS=NS-1 160 IF UD<0 OR UD>4 OR EW<0 OR EW>4 OR NS<0 OR NS>4 THEN 300:'Found exit 162 GOTO 102 199 ' Set up: 200 DEFINT A-Z:DIM MZ(750),FC(4,6):P$=CHR$(27)+"p":Q$=CHR$(27)+"q":PO=0:EX=0 201 KEY OFF:KEY1,"":KEY2,"":KEY3,"":KEY4,"":KEY5,"":KEY8,"":'Disable function key legends 202 GOSUB 10:GOSUB 15:GOSUB 20:GOSUB 25:GOSUB 30:GOSUB 35 203 KEY(4) ON:KEY(8) ON:ON KEY GOSUB ,,,316,,,,315:'Enable F4 & F8 204 PRINT@65,P$" MAZE 3D "Q$:LINE(150,7)-(203,7):LINE(152,5)-(205,5):LINE(205,6)-(205,13) 206 PRINT@143,"Initializing...":PRINT@223,"Timing starts":PRINT@263,"at the BEEP!"; 208 FOR N=1 TO 4:FOR I=1 TO 6:READ FC(N,I):NEXT I:NEXT N 210 FOR N=1 TO VAL(RIGHT$(TIME$,2)) 212 RA!=RND(1):'Simulate random number 214 NEXT N 216 EW=0:'Put doors in maze 218 NS=0 220 UD=0 222 IF RND(1)<0.7 AND UD<4 THEN I=1:GOSUB 45:MZ(WA)=1 224 IF RND(1)<0.7 AND EW<4 THEN I=3:GOSUB 45:MZ(WA)=1 226 IF RND(1)<0.7 AND NS<4 THEN I=5:GOSUB 45:MZ(WA)=1 228 IF UD>0 THEN UD=UD-1:I=1:GOSUB 45:UD=UD+1:IF MZ(WA)=1 THEN I=2:GOSUB 45:MZ(WA)=1 230 IF EW>0 THEN EW=EW-1:I=3:GOSUB 45:EW=EW+1:IF MZ(WA)=1 THEN I=4:GOSUB 45:MZ(WA)=1 232 IF NS>0 THEN NS=NS-1:I=5:GOSUB 45:NS=NS+1:IF MZ(WA)=1 THEN I=6:GOSUB 45:MZ(WA)=1 234 UD=UD+1:IF UD<5 THEN 222 236 NS=NS+1:IF NS<5 THEN 220 238 EW=EW+1:IF EW<5 THEN 218 240 EW=RND(1)*5:'Calc random exit 242 NS=RND(1)*5 244 UD=RND(1)*5 246 I=RND(1)*6+1:ON I GOTO 248,250,252,254,256,258 248 UD=4:GOTO 260 250 UD=0:GOTO 260 252 EW=4:GOTO 260 254 EW=0:GOTO 260 256 NS=4:GOTO 260 258 NS=0 260 GOSUB 45:MZ(WA)=1:EE=EW:EN=NS:EU=UD 262 EW=RND(1)*5:'Calc random start 264 NS=RND(1)*5 266 UD=RND(1)*5 268 T1$=TIME$:BEEP:GOTO 100:'Start time 299 ' Winner's display: 300 CLS 301 T2$=TIME$:'Stop time 302 S1=VAL(RIGHT$(T1$,2)):M1=VAL(MID$(T1$,4,2)):S2=VAL(RIGHT$(T2$,2)):M2=VAL(MID$(T2$,4,2)) 303 IF S2