REM Subroutines: REM Line 50 -> WANT INSTRUCTIONS? (Y/N) REM Line 100 -> PRINT INSTRUCTIONS REM Line 200 -> SET UP GAME REM Line 220 -> INIT PLAYFIELD REM Line 500 -> PRINT MAZE PATTERN REM Line 600 -> MAKE MOVE REM Line 800 -> RESULT CALCULATION REM Line 1400 -> PLAYER QUIT (Pressed 0) REM Line 1500 -> PLAYER HIT FENCE REM Line 1600 -> ROBOT HIT PLAYER REM Line 1700 -> PLAYER WIN, NEW GAME? REM Line 2000 -> END. 10 REM CHASE AS MODIFIED TO RUN ON SWTP 6800 20 REM WITH 4K BASIC BY HERMAN DEMONSTOY 10-16-76 REM Comments by ~vidak, 2021-08-20 49 REM DOES USER WANT INSTRUCTIONS? 50 PRINT "THIS IS THE GAME OF CHASE" 60 PRINT "WANT INSTRUCTIONS (1=YES. 0=NO)"; 70 INPUT Y 80 IF Y = 0 GOTO 200 REM Go to set up game. 90 IF Y <> 1 GOTO 60 REM Repeat request for instructions. 99 REM If Y = 1, fall through to here. 100 PRINT "YOU ARE IN A HIGH VOLTAGE MAZE WITH 5" 110 PRINT "SECURITY MACHINES '+' TRYING TO DESTROY YOU" 120 PRINT "YOU MUST MANEUVER THE SECURITY MACHINES INTO" 130 PRINT "THE MAZE 'X' TO SURVIVE. GOOD LUCK" 140 PRINT "MOVES ARE: 7,8,9" 150 PRINT " 4,*,6 '5' IS NO MOVE" 160 PRINT " 1,2,3 '0' TO END THE GAME" 170 PRINT 199 REM SET UP GAME. 200 DIM A(10,20), E(21), F(21) REM ** A is array of playfield state symbols ** REM ** B is temp integer for object y values ** REM ** C is temp integer for object x values ** REM ** D is temp integer for looping ** REM ** E is array of y coords of playfield objects ** REM ** F is array of x coords of playfield objects ** REM ** G is integer which counts dead robots ** 210 G=0 REM Below, we initialise the playfield. 220 FOR B = 1 TO 10 230 FOR C = 1 TO 20 240 LET A(B,C) = 0 REM Make every playfield space blank. 250 IF B = 1 THEN A(B,C) = 1 REM Top border is all fences. 260 IF B = 10 THEN A(B,C) = 1 REM Bottom border is all fences. 270 IF C = 1 THEN A(B,C) = 1 REM Left border, all fences. 280 IF C = 20 THEN A(B,C) = 1 REM Right border, all fences. 290 NEXT C 300 NEXT B 310 FOR D = 1 TO 21 REM A list: 5 robots, 1 player, 15 electric fences REM RNG 20 times. 320 LET B = INT(RND(0) * 8) + 2 REM I assume, here, RNG between 2 and 10. 330 LET C = INT(RND(0) * 18) + 2 REM Again, RNG between 2 and 20. REM ** The above statements work like this: REM ** INT(RND(0) * X ) + Y -> generate some random integer between [Y, X + 1) REM ** -> where the integer is equivalent to [Y, X] REM ** -> Note about notation: [, or ] stand for inclusive REM ** -> (, or ) stand for exclusive 340 IF A(B,C) <> 0 GOTO 320 REM IF ARRAY IS MAZE BORDER, RNG AGAIN 350 A(B,C) = 1 REM OTHERWISE ARRAY ELEMENT IS ELECTRIC FENCE 360 IF D < 6 THEN A(B,C) = 2 REM FIRST 5 TIMES THROUGH D, ARRAY ELEMENT IS ROBOT 370 IF D = 6 THEN A(B,C) = 3 REM OTHERWISE ASSIGN ELEMENT AS PLAYER 380 E(D) = B REM STORE PLAYFIELD OBJECT Y VALUE 390 F(D) = C REM STORE PLAYFIELD OBJECT X VALUE 400 NEXT D 499 REM PRINT MAZE PATTERN 500 FOR B = 1 TO 10 510 FOR C = 1 TO 20 520 IF A(B,C) = 0 PRINT " "; REM SEMICOLON INDICATES PRINT WITHOUT NEW LINE 530 IF A(B,C) = 1 PRINT "X"; 540 IF A(B,C) = 2 PRINT "+"; 550 IF A(B,C) = 3 PRINT "*"; 560 NEXT C 570 PRINT REM NEW LINE 580 NEXT B 599 REM MAKE MOVE 600 B = E(6) REM I ASSUME: PUT (PLAYER Y VALUE) E(6) IN B. 610 C = F(6) REM I ASSUME: PUT (PLAYER X VALUE) F(6) IN C. 620 A(B,C) = 0 REM SET PLAYER PLAYFIELD ARRAY ELEMENT TO A BLANK. 630 INPUT Y REM HERE WE ASK THE USER TO INPUT A MOVEMENT COMMAND 640 IF Y = 5 GOTO 800 REM NO MOVEMENT; SKIP TO RESULTS CALCULATION 645 IF Y = 0 THEN GOTO 1400 REM QUIT GAME; *ON* STATEMENT DOES NOT INDEX FROM ZERO. (: REM ** OLD CODE ** REM REM 650 ON Y GOTO 660, 660, 660, 690, 680, 680, 680, 690, 1400 REM ** ORIGINAL LINE 650 KEYMAP ** REM ON OLD Y -> 0 1, 2, 3, 4, 5, 6, 7, 8, 9. REM ON NEW Y -> 5, 7, 8, 9, 6, 3, 2, 1, 4, 0. REM GOTO -> N/A, 660, 660, 660, 690, 680, 680, 680, 690, 1400. REM ** NEW LINE 650 KEYMAP REORGANISED ** REM NEW Y -> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. REM GOTO -> 1400, 680, 680, 680, 690, N/A, 690, 660, 660, 660. REM ** OLD CODE ** REM REM 690 ON Y GOTO 700, 800, 720, 720, 720, 800, 700, 700 REM ** ORIGINAL LINE 690 KEYMAP ** REM ON OLD Y -> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. REM GOTO -> N/A, 700, 800, 720, 720, 720, 800, 700, 700, FALL-THRU. REM ON NEW Y -> 5, 7, 8, 9, 6, 3, 2, 1, 4, 0. REM ** NEW LINE 650 KEYMAP REORGANISED ** REM NEW Y -> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. REM GOTO -> FALL-THRU, 700, 800, 720, 700, N/A, 720, 700, 800, 720. REM KEYPAD: REM 7,8,9 REM 4,*,6 REM 1,2,3 650 ON Y GOTO 680, 680, 680, 690, 800, 690, 660, 660, 660 REM NOTE: Y VALUE OF 5 REPEATED. REM Y VALUES {7, 8, 9} PASS TO HERE (LINE 660) 660 B = B - 1 REM SUBTRACT 1 FROM PLAYER Y COORDS (UP 1 ROW) 670 GOTO 690 REM NEW Y VALUES {1, 2, 3} PASS HERE (LINE 680) 680 B = B + 1 REM ADD 1 TO PLAYER X COORDS (DOWN 1 ROW) REM Y VALUES {4, 6} AND {7, 8, 9} PASS HERE REM Y VALUES {1, 2, 3} FALL-THRU HERE. (...LINE 690) 690 ON Y GOTO 700, 700, 720, 720, 800, 720, 700, 800, 720 REM NOTE: Y VALUE OF 5 REPEATED. REM Y VALUES {1, 4, 7} PASS HERE (700) 700 C = C - 1 REM SUBTRACT 1 FROM PLAYER X COORDS (LEFT 1 COLUMN) 710 GOTO 800 REM CHECK IF PLAYER HAS TOUCHED FENCE REM Y VALUES {3, 6, 9} PASS HERE. 720 C = C + 1 REM ADD 1 TO PLAYER X COORDS (RIGHT 1 COLUMN) 799 REM RESULT CALCULATION REM Y VALUES {2, 8} PASSES HERE. (SKIP X COORD MANIPULATION) 800 IF A(B,C) = 1 GOTO 1500 REM Player has touched fence 810 IF A(B,C) = 2 GOTO 1600 REM Player has touched security machine robot. REM SET PLAYFIELD CELL BACK TO PLAYER. 820 A(B,C) = 3 REM SET NEW PLAYER X AND Y COORDS 830 E(6) = B REM NEW Y COORDS 840 F(6) = C REM NEW X COORDS 850 FOR D = 1 TO 5 REM Below, if any of these cells indicated by the first REM 5 in the E,F lists is not a robot, then next D. 860 IF A(E(D),F(D)) <> 2 GOTO 960 870 A(E(D),F(D)) = 0 REM Set robot in playfield state array to a blank. REM Below, we make robot x,y coords one unit closer to player. 880 IF E(D) < B THEN E(D) = E(D) + 1 890 IF E(D) > B THEN E(D) = E(D) - 1 900 IF F(D) < C THEN F(D) = F(D) + 1 910 IF F(D) > C THEN F(D) = F(D) - 1 REM Below, we test to see if new robot coords coincide REM with player coords. if so, then player destroyed. 920 IF A(E(D),F(D)) = 3 GOTO 1600 REM Below, if new robot coords do not coincide with a space, REM then it has hit an electric fence. Increment robot dead REM counter (G) by 1. 930 IF A(E(D),F(D)) <> 0 THEN G = G + 1 REM BELOW, IF NEW ROBOT COORDS ARE A BLANK, THEN SET THAT PLAYFIELD REM ARRAY ELEMENT TO A ROBOT. 940 IF A(E(D),F(D)) = 0 THEN A(E(D),F(D)) = 2 REM Below (line 950), if G, the robot dead counter, equals 5, then REM player has won, enter new game state. 950 IF G = 5 GOTO 1700 960 NEXT D REM Here we are falling through from subroutine RESULT CALULATION. REM In this game, the maze is not automatically printed. REM It is only printed if the player says yes (1). 970 PRINT "WANT MAP? (1 OR 0)"; 980 INPUT Y 990 IF Y = 1 GOTO 500 REM Jump back to PRINT MAZE PATTERN. 995 GOTO 600 REM Else, jump back to MAKE MOVE. REM From subroutine MAKE MOVE: Player has pressed 0, REM the input for quitting the game. 1400 PRINT "SORRY TO SEE YOU QUIT" GOTO 1710 REM From subroutine RESULT CALCULATION. REM Player has walked into a fence. 1500 PRINT "YOU TOUCHED THE FENCE!" GOTO 1710 REM From subroutine RESULT CALCULATION. REM Robot has walked into a player. 1600 PRINT "** YOU HAVE BEEN DESTROYED BY A LUCKY COMPUTER **" GOTO 1710 REM From subroutine RESULT CALCULATION. REM Game win state. REM Player has destroyed all the robots. 1700 PRINT "YOU ARE LUCKY ** YOU DESTROYED ALL THE ENEMIES **" 1710 PRINT "WANT TO PLAY AGAIN? (1 = YES, 0 = NO)"; 1720 INPUT Y 1730 IF Y = 1 GOTO 210 1740 PRINT "HOPE YOU DON'T FEEL FENCED IN." 1750 PRINT "TRY AGAIN SOMETIME!" 2000 END