' * * * * * * * * * * * * ' * Space Maze Game * ' * * ' * Written by * ' * Vince Long * ' * November 2000 * ' * * ' * Version 0.2 * ' * * * * * * * * * * * * RANDOMIZE TIMER CLS DIM Star1(500), Ship1(550), Shape1(500), RoundThing(500) DIM ThingyX(20), ThingyY(20), LowX(20), HighX(20), LowY(20), HighY(20) FOR I = 1 TO 16 READ LowX(I), HighX(I), LowY(I), HighY(I) NEXT I RESTORE SCREEN 12 GOSUB Splash EntryPoint1: GOSUB Menu GOSUB DrawStars GOSUB DrawHBars GOSUB DrawVBars GOSUB DrawRoundThings GOSUB DrawBase ' ************************* ' Get Started ' ************************* TimeStart = TIMER X = 618: Y = 230 StartHere: ' ************** ' Display Status ' ************** LOCATE 29, 1 COLOR 9 FOR Col = 1 TO 80 PRINT CHR$(219); NEXT Col LOCATE 30, 1 FOR Col = 1 TO 80 PRINT CHR$(219); NEXT Col LOCATE 30, 2 PRINT "X="; X; " Y="; Y; GET (X, Y)-(X + 20, Y + 20), Star1 ' ************* ' Draw the Ship ' ************* LINE (X, Y)-(X + 20, Y + 20), 3, B LINE (X + 4, Y + 6)-(X + 16, Y + 14), 5, BF ' ****************** ' Wait for Keystroke ' ****************** I$ = "" DO I$ = INKEY$ LOCATE 30, 19: PRINT "Fuel: "; LevelFuel - INT(TIMER - TimeStart); LOCATE 30, 31: PRINT "Score: "; Points; LOCATE 30, 45: PRINT "Damage: "; Damage; LOCATE 30, 58: PRINT "Teleport Left: "; Tele; IF LevelFuel - INT(TIMER - TimeStart) < 1 THEN GOTO Loser LOOP WHILE I$ = "" ' ************************* ' Draw the Ship Highlighted ' ************************* LINE (X + 1, Y + 3)-(X + 19, Y + 17), 5, B LINE (X + 2, Y + 4)-(X + 18, Y + 16), 12, B LINE (X + 3, Y + 5)-(X + 17, Y + 15), 14, B SOUND 3000, .1 SOUND 300, .05 ' ***** ' Delay ' ***** T = TIMER DO LOOP WHILE TIMER < T + .02 ' ************** ' Erase the Ship ' ************** LINE (X, Y)-(X + 20, Y + 20), 0, BF ' ****************** ' Put the Stars Back ' ****************** PUT (X, Y), Star1 OldX = X OldY = Y IF LCASE$(I$) = "t" THEN GOTO TelePort IF I$ = CHR$(27) THEN GOTO ShutDown IF I$ = CHR$(0) + "H" THEN Y = Y - 3 IF I$ = CHR$(0) + "K" THEN X = X - 3 IF I$ = CHR$(0) + "P" THEN Y = Y + 3 IF I$ = CHR$(0) + "M" THEN X = X + 3 IF I$ = "7" THEN Y = Y - 3: X = X - 3 IF I$ = "1" THEN Y = Y + 3: X = X - 3 IF I$ = "3" THEN Y = Y + 3: X = X + 3 IF I$ = "9" THEN Y = Y - 3: X = X + 3 IF I$ = "8" THEN Y = Y - 3 IF I$ = "2" THEN Y = Y + 3 IF I$ = "4" THEN X = X - 3 IF I$ = "6" THEN X = X + 3 IF POINT(X + 10, Y + 10) = 14 THEN FOR J = 1 TO 16 IF X + 10 > LowX(J) AND X + 10 < HighX(J) AND Y + 10 > LowY(J) AND Y + 10 < HighY(J) THEN UsedX = ThingyX(J) UsedY = ThingyY(J) J = 16 Points = Points + 1 GOSUB DrawUsedThings END IF NEXT J END IF IF POINT(X, Y) = 12 OR POINT(X + 20, Y) = 12 OR POINT(X + 20, Y + 20) = 12 OR POINT(X, Y + 20) = 12 THEN GOSUB squeel X = OldX Y = OldY Damage = Damage + 1 TimeStart = TimeStart - DamageLevel Damage = Damage + 1 GOTO StartHere END IF IF POINT(X + 10, Y + 10) = 13 THEN GOTO Winner END IF IF X < 1 THEN X = 1 GOSUB squeel TimeStart = TimeStart - DamageLevel Damage = Damage + 1 END IF IF X > 619 THEN X = 619 GOSUB squeel TimeStart = TimeStart - DamageLevel Damage = Damage + 1 END IF IF Y < 1 THEN Y = 1 GOSUB squeel TimeStart = TimeStart - DamageLevel Damage = Damage + 1 END IF IF Y > 426 THEN Y = 426 GOSUB squeel TimeStart = TimeStart - DamageLevel Damage = Damage + 1 END IF GOTO StartHere ' *************** ' End Game Loser ' *************** Loser: FOR SS = 1 TO 10 FOR s = 7500 TO 5000 STEP 300 SOUND s, .1 SOUND s + 100, .05 SOUND s + 100, .02 NEXT s NEXT SS LINE (200, 163)-(437, 280), 14, B LINE (201, 164)-(436, 279), 2, BF COLOR 15 LOCATE 12, 27 T$ = "You have shown your " GOSUB SlowPrint LOCATE 13, 27 T$ = "incompetence as a starship " GOSUB SlowPrint LOCATE 14, 27 T$ = "commander by running out of" GOSUB SlowPrint LOCATE 15, 27 T$ = "fuel before docking. " FOR I = 1 TO 23 - LEN(T$) T$ = T$ + " " NEXT I GOSUB SlowPrint LOCATE 16, 27 T$ = " " GOSUB SlowPrint LOCATE 17, 27 T$ = " Press Any Key for Menu " GOSUB SlowPrint DO I$ = INKEY$ LOOP UNTIL I$ <> "" GOTO EntryPoint1 ' *************** ' End Game Winner ' *************** Winner: FOR SS = 1 TO 10 FOR s = 500 TO 7000 STEP 300 SOUND s, .1 SOUND s + 100, .05 SOUND s + 100, .02 NEXT s NEXT SS LINE (200, 163)-(437, 280), 14, B LINE (201, 164)-(436, 279), 2, BF COLOR 15 LOCATE 12, 29 T$ = "You have completed your" GOSUB SlowPrint LOCATE 13, 29 T$ = "assigned mission with " GOSUB SlowPrint LOCATE 14, 29 T$ = "a score of " + STR$(Points) FOR I = 1 TO 23 - LEN(T$) T$ = T$ + " " NEXT I GOSUB SlowPrint LOCATE 15, 29 T$ = "on the " + Level$ + " level." FOR I = 1 TO 23 - LEN(T$) T$ = T$ + " " NEXT I GOSUB SlowPrint LOCATE 16, 29 T$ = " " GOSUB SlowPrint LOCATE 17, 29 T$ = "Press Any Key for Menu " GOSUB SlowPrint DO I$ = INKEY$ LOOP UNTIL I$ <> "" GOTO EntryPoint1 END ' **************************** ' TelePort ' **************************** TelePort: IF Tele = 0 THEN FOR s = 400 TO 800 STEP 5 SOUND s, .05 SOUND 40, .05 NEXT s GOTO StartHere END IF FOR s = 3000 TO 50 STEP -200 SOUND s, .1 SOUND s + 500, .3 NEXT s TeleLocX = INT(615 * RND(1) + 1) TeleLocY = INT(410 * RND(1) + 1) IF TeleLocX < 20 THEN GOTO TelePort IF TeleLocY > 410 THEN GOTO TelePort FOR XX = TeleLocX TO TeleLocX + 20 FOR YY = TeleLocY TO TeleLocY + 20 IF POINT(XX, YY) = 12 THEN XX = TeleLocX + 20 YY = TeleLocY + 20 NoMatch = 1 END IF NEXT YY NEXT XX IF NoMatch = 1 THEN NoMatch = 0 GOTO TelePort END IF X = TeleLocX Y = TeleLocY Tele = Tele - 1 TimeStart = TimeStart - 5 GOTO StartHere ' ******** ' Shutdown ' ******** ShutDown: SCREEN 0 CLS END ' **** **** **** SUBROUTINES **** **** **** ' ********** ' Slow Print ' ********** SlowPrint: FOR I = 1 TO LEN(T$) PRINT MID$(T$, I, 1); SOUND 100, .05 SOUND 1000, .01 T = TIMER DO LOOP WHILE TIMER < T + .05 NEXT I RETURN ' ******************************* ' Make the 'Edge of Screen' Sound ' ******************************* squeel: FOR sq = 800 TO 8000 STEP 200 SOUND sq, .01 SOUND sq * 2, .07 NEXT sq RETURN ' ************************************ ' Subroutine to draw the Round Thingy ' ************************************ RoundThingy: GetShapeLoc: ShapeLocX = INT(640 * RND(1) + 1) ShapeLocY = INT(480 * RND(1) + 1) IF ShapeLocX < LowX OR ShapeLocX > HighX THEN GOTO GetShapeLoc IF ShapeLocY < LowY OR ShapeLocY > HighY THEN GOTO GetShapeLoc FOR X = ShapeLocX - 8 TO ShapeLocX + 8 FOR Y = ShapeLocY - 8 TO ShapeLocY + 8 IF POINT(X, Y) = 12 THEN X = ShapeLocX + 8 Y = ShapeLocY + 8 MatchFlag = 1 END IF NEXT Y NEXT X IF MatchFlag = 1 THEN MatchFlag = 0 GOTO GetShapeLoc ELSE CIRCLE (ShapeLocX, ShapeLocY), 7, 2 PAINT (ShapeLocX, ShapeLocY), 4, 2 CIRCLE (ShapeLocX, ShapeLocY), 3, 3 PAINT (ShapeLocX, ShapeLocY), 14, 3 END IF RETURN ' ***************** ' Draw the Stars ' ***************** DrawStars: FOR B = 1 TO 8 FOR X = 1 TO 640 MagTemp = INT(RND * 3) + 1 IF MagTemp = 1 THEN Magnitude = 7 IF MagTemp = 2 THEN Magnitude = 8 IF MagTemp = 3 THEN Magnitude = 15 PSET (X, INT(RND * 480) + 1), Magnitude NEXT X NEXT B RETURN ' ************************ ' Draw the Horizontal Bars ' ************************ DrawHBars: COLOR 12 FOR column = 5 TO 75 STEP 8 RandomRow = INT(10 * RND(1) + 1) FOR row = RandomRow TO RandomRow + 6 LOCATE row, column PRINT CHR$(219) NEXT row GetRandomRow1: RandomRow = INT(21 * RND(1) + 1) IF RandomRow < 11 THEN GOTO GetRandomRow1 FOR row = RandomRow TO RandomRow + 6 LOCATE row, column + 4 PRINT CHR$(219) NEXT row NEXT column RETURN ' ********************** ' Draw the Vertical Bars ' ********************** DrawVBars: FOR row = 1 TO 25 STEP 6 GetRandomColumn1: RandomColumn = INT(20 * RND(1) + 1) IF RandomColumn < 5 THEN GOTO GetRandomColumn1 FOR column = RandomColumn TO RandomColumn + 6 LOCATE row, column PRINT CHR$(219) NEXT column GetRandomColumn2: RandomColumn = INT(60 * RND(1) + 1) IF RandomColumn < 20 THEN GOTO GetRandomColumn2 FOR column = RandomColumn TO RandomColumn + 6 LOCATE row, column PRINT CHR$(219) NEXT column GetRandomColumn3: RandomColumn = INT(74 * RND(1) + 1) IF RandomColumn < 60 THEN GOTO GetRandomColumn3 FOR column = RandomColumn TO RandomColumn + 6 LOCATE row, column PRINT CHR$(219) NEXT column NEXT row RETURN ' ************************* ' Draw the Shapes ' ************************* DrawRoundThings: FOR Shape = 1 TO 16 LowX = LowX(Shape) HighX = HighX(Shape) LowY = LowY(Shape) HighY = HighY(Shape) GOSUB RoundThingy ThingyX(Shape) = ShapeLocX ThingyY(Shape) = ShapeLocY NEXT Shape RETURN ' ************************* ' Draw the Used Shapes ' ************************* DrawUsedThings: CIRCLE (UsedX, UsedY), 7, 6 PAINT (UsedX, UsedY), 8, 6 CIRCLE (UsedX, UsedY), 3, 5 PAINT (UsedX, UsedY), 5, 5 FOR s = 5000 TO 500 STEP -200 SOUND s, .01 SOUND s * 2, .07 NEXT s TimeStart = TimeStart + TimeBoost RETURN ' ************************* ' Draw the Base ' ************************* DrawBase: LINE (1, 200)-(15, 250), 10, B PAINT (3, 210), 13, 10 RETURN ' ************************* ' Menu ' ************************* Menu: CLS GOSUB DrawStars LINE (138, 98)-(502, 302), 12, B LINE (140, 100)-(500, 300), 12, B LINE (320, 100)-(320, 300), 12 LINE (322, 100)-(322, 300), 12 COLOR 15 LOCATE 10, 25 T$ = "S P A C E" GOSUB SlowPrint LOCATE 13, 26 T$ = "M A Z E" GOSUB SlowPrint LINE (150, 120)-(310, 230), 14, B LINE (148, 118)-(312, 232), 14, B LOCATE 17, 23 PRINT "Press 'I' for" LOCATE 18, 23 PRINT "Instructions "; "" LOCATE 8, 46 PRINT "Select a Level" LOCATE 10, 48 PRINT "1. Easy" LOCATE 12, 48 PRINT "2. Medium" LOCATE 14, 48 PRINT "3. Hard" LOCATE 16, 48 PRINT "4. Quit" LOCATE 18, 46 PRINT "Make a Choice" WaitHere1: I$ = "" DO I$ = INKEY$ LOOP WHILE I$ = "" IF I$ = "1" THEN Level$ = "Easy" LevelFuel = 45 TimeBoost = 8 DamageLevel = 3 Tele = 3 CLS RETURN END IF IF I$ = "2" THEN Level$ = "Medium" LevelFuel = 30 TimeBoost = 5 DamageLevel = 6 Tele = 2 CLS RETURN END IF IF I$ = "3" THEN Level$ = "Hard" LevelFuel = 20 TimeBoost = 3 DamageLevel = 9 Tele = 1 CLS RETURN END IF IF I$ = "4" THEN GOTO ShutDown IF LCASE$(I$) = "i" THEN GOTO Instructions GOTO WaitHere1 ' ************************* ' Instructions ' ************************* Instructions: CLS GOSUB DrawStars LINE (30, 30)-(610, 450), 14, B PAINT (300, 300), 3, 14 SLEEP GOTO EntryPoint1 ' ************************* ' Splash Screen ' ************************* Splash: CIRCLE (320, 240), 7, 6 PAINT (320, 240), 8, 6 CIRCLE (320, 240), 3, 5 PAINT (320, 240), 5, 5 GET (313, 233)-(327, 247), RoundThing CLS RETURN DATA 25,160, 10,120,161,320, 10,120,321,480, 10,120,481,630, 10,120 DATA 25,160,121,240,161,320,121,240,321,480,121,240,481,630,121,240 DATA 25,160,241,360,161,320,241,360,321,480,241,360,481,630,241,360 DATA 25,160,361,436,161,320,361,436,321,480,361,436,481,630,361,436