Here is a complete implementation of 'space invaders. Even though it is written in BASIC, and uses MODE 7 graphics, you'll be amazed to see how faithful it is to the arcade original.
Full instructions are included in the game, which was written by Mark Bucknell. There are a number of options you can triger, such as 'freeze/unfreeze' and turning the sound on or off. The SHIFT key is used to fire.
10 REM **** Cosmic invaders **** 20 REM **** by **** 30 REM **** M.N.Buckwell **** 40 REM **** (C) 1984 **** 50 DIM Scores%(9),Names$(9),Space%(7, 5),Bombs%(10,1),Alien0$(1),Alien1$(1),Al ien2$(1), Ch% 3 60 MODE 7:ON ERROR GOTO 3240 70 VDU 23,1,0;0;0;0; 80 ENVELOPE 1,129,0,0,0,100,0,0,127,- 2,0,-1,126,120 90 ENVELOPE 2,1,1,0,0,200,1,0,126,-10 0,0,-126,126,126 100 ENVELOPE 3,1,-16,-8,-4,5,10,20,70, 0,0,-63,70,63 110 REM *** COLOUR CHARACTERS *** 120 L$=CHR$(141):R$=CHR$(129):G$=CHR$( 130) 130 Y$=CHR$(131):B$=CHR$(132):M$=CHR$( 133) 140 C$=CHR$(134):FL$=CHR$(136):ST$=CHR $(137) 150 REM *** SPECIAL CHARACTERS *** 160 BL$=CHR$(255):REM Block 170 B$=CHR$(8) :REM Cursor Back 180 F$=CHR$(9) :REM Cursor Forward 190 D$=CHR$(10) :REM Cursor Down 200 U$=CHR$(11) :REM Cursor Up 210 REM *** GRAPHIC COLOUR CHAR'S *** 220 GR$=CHR$(145):GG$=CHR$(146):GY$=CH R$(147):GC$=CHR$(150) 230 REM **** Space Invader A ***** 240 Alien0$(0)=">"+BL$+"m "+D$+B$+B$+B $+B$+"k/7 "+D$+B$+B$+B$+B$+"! "" " 250 Alien0$(1)=">"+BL$+"m "+D$+B$+B$+B $+B$+"k/7 "+D$+B$+B$+B$+B$+" [ch163] " 260 REM **** Space Invader B **** 270 Alien1$(0)="ypv "+D$+B$+B$+B$+B$+" m"+BL$+"> "+D$+B$+B$+B$+B$+"! "" " 280 Alien1$(1)="ypv "+D$+B$+B$+B$+B$+" m"+BL$+"> "+D$+B$+B$+B$+B$+" [ch163] " 290 REM **** Space Invader C **** 300 Alien2$(0)="ypv "+D$+B$+B$+B$+B$+" m/> "+D$+B$+B$+B$+B$+"! "" " 310 Alien2$(1)="ypv "+D$+B$+B$+B$+B$+" m/> "+D$+B$+B$+B$+B$+" [ch163] " 320 REM **** Blank Invader **** 330 Blank1$="[spc4]"+D$+B$+B$+B$+B$+"[ spc4]"+D$+B$+B$+B$+B$+"[spc4]" 340 Blank2$="[spc5]"+D$+B$+B$+B$+B$+B$ +"[spc5]"+D$+B$+B$+B$+B$+B$+"[spc5]" 350 REM **** Blank Invader Side **** 360 Blank_Line$=F$+F$+F$+" "+D$+B$+" " +D$+B$+" " 370 REM **** Your Base **** 380 Base$=" p^p " 390 REM **** Sheild **** 400 Sheild$=BL$+BL$+BL$+D$+B$+B$+B$+BL $+BL$+BL$+D$+B$+B$+B$+BL$+BL$+BL$ 410 REM **** Mystery **** 420 Mystery$=" ns=" 430 PROC_Initialize 440 REM Main Program 450 REPEAT:finish=FALSE 460 PROC_Title:PROC_Time_key 470 IF A$=" " GOTO 510 480 IF A$="Q" OR A$="q" GOTO 540 490 PROC_Scores:PROC_Time_key 500 IF A$="Q" OR A$="q" GOTO 540 510 IF A$=" " THEN PROC_Play 520 PROC_High_Scores:PROC_Time_key 530 IF A$=" " GOTO 510 540 UNTIL A$="Q" OR A$="q" 550 CLS:END 560 DEF PROC_Title:CLS 570 PRINTL$;Y$"[spc10]Cosmic Invaders" 580 PRINTL$;G$"[spc10]Cosmic Invaders" 590 PRINT'R$"Instructions for use :-" 600 PRINTC$"[spc5]The object of the ga me is to" 610 PRINTC$"shoot the cosmic aliens fr om the sky to"; 620 PRINTC$"save the world." 630 PRINTM$"Press the following keys f or use :-" 640 PRINT'"[spc5]Z - To move left" 650 PRINT'"[spc5]X - To move right" 660 PRINT'"[spc5]SHIFT - To fire" 670 PRINT'"[spc5]ESCAPE - To exit from game" 680 PRINT'"[spc5]F/U - Freeze/Un-Freez e" 690 PRINT'Y$"Option :-" 700 PRINT'"[spc5]S/O - Sound on/off" 710 PRINT'G$"Press"FL$M$"Space"ST$G$"t o start or 'Q' to quit" 720 ENDPROC 730 DEF PROC_Play 740 Score%=0:Base%=3 750 Start%=0 760 REPEAT:PROC_Setup_game 770 REPEAT:PROC_Key_Test:PROC_Update _Invaders:IF NOT finish THEN PROC_Bombs 780 UNTIL finish=TRUE:Start%=Start%+ 1 790 UNTIL P%<>7:Base%=Base%-1 800 IF Score%>Scores%(9) THEN PROC_Sco re 810 ENDPROC 820 DEF PROC_Bombs 830 LOCAL D%:IF Bomb%<MBomb% THEN PROC _New_Bomb 840 IF Bomb%=0 GOTO 910 850 FOR D%=1 TO MBomb% 860 IF Bombs%(D%,1)<>0 THEN PROC_Loo k_Bomb 870 NEXT 880 FOR D%=1 TO MBomb% 890 IF Bombs%(D%,1)=23 THEN PRINTTAB (BBombs%(D%,0),Bombs%(D%,1));" ";:Bombs% (D%,1)=0:Bombs%=Bombs%-1 900 NEXT 910 ENDPROC 920 DEF PROC_Look_Bomb 930 PRINTTAB(Bombs%(D%,0),Bombs%(D%,1) +1); 940 IF (FN_Find_Char<>32) AND ((Bombs% (D%,1)+1>Y%+(R%+1)*3) OR (Bombs%(D%,0)<X %) OR (Bombs%(D%,0)>=X%+(P%-O%+1)*4)) TH EN PROC_Bomb_Hit ELSE PROC_Move_Bomb 950 ENDPROC 960 DEF PROC_Bomb_Hit 970 Bomb%=Bomb%-1 980 IF Bombs%(D%,1)+1=23 THEN PROC_Bom b_Hit_Base :GOTO1040 990 PRINTTAB(Bombs%(D%,0),Bombs%(D%,1) +1);:C%=FN_Find_Char 1000 IF C%=ASC(BL$) THEN PRINT"|";:GOTO 1040 1010 IF C%=ASC("|") THEN PRINT"p";:GOTO 1040 1020 IF C%=ASC("p") THEN PRINT" ";:GOTO 1040 1030 PRINT" "; 1040 PRINTTAB(Bombs%(D%,0),Bombs%(D%,1) );" ";:Bombs%(D%,1)=0 1050 ENDPROC 1060 DEF PROC_Bomb_Hit_Base 1070 SOUND &13,-10,6,10 1080 PRINTTAB(B%+1,23);"[spc3]"; 1090 B%=1 1100 Base%=Base%-1 1110 PRINTTAB(0,24);STRING$(20," "); 1120 IF Base%=0 THEN finish=TRUE ELSE P ROC_Display_Base:PROC_Info_line 1130 FOR I%=1 TO 10000:NEXT 1140 ENDPROC 1150 DEF PROC_Move_Bomb 1160 PRINTTAB(Bombs%(D%,0),Bombs%(D%,1) );" "; 1170 Bombs%(D%,1)=Bombs%(D%,1)+1 1180 IF Bombs%(D%,1)=23 THEN Bombs%(D%, 1)=0:Bomb%=Bomb%-1:GOTO 1200 1190 PRINTTAB(Bombs%(D%,0),Bombs%(D%,1) );"#"; 1200 ENDPROC 1210 DEF PROC_New_Bomb 1220 D%=-1:REPEAT:D%=D%+1:UNTIL Bombs%( D%,1)=0 OR D%=MBomb% 1230 REPEAT:T%=RND(P%-O%)+O%:UNTIL Spac e%(T%,5) 1240 J%=5:REPEAT:J%=J%-1:UNTIL Space%(T %,J%)=TRUE 1250 Bombs%(D%,0)=X%+(T%-O%)*4+1:Bombs% (D%,1)=Y%+(J%)*3+2:Bomb%=Bomb%+1 1260 ENDPROC 1270 DEF PROC_Score 1280 CLS:S%=10:REPEAT:S%=S%-1:UNTIL Sco re%<=Scores%(S%) OR S%=0 1290 IF S%=8 THEN GOTO 1310 1300 FOR I%=S%+1 TO 8:Scores%(I%+1)=Sco res%(I%):Names$(I%+1)=Names$(I%):NEXT 1310 Scores%(S%+1)=Score% 1320 PRINT'''G$" You are at number ";S% +2;" in the top 10"''''M$"Enter your nam e"C$; 1330 INPUT Name$:IF LEN(Name$)>15 THEN Name$=LEFT$(Name$,15) 1340 Name$(S%+1)=Name$ 1350 ENDPROC 1360 DEF PROC_Key_Test 1370 IF INKEY(-98) AND NOT INKEY(-67) T HEN PROC_Move_Left 1380 IF INKEY(-67) AND NOT INKEY(-98) T HEN PROC_Move_Right 1390 IF INKEY(-1) AND NOT Missile% THEN PROC_Fire 1400 IF INKEY(-68) THEN REPEAT UNTIL IN KEY(-54) 1410 *FX 15 1 1420 ENDPROC 1430 DEF PROC_Start_Mystery 1440 MystX%=1:Mystery%=TRUE 1450 PRINTTAB(MystX%,1);Mystery$; 1460 ENDPROC 1470 DEF PROC_Move_Mystery 1480 SOUND &13,3,20,5 1490 MystX%=MystX%+1 1500 PRINTTAB(MystX%,1);Mystery$; 1510 IF MystX% = 35 THEN Mystery%=FALSE :PRINTTAB(MystX%,1);"[spc4]"; 1520 ENDPROC 1530 DEF PROC_Fire 1540 SOUND &0012,2,0,10:Missile%=TRUE:M issileX%=B%+2:MissileY%=22:PROC_Move_Mis sile(L%) 1550 ENDPROC 1560 DEF PROC_Move_Missile(L%) 1570 LOCAL I%,K% 1580 PRINTTAB(MissileX%,MissileY%); 1590 IF FN_Find_Char <> 32 THEN PROC_Hi t:GOTO 1650 1600 PRINTTAB(MissileX%,MissileY%+1); 1610 IF MissileY%+1 <> 23 THEN PRINT" " 1620 PRINTTAB(MissileX%,MissileY%); 1630 IF MissileY%<>1 THEN PRINT"^" 1640 IF MissileY%>1 THEN MissileY%=Miss ileY%-1 ELSE Missile%=FALSE 1650 ENDPROC 1660 DEF PROC_Hit 1670 SOUND &0010,-15,6,5:IF MissileY% < 22 THEN PRINTTAB(MissileX%,MissileY%+1) ;" " 1680 PRINTTAB(MissileX%,MissileY%);:C%= FN_Find_Char 1690 IF (MissileY%+1<=Y%+(R%+1)*3) AND (MissileX%>=X%) AND (MissileX%<X%+(P%-O% +1)*4) THEN PROC_Invader_Hit(L%):GOTO172 0 1700 IF MissileY%=1 THEN PROC_Mystery_H it:GOTO 1740 1710 PROC_Base_Hit 1720 I%=7 1730 IF NOT FN_Is_Line THEN finish=TRUE 1740 ENDPROC 1750 DEF PROC_Mystery_Hit 1760 PRINTTAB(MystX%,1);"[spc5]"; 1770 Score%=Score%+RND(30)*10 1780 PROC_Info_line 1790 ENDPROC 1800 DEF PROC_Base_Hit 1810 IF C%=ASC(BL$) THEN PRINT"/";:GOTO 1840 1820 IF C%=ASC("/") THEN PRINT"[ch163]" ;:GOTO 1840 1830 PRINT" "; 1840 Missile%=FALSE 1850 ENDPROC 1860 DEF PROC_Invader_Hit(L%) 1870 LOCAL I%,K% 1880 IF Left% THEN G%=-1 ELSE G%=1 1890 IF MissileX% > X%+(L%-O%+1)*4 THEN I%=(MissileX%-X%+(O%*4)+G%)DIV4 ELSE I% =(MissileX%-X%+O%*4)DIV4 1900 K%=(MissileY%-Y%) DIV 3:Space%(I%, K%)=FALSE:J%=(I%-O%)*4:PROC_Blank(J%) 1910 IF NOT FN_Is_Line THEN Space%(I%,5 )=FALSE:PROC_Boundary_Update 1920 K%=(MissileY%-Y%) DIV 3 1930 IF NOT FN_Is_Row THEN Space%(7,K%) =FALSE:PROC_Boundary_Update 1940 Missile%=FALSE:Score%=Score%+((3-( (MissileY%-Y%)DIV3)DIV2)*20):PROC_Info_l ine 1950 ENDPROC 1960 DEF PROC_Boundary_Update 1970 S%=O%:PROC_X_Boundary_Update:PROC_ Y_Boundary_Update:X%=X%+(O%-S%)*4 1980 ENDPROC 1990 DEF PROC_X_Boundary_Update 2000 IF Space%(O%,5) GOTO 2020 2010 REPEAT:O%=O%+1:UNTIL Space%(O%,5) 2020 IF P%=7 GOTO 2060 2030 IF Space%(P%,5) GOTO 2060 2040 REPEAT:P%=P%-1:IF P%<0 THEN finish =TRUE:P%=7 2050 UNTIL Space%(P%,5) 2060 ENDPROC 2070 DEF PROC_Y_Boundary_Update 2080 IF Space%(7,Q%) GOTO 2100 2090 REPEAT:Q%=Q%+1:UNTIL Space%(7,Q%) 2100 IF R%=5 GOTO 2140 2110 IF Space%(7,R%) GOTO 2140 2120 REPEAT:R%=R%-1:IF R%<0 THEN finish =TRUE:R%=5 2130 UNTIL Space%(7,R%) 2140 ENDPROC 2150 DEF PROC_Move_Left 2160 IF B%>1 THEN B%=B%-1 2170 PROC_Display_Base 2180 ENDPROC 2190 DEF PROC_Move_Right 2200 IF B%<34 THEN B%=B%+1 2210 PROC_Display_Base 2220 ENDPROC 2230 DEF PROC_Setup_game 2240 CLS 2250 O%=0:P%=6:Q%=0:R%=4:B%=1:Bomb%=0:M Bomb%=Start%+6:FOR I%=0 TO 10:Bombs%(I%, 1)=0:NEXT 2260 Mystery%=FALSE:Missile%=FALSE:Miss ileX%=0:MissileY%=0:finish=FALSE:VDU 23, 1,0;0;0;0; 2270 PROC_Info_line:PROC_Colour_setup:P ROC_Invader_setup:PROC_Display_Sheilds:P ROC_Display_Invaders:PROC_Display_Base 2280 ENDPROC 2290 DEF PROC_Display_Base 2300 PRINTTAB(B%,23);Base$ 2310 ENDPROC 2320 DEF PROC_Display_Sheilds 2330 FOR I%= 0 TO 3:PRINTTAB(5+I%*9,20) ;Sheild$:NEXT 2340 ENDPROC 2350 DEF PROC_Invader_setup 2360 FOR I%= 0 TO 7:FOR J%= 0 TO 5:Spac e%(I%,J%)=TRUE:NEXT:NEXT 2370 X%=10:Y%=Start%MOD4 + 2:Left%=TRUE 2380 ENDPROC 2390 DEF PROC_Display_Invaders 2400 SOUND 1,-15,1,1:I%=O%:M%=ABS((X%+I %*4)MOD 2) 2410 REPEAT:PROC_Key_Test:J%=(I%-O%)*4 2420 FOR K%= Q% TO R%:IF Space%(I%,K% ) THEN PROC_Invader ELSE PROC_Blank(J%) 2430 NEXT 2440 IF Missile% THEN PROC_Move_Missi le(I%) 2450 IF Mystery% THEN PROC_Move_Myste ry ELSE IF RND(100)=1 THEN PROC_Start_My stery 2460 I%=I%+1:UNTIL I%>P% OR finish=TRUE 2470 ENDPROC 2480 DEF PROC_Update_Invaders 2490 IF Left% THEN X%=X%-1 ELSE X%=X%+1 2500 IF NOT Left% THEN PRINTTAB(X%-1,Y% +Q%*3);STRING$((R%-Q%+1)*3," "+D$+B$); 2510 PROC_Display_Invaders 2520 IF X%<=1 THEN Left%=FALSE:PROC_Mov e_Down 2530 IF X%+(P%-O%+1)*4>=39 THEN Left%=T RUE:PROC_Move_Down 2540 ENDPROC 2550 DEF PROC_Move_Down 2560 PRINTTAB(X%,Y%+Q%*3);STRING$((P%-O %+1)*4," ");:Y%=Y%+1:IF Y%-(4-R%)*3=9THE N finish=TRUE 2570 ENDPROC 2580 DEF FN_Is_Line 2590 L%=0:FOR K%=0 TO 4:IF NOT Space%(I %,K%) THEN L%=L%+1 2600 NEXT:IF L%= 5 THEN =FALSE ELSE =TR UE 2610 DEF FN_Is_Row 2620 L%=0:FOR I%=0 TO 6:IF NOT Space%(I %,K%) THEN L%=L%+1 2630 NEXT:IF L%= 7 THEN =FALSE ELSE =TR UE 2640 DEF PROC_Invader 2650 PRINTTAB(X%+J%,Y%+K%*3); 2660 ON K%+1 GOTO 2670,2670,2680,2680,2 690,2700 2670 PRINT Alien2$(M%):GOTO 2710 2680 PRINT Alien1$(M%):GOTO 2710 2690 PRINT Alien0$(M%):GOTO 2710 2700 finish=TRUE 2710 ENDPROC 2720 DEF PROC_Blank(J%) 2730 IF NOT Left% THEN J%=J%-1 2740 PRINTTAB(X%+J%,Y%+K%*3);:IF Left% THEN PRINTBlank1$ ELSEPRINTBlank2$ 2750 ENDPROC 2760 DEF PROC_Colour_setup 2770 PRINTTAB(0,1);GR$; 2780 FOR I%= 2 TO 7:PRINTTAB(0,I%);GC$; TAB(0,I%+6);GR$;TAB(0,I%+12);GY$;:NEXT 2790 FOR I%= 0 TO 2:PRINTTAB(0,I%+20);G G$;:NEXT:PRINT'GR$; 2800 ENDPROC 2810 DEF PROC_Info_line 2820 PRINTTAB(0,0)G$"HS"M$;Scores%(0); 2830 PRINTTAB(20,0)G$"Score"M$;Score%; 2840 PRINTTAB(0,24);CHR$(150); 2850 FOR I%= 1 TO Base%:PRINTBase$;:NEX T 2860 ENDPROC 2870 DEF PROC_Scores 2880 CLS 2890 PRINTCHR$(141)CHR$(130)"[spc3]Scor es given :-" 2900 PRINTCHR$(141)CHR$(130)"[spc3]Scor es given :-" 2910 FOR I%= 4 TO 24:PRINT TAB(0,I%);CH R$(150);:NEXT 2920 PRINTTAB(5,6);Mystery$;TAB(20,6);C HR$(133);"????"; 2930 PRINTTAB(6,10);Alien2$(0);TAB(20,1 1);CHR$(133);"60" 2940 PRINTTAB(6,15);Alien1$(0);TAB(20,1 6);CHR$(133);"40" 2950 PRINTTAB(6,20);Alien0$(0);TAB(20,2 1);CHR$(133);"20" 2960 ENDPROC 2970 DEF PROC_High_Scores 2980 CLS 2990 PRINTCHR$(141)CHR$(130)"[spc10]Hig h Scores" 3000 PRINTCHR$(141)CHR$(130)"[spc10]Hig h Scores" 3010 FOR I%= 0 TO 9 3020 PRINT'CHR$(134);I%+1;TAB(4);Name $(I%);TAB(30);Scores%(I%) 3030 NEXT 3040 ENDPROC 3050 DEF PROC_Initialize 3060 *FX210 0 3070 FOR I%= 0 TO 9 3080 Names$(I%)="Mark beat you !!!" 3090 Scores%(I%)=10000-(I%*1000) 3100 NEXT 3110 ENDPROC 3120 DEF PROC_Time_key 3130 TIME=0 3140 REPEAT 3150 A$=INKEY$(0) 3160 IF A$="s" OR A$="S" THEN *FX 210 0 3170 IF A$="o" OR A$="O" THEN *FX 210 1 3180 UNTIL A$="Q" OR A$="q" OR A$=" " OR TIME = 1000 3190 ENDPROC 3200 DEF FN_Find_Char 3210 A%=&87 3220 !Ch%=USR(&FFF4) 3230 = Ch%?1 3240 REM **** Error Routine **** 3250 IF ERR = 17 GOTO 440 3260 REPORT:PRINT" in line ";ERL 3270 END
Cosmos
In this exciting game you are flying over a moving landscape which produces a very good 3-D effect. You have to try and shoot as many alien birds as possible within a limited time. Full instructions are within the game.
You move your sights around the galaxy until you spot one of the birds. The birds will try to evade your lethal weaponry.
10 REM COSMOS 30 MODE 7 40 PROC_INSTR 50 MODE 2 60 PROC_INIT 70 REPEAT 80 PROC_NEWGAME 90 PROC_PLAY 100 UNTIL NOT FN_ANOTHER 110 MODE 7 120 END 130 DEF PROC_INIT 140 VDU 23,0,10,32,0;0;0; 150 VDU 23,128,&31,&4B,&85,&87,&06,&03 ,&04,&08 160 VDU 23,129,&BC,&D2,&A1,&E1,&60,&C0 ,&20,&10 170 ENVELOPE 1,1,-16,-8,-4,5,10,20,126 ,0,0,-63,126,63 180 ENVELOPE 2,1,-2,4,-2,2,2,2,126,0,0 ,-126,126,100 190 HIGH=0:H$="" 200 FOR W%=0 TO 15 210 VDU 19,W%+(W%=7),0,0,0; 220 NEXT 230 VDU 19,7,2,0,0,0 240 COLOUR 1:W%=14 250 ENDPROC 260 DEF PROC_ALTCOLS 270 SOUND &13,-10,3,10 280 *FX 19 290 VDU 19,W%,4,0,0; 300 W%=W%-1:IF W%<0 THEN W%=14 310 IF W%=7 THEN W%=6 320 VDU 19,W%,6,0,0; 330 ENDPROC 340 DEF PROC_LANSCAPE 350 COLOUR 7:COLOUR 143:CLS 360 PROC_SHIP 370 PRINT TAB(0,0);"Energy 1000 Hits 0 " 380 offset1=128:C%=14 390 MOVE 0,512:DRAW 1279,512 400 FOR col=5 TO 1 STEP -0.05 410 PROC_ALTCOLS 420 GCOL 0,128+C% 430 offset2=offset1:offset1=636/col 440 VDU 24,0;636-offset1;1279;636-of fset2;16,26 450 C%=C%-1:IF C%=7 THEN C%=6 460 IF C%=-1 THEN C%=14 470 NEXT 480 GCOL 3,8 490 MOVE 640,508:MOVE 500,4:PLOT 85,78 0,4 500 PROC_SHIP 510 GCOL 3,8 520 ENDPROC 530 DEF PROC_SHIP 540 GCOL 0,7:GCOL 0,135 550 MOVE 0,50:MOVE 0,0:PLOT 85,100,100 560 MOVE 1279,50:MOVE 1279,0:PLOT 85,1 179,100 570 VDU 24,0;0;1279;26;16,26 580 PX%=9:PY%=13 590 PROC_SIGHT 600 ENDPROC 610 DEF PROC_NEWGAME 620 E%=1000:H%=0:B%=0 630 PX%=9:PY%=13:SX%=PX%:SY%=PY% 640 BX%=RND(30)-5:BY%=RND(5) 650 GCOL 4,0 660 PROC_LANSCAPE 670 PRINT TAB(0,10);"Press RETURN to p lay" 680 *FX15 690 REPEAT UNTIL GET=13 700 REPEAT UNTIL NOT INKEY(-74) 710 PRINT TAB(0,10);SPC(20) 720 ENDPROC 730 DEF PROC_FIRE 740 VDU 19,15,4,0,0; 750 TX%=64*(SX%+1):TY%=1007-(32*SY%) 760 MOVE 100,100:DRAW TX%,TY%:DRAW 117 9,100 770 SOUND &11,1,20,5 780 MOVE 100,100:DRAW TX%,TY%:DRAW 117 9,100 790 VDU 19,15,0;0; 800 E%=E%-5 810 IF SX%=BX% AND SY%=BY% THEN PROC_H IT 820 PRINT TAB(7,0);E%;" "; 830 ENDPROC 840 DEF PROC_HIT 850 VDU 19,15,1,0,0,0 860 SOUND &12,2,2,5 870 PROC_SIGHT 880 VDU 19,15,0;0; 890 H%=H%+1:B%=B%+1 900 IF B%=10 THEN B%=0:E%=E%+100 910 PRINT TAB(17,0);H% 920 BX%=RND(30):BY%=-RND(5) 930 ENDPROC 940 DEF PROC_BOMB 950 MOVE BX%*64+64,1000-(BY%*32):DRAW6 40,512 960 VDU 23,0,13,1,0;0;0; 970 SOUND &12,1,20,5 980 MOVE BX%*64+64,1000-(BY%*32):DRAW6 40,512 990 E%=E%-10 1000 PRINT TAB(7,0);E%;" " 1010 VDU 23,0,13,0,0;0;0; 1020 ENDPROC 1030 DEF PROC_SIGHT 1040 PRINT TAB(PX%,PY%); 1050 IF PY%=15 THEN PRINT"__" ELSE PRIN T" " 1060 PRINT TAB(SX%,SY%);"[]" 1070 PX%=SX%:PY%=SY% 1080 ENDPROC 1090 DEF PROC_BIRD 1100 IF BX%<0 OR BX%>18 OR BY%<1 OR BY% >15 THEN VDU 19,7,2,0,0,0:GOTO 1130 1110 IF NOT(BX%<14 AND BX%>5 AND BY%>10 AND BY%<16) THEN VDU 19,7,3,0,0,0 1120 IF BY%=15 THEN PRINT TAB(BX%,BY%); "__" ELSE PRINT TAB(BX%,BY%);" " 1130 IF ABS(BX%-SX%)<3 AND ABS(BY%-SY%) <2 THEN BX%=BX%+SGN(BX%-SX%):BY%=BY%+SGN (BY%-SY%) 1140 IF RND(3)<3 THEN BX%=BX%+(BX%>8)-( BX%<12) ELSE BX%=BX%+RND(3)-2 1150 IF RND(3)<3 THEN BY%=BY%+(BY%>12)- (BY%<15) ELSE BY%=BY%+RND(3)-2 1160 IF BY%>15 THEN BY%=15 1170 IF BX%>18 OR BX%<0 THEN ENDPROC 1180 IF BY%<1 THEN ENDPROC 1190 PRINT TAB(BX%,BY%);"[fs0][fs1]" 1200 IF BX%<14 AND BX%>5 AND BY%>10 AND BY%<16 THEN VDU 19,7,1,0,0; 1210 IF BX%<12 AND BX%>7 AND BY%>12 AND BY%<15 THEN PROC_BOMB 1220 ENDPROC 1230 DEF PROC_PLAY 1240 REPEAT 1250 PROC_ALTCOLS 1260 SX%=SX%+(INKEY(-98) AND SX%>0)-( INKEY(-67) AND SX%<18) 1270 SY%=SY%-(INKEY(-105) AND SY%<15) +(INKEY(-73) AND SY%>1) 1280 PROC_SIGHT 1290 IF INKEY(-74) PROC_FIRE ELSE PRO C_DELAY 1300 PROC_BIRD 1310 E%=E%+1 1320 PRINT TAB(7,0);E% 1330 UNTIL E%<=0 1340 *FX 15 1350 ENDPROC 1360 DEF PROC_DELAY 1370 TIME=0:REPEAT UNTIL TIME>3 1380 ENDPROC 1390 DEF PROC_INSTR 1400 PRINT TAB(12,1);CHR$141;"[fs1]C[fs 2]O[fs3]S[fs4]M[fs5]O[fs6]S" 1410 PRINT TAB(12,2);CHR$141;"[fs1]C[fs 2]O[fs3]S[fs4]M[fs5]O[fs6]S" 1420 PRINT''" [fs6]The aim of the game is to zap as many" 1430 PRINT"[fs6]bird like aliens as pos sible using as" 1440 PRINT"[fs6]little energy as possib le. The aliens" 1450 PRINT"[fs6]will try to fire at yo ur Main Energy" 1460 PRINT"[fs6]Reserves down the middl e of your Ship." 1470 PRINT"[fs6]If they succeed it will drain 10 Units" 1480 PRINT"[fs6]from your reserves. Eac h time you fire" 1490 PRINT"[fs6]it will take 5 Units of energy but the" 1500 PRINT"[fs6]energy reserves are bei ng built up all" 1510 PRINT"[fs6]the time." 1520 PRINT'"[fs1]The controls-" 1530 PRINT"[fs3]Z - left X - right" 1540 PRINT"[fs3]/ - down : - up[spc5]R ETURN - fire" 1550 PRINT'"[fs2]An extra 100 Units of energy is awarded[fs2]every 10 aliens hi t.[fs7]" 1560 PRINT'TAB(5);"[fs1]Press[fs8]SPACE BAR[fs9]to continue"; 1570 *FX 15 1580 REPEAT UNTIL GET=32 1590 ENDPROC 1600 DEF FN_ANOTHER 1610 *FX 202 32 1620 PRINT TAB(7,0);"0 " 1630 VDU 28,0,14,19,2,12 1640 PRINT" You have run outof energy a nd have hit"; 1650 PRINT ;H%;" aliens."' 1660 FOR W=1 TO 100 1670 REPEAT UNTIL INKEY(-147) 1680 NEXT 1690 IF HIGH<=H% THEN HIGH=H%:INPUT"Thi s is a high scoreso please enter yournam e :"HS$ 1700 PRINT'"High score ";H% 1710 PRINT "by ";HS$ 1720 PRINT'"Another go ?"; 1730 REPEAT KEY$=GET$ 1740 UNTIL KEY$="Y" OR KEY$="y" OR KEY$ ="N" OR KEY$="n" 1750 VDU 26,12 1760 IF KEY$="Y" OR KEY$="y" THEN =TRUE ELSE =FALSE
Meteoroids
Here's a neat little program in which you must pilot your V - Wing spacecraft through a field of asteroids. You use the 'X' and 'Z' keys to move yourself right and left. At the end of the game (when you hit an asteroid) you'll be told the number of 'light years' you have managed to traverse.
10 REM METEOROIDS 20 30 MODE 7 40 REPEAT PROC_NEWGAME 50 PROC_PLAY 60 UNTIL NOT FN_ANOTHER 70 MODE 7 80 END 90 100 DEF PROC_NEWGAME 110 VDU 23,0,10,32,0;0;0; 120 X%=20:D%=0 130 HIT=FALSE 140 CLS 150 PROC_METEORS 160 PRINT TAB(X%,0);"V" 170 PRINT TAB(10,15);"[fs1]PRESS ANY K EY TO PLAY"; 180 *FX 15 1 190 A=GET 200 PRINT TAB(10,15);SPC(22); 210 ENDPROC 220 DEF PROC_METEORS 230 PRINT TAB(0,24)'CHR$(128+RND(7)); 240 FOR A%=1 TO 4 250 PRINT TAB(RND(38),24);"*"; 260 NEXT 270 ENDPROC 280 DEF PROC_PLAY 290 REPEAT PROC_METEORS 300 X%=X%+((INKEY-98 AND X%>1)-(INKE Y-67 AND X%<38)) 310 PRINT TAB(X%,0); 320 A%=135:IF(USR(&FFF4)AND&FFFF)DIV &100<>32 THEN HIT=TRUE 330 *FX 19 340 PRINT"V"; 350 D%=D%+1 360 PROC_DELAY(D%) 370 UNTIL HIT 380 PRINT TAB(X%-4,0);"[fs8][fs1]B[fs2 ]A[fs3]N[fs4]G[fs9]" 390 ENDPROC 400 DEF PROC_DELAY(d%) 410 FOR W%=1 TO 500-d% 420 NEXT 430 ENDPROC 440 DEF FN_ANOTHER 450 PRINT''''"[fs1]YOU[fs2]TRAVELLED[f s3]";D%;"[fs7]LIGHT[fs6]YEARS" 460 PRINT''"[fs8][fs6]ANOTHER GO?[fs9] "; 470 *FX 15 1 480 REPEAT KEY$=GET$ 490 UNTIL KEY$="Y" OR KEY$="N" 500 IF KEY$="Y" THEN =TRUE ELSE =FALSE
Light Cycles
In this fast-moving game you have to ride your light cycle around the screen avoiding the computer's cycle and making sure you don't run over the trail left by either your own bike or the computer's. The aim of the game is to enclose the computer so that it cannot move. It, of course, is trying to do the same thing to you.
You control your cycle as follows:
: | to move up |
/ | to move down |
Z | to move left |
X | to move right |
10 REM LIGHT CYCLES 20 REM By Neal Cavalier-Smith. 30 MODE1 40 PROCsetup 50 PROCboard 60 REPEAT 70 PROCmove 80 UNTIL FALSE 90 DEFPROCsetup 100 F%=FALSE 110 N$="HUMANOID": REM or your name! 120 SC%=0 130 VDU19,1,4,0,0,0 140 VDU23,0,10,32,0;0;0; 150 VDU19,2,1,0,0,0 160 VDU19,3,3,0,0,0 170 VDU23,130,7,63,79,187,191,219,102, 56 180 VDU23,131,240,220,254,98,89,217,22 6,12 190 VDU23,132,60,60,126,126,60,0,0,0 200 VDU23,133,0,24,60,126,126,126,126, 60 210 DIMN(2) 220 N(1)=32 230 N(2)=-32 240 DIMC$(2,2) 250 C$(0,1)=CHR$(8)+CHR$(8)+CHR$(130)+ CHR$(131) 260 C$(1,0)=CHR$(132)+CHR$(11)+CHR$(8) +CHR$(133) 270 C$(1,2)=CHR$(132)+CHR$(10)+CHR$(8) +CHR$(133) 280 C$(2,1)=CHR$(9)+CHR$(130)+CHR$(131 ) 290 ENDPROC 300 DEFPROCboard 310 VDU 26,12,24,0;0;1279;908; 320 COLOUR129:GCOL0,0 330 CLS 340 FORX=4TO1279 STEP 181 350 MOVEX,4 360 DRAWX,904 370 MOVE4,X 380 DRAW1271,X 390 NEXT 400 COLOUR2 410 PRINTTAB(0,2);"SCORE..." 420 PRINTTAB(0,1);N$ 430 COLOUR3 440 PRINTTAB(23,1);"COMPUTER" 450 VDU5 460 S=0 470 X%=640 480 Y%=512 490 T%=640 500 U%=512 510 M%=0 520 N%=0 530 R%=32 540 S%=0 550 ENDPROC 560 DEFPROCmove 570 PROCread 580 PROCplay1 590 IFINKEY(-1)THENR%=2*R%:S%=S%*2 600 ENDPROC 610 DEFPROCcomp 620 GCOL0,3 630 IFPOINT(T%+M%,U%+N%)=-1THENPROCcal c 640 MOVET%,U% 650 T%=T%+M% 660 U%=U%+N% 670 DRAWT%,U% 680 GCOL3,2 690 MOVET%-16,U%+16 700 PRINTC$(1+SGN(M%),1+SGN(N%)) 710 MOVET%-16,U%+16 720 PRINTC$(1+SGN(M%),1+SGN(N%)) 730 ENDPROC 740 DEFPROCplay1 750 SC%=SC%+1 760 VDU 4:PRINT TAB(10,2);SC%;" ";:VD U 5 770 GCOL0,2 780 MOVEX%,Y% 790 X%=X%+R% 800 Y%=Y%+S% 810 P%=POINT(X%,Y%) 820 IFP%=-1ORP%>1THENPROCblam 830 DRAWX%,Y% 840 GCOL3,3 850 MOVEX%-16,Y%+16 860 PRINTC$(1+SGN(R%),1+SGN(S%)) 870 PROCcomp 880 PROCcalc 890 GCOL3,3 900 MOVEX%-16,Y%+16 910 PRINTC$(1+SGN(R%),1+SGN(S%)) 920 ENDPROC 930 DEFPROCcalc 940 IFPOINT(T%+M%,U%+N%)=1THENENDPROC 950 TRY%=0 960 N=N(RND(2)) 970 TRY%=TRY%+1 980 P%=POINT(T%+N,U%) 990 IFP%=-1THEN1010 1000 IFP%>1THEN1010ELSEM%=N:N%=0:ENDPRO C 1010 P%=POINT(T%,U%+N) 1020 IFP%=-1 AND TRY%<10THEN960 1030 IFP%>1THEN1040ELSEN%=N:M%=0:ENDPRO C 1040 IF TRY%<10 THEN 960 1050 F%=TRUE 1060 PROCblam 1070 ENDPROC 1080 DEFPROCread 1090 IFINKEY(-147)THENENDPROC 1100 R%=32*(INKEY(-98)-INKEY(-67)) 1110 IFINKEY(-1)THENR%=2*R% 1120 IFR%THENS%=0:ENDPROC 1130 S%=32*(INKEY(-105)-INKEY(-73)) 1140 ENDPROC 1150 DEFPROCblam 1160 CLG 1170 VDU 4 1180 PRINT TAB(0,10); 1190 IF F% THEN SOUND 0,-10,6,10 ELSE S OUND 0,-10,4,10 1200 IF F% THEN PRINT'''"You won Wretch !"'' ELSE PRINT'''"Ha Ha I beat you"'' 1210 PRINT''"Another Go?"; 1220 REPEAT K$=GET$ 1230 UNTIL K$="Y" OR K$="N" 1240 IF K$="Y" THEN RUN 1250 VDU 26,12,4 1260 END
Ghost Lane
In this game, based loosely on the popular arcade game in which you have to get a frog across a busy highway, you have to help a number of ghosts (who have wandered out of yet another popular arcade game) across four lanes of traffic.
10 REM Ghost Lane 20 30 MODE 5 40 PROC_INIT 50 REPEAT 60 PROC_NEW_GAME 70 PROC_PLAY 80 UNTIL NOT FN_ANOTHER 90 END 100 DEF PROC_INIT 110 VDU 23,0,10,32,0;0;0; 120 VDU 23,128,56,124,214,214,254,254, 170,170 130 VDU 23,129,0,238,68,255,255,68,238 ,0 140 VDU 23,130,0,119,34,255,255,34,119 ,0 150 VDU 23,131,145,82,0,192,3,0,74,137 160 VDU 23,132,-1,-1,-1,-1,-1,-1,-1,-1 170 VDU 19,3,2,0,0,0 180 ENDPROC 190 DEF PROC_NEW_GAME 200 A$="[fs1] [fs1][fs1] [fs1] [fs1] [ fs1] [fs1][fs1] [fs1] [fs1] " 210 B$="[fs1] [fs1][fs1] [fs1][spc3] [fs1] [fs1] [fs1] " 220 C$="[fs4][fs4] [fs2] [fs2] [fs2] [fs2] [fs2] [fs2][spc5]" 230 D$="[fs2] [fs2][fs2] [fs2] [fs2][f s2][spc3][fs4][fs4] [fs2][fs2][spc3]" 240 COLOUR 131 250 VDU 26,12,28,0,18,19,5 260 COLOUR 128:VDU 12,26 270 PA%=8:PD%=18 280 PAE%=8:PDE%=18 290 L%=5:S%=0 300 COLOUR 131:COLOUR 1 310 PRINT TAB(0,20);"LIVES :";TAB(8,20 );"[fs0] [fs0] [fs0] [fs0]" 320 ENDPROC 330 DEF PROC_PLAY 340 COLOUR 128 350 REPEAT 360 PAE%=PA%:PDE%=PD% 370 IF INKEY(-67) THEN PA%=PA%+1:IF PA%>19 THEN PA%=19 380 IF INKEY(-98) THEN PA%=PA%-1:IF PA%<0 THEN PA%=0 390 IF INKEY(-105) THEN PD%=PD%+1:IF PD%>18 THEN PD%=18 400 IF INKEY(-73) THEN PD%=PD%-1:IF PD%<4 THEN PD%=4 410 COLOUR 1 420 PRINT TAB(PAE%,PDE%);" ";TAB(PA% ,PD%);"[fs0]"; 430 Y%=PA%+1 440 COLOUR 2 450 A$=RIGHT$(A$,1)+LEFT$(A$,19) 460 B$=RIGHT$(B$,1)+LEFT$(B$,19) 470 C$=MID$(C$,2)+LEFT$(C$,1) 480 D$=MID$(D$,3)+LEFT$(C$,2) 490 PRINT TAB(0,6);A$;TAB(0,9);B$;TA B(0,13);C$;TAB(0,16);D$ 500 IF PD%=6 AND MID$(A$,Y%,1)<>" " THEN PROC_HIT 510 IF PD%=9 AND MID$(B$,Y%,1)<>" " THEN PROC_HIT 520 IF PD%=13 AND MID$(C$,Y%,1)<>" " THEN PROC_HIT 530 IF PD%=16 AND MID$(D$,Y%,1)<>" " THEN PROC_HIT 540 IF PD%=4 THEN PROC_HOME 550 FOR D%=0 TO 50:NEXT 560 UNTIL L%=0 570 ENDPROC 580 DEF PROC_HIT 590 COLOUR 1 600 PRINT TAB(PA%,PD%);"[fs3]" 610 SOUND 0,-10,4,1 620 TIME=0:REPEAT UNTIL TIME>100 630 L%=L%-1 640 PROC_NEXT_ATTEMPT 650 ENDPROC 660 DEF PROC_HOME 670 S%=S%+1 680 COLOUR 1:COLOUR 131 690 PRINT TAB(0,0);STRING$(S%,"[fs0] " );TAB(9,0);"SAFELY HOME" 700 PRINT TAB(2,2);"SCORE IS ";100*S% 710 PROC_NEXT_ATTEMPT 720 ENDPROC 730 DEF PROC_NEXT_ATTEMPT 740 COLOUR 1 750 PRINT TAB(PA%,PD%);" "; 760 PA%=8:PD%=18 770 COLOUR 131:COLOUR 1 780 IF L%=0 THEN PRINT TAB(8,20);" " E LSE PRINT TAB(8,20);STRING$(L%-1,"[fs0] ");" "; 790 COLOUR 128 800 ENDPROC 810 DEF FN_ANOTHER 820 *FX 15 1 830 COLOUR 1:COLOUR 131 840 PRINT TAB(0,22);"There are no more ofyou left!" 850 PRINT'"Another Go ?"; 860 REPEAT K$=GET$ 870 UNTIL K$="Y" OR K$="N" 880 =(K$="Y")
Bomb Raid
In this program, based on one by Gwyn Dewey, you are in control of an aeroplane which has to make an emergency landing. Unfortunately, in order to land you must destroy the buildings which are in your way.
There are full instructions within the program. Here's the listing so you can throw your weight (and a few bombs) about.
10 REM BOMB RAID 20 30 MODE 5 40 PROCINIT 50 REPEAT 60 PROCINST 70 REPEAT 80 PROCBUILD 90 PROCPLAY 100 UNTIL FLAG% 110 UNTIL NOT FNAGAIN 120 MODE 7 130 END 140 DEF PROCINIT 150 DIM B%(20),S(20),COL%(1,5) 160 DATA 0,1,1,4,0,5,0,4,1,5,4,5 170 FOR AC=0 TO 5 180 FOR LC=0 TO 1 190 READ COL%(LC,AC) 200 NEXT LC 210 NEXT AC 220 VDU 19,2,6,0,0;19,3,2,0,0; 230 FOR LC=0 TO 1:VDU19,LC,COL%(LC,0), 0,0;:NEXT 240 VDU 23,0,10,32;0;0;0 250 PROCCHARS 260 HIGH%=0 270 ENDPROC 280 DEF PROCCHARS 290 VDU 23,128,254,146,146,254,254,146 ,146,254 300 VDU 23,129,0,0,0,0,0,56,124,254 310 VDU 23,130,254,146,146,254,254,146 ,146,254 320 VDU 23,131,254,146,146,254,254,146 ,146,242 330 VDU 23,132,252,73,145,-1,253,249,3 2,248 340 VDU 23,133,193,224,240,-1,127,63,3 3,195 350 VDU 23,134,-1,-1,-1,-1,-1,-1,-1,-1 360 VDU 23,135,40,56,16,56,56,56,56,16 370 ENDPROC 380 DEF PROCBUILD 390 COLOUR 0 400 WA%=WA%+1 410 FOR LC=0 TO 1 420 VDU19,LC,COL%(LC,(WA%-1) MOD 6), 0,0,0 430 NEXT 440 VDU 17,130,12,17,131,28,0,31,19,30 ,12,26,17,3,17,130 450 FOR A%=3 TO 17 460 H%=RND(13) 470 COLOUR RND(2)-1 480 PRINT TAB(A%,29);"[fs3]" 490 FOR H=28 TO (28-H%) STEP-1 500 PRINT TAB(A%,H);"[fs2]" 510 NEXT H 520 COLOUR RND(2)-1 530 PRINT TAB(A%,H);"[fs1]" 540 B%(A%)=H%+2 550 S(A%)=150/(B%(A%)+1) 560 NEXT A% 570 COLOUR 1:PRINT TAB(0,0);"SC ";INT( S+.9) 580 PRINT TAB(10,0);"HI ";HIGH% 590 N%=N%-50 600 ENDPROC 610 DEF PROCPLAY 620 F%=0:Y%=0:X1%=0:Y1%=1 630 COLOUR 1:COLOUR 130 640 REPEAT Y%=Y%+1 650 X%=0 660 REPEAT X%=X%+1 670 IF F%=1 THEN PROCBOMB:GOTO690 680 IF INKEY(-99) THEN X1%=X% MOD2 0:Y1%=Y%:F%=1:PROCBOMB 690 COLOUR 1:PRINT TAB(X%-1,Y%);" [fs5][fs4]" 700 FOR E%=0 TO N%:NEXT 710 SOUND &10,-10,15,1:SOUND &11,0 ,200,1 720 C%=FNCODE(X%+2,Y%) 730 IF C%>128 AND C%<134 THEN FLAG %=TRUE ELSE FLAG%=FALSE 740 UNTIL X%>19 OR FLAG% 750 PRINT TAB(18,Y%);" "; 760 UNTIL (X%>19 AND Y%>27) OR FLAG% 770 IF FLAG% THEN PROCCRASH:ENDPROC 780 PROCTUNE 790 S=S+250 800 ENDPROC 810 DEF PROCBOMB 820 COLOUR 1 830 Y1%=Y1%+1 840 IF Y1%>29-B%(X1%) THEN S=S+FNSCORE 850 IF Y1%>29 THEN PROCMISS:GOTO 900 860 PRINT TAB(X1%,Y1%);"[fs7]" 870 SOUND 18,-10,255-Y1%,1 880 COLOUR 2 890 PRINT TAB(X1%,Y1%-1);" " 900 ENDPROC 910 DEF PROCMISS 920 F%=0:COLOUR 2 930 PRINT TAB(X1%,Y1%-1);" " 940 S(X1%)=0:B%(X1%)=0 950 ENDPROC 960 DEF FNCODE(X%,Y%) 970 LOCAL A%,C%:VDU 31,X%,Y% 980 A%=135 990 =(USR(&FFF4) AND &FFFF)DIV &100 1000 1010 DEF PROCCRASH 1020 PRINT TAB(X%-1,Y%);"[spc3]" 1030 IF F%=1 THEN PROCBOMB:FOR W=0 TO 1 00:NEXT:GOTO 1030 1040 X%=X%*64:Y%=1024-(Y%*40) 1050 *FX 9,5 1060 *FX 10,5 1070 VDU 19,2,9,0,0; 1080 SOUND 0,-15,15,100 1090 SOUND 1,0,200,100 1100 FOR W%=0 TO 5000:NEXT 1110 VDU 19,2,6,0,0; 1120 FOR Z%=0 TO 250 1130 GCOL 0,RND(4)-1 1140 PLOT 69,X%+RND(320),Y%+RND(200) 1150 NEXT 1160 IF (S+.9)>HIGH% THEN HIGH%=(S+.9) 1170 ENDPROC 1180 DEF PROCTUNE 1190 RESTORE 1280 1200 FOR N=1 TO 9 1210 READ P,D 1220 SOUND 17,-15,P,D 1230 SOUND 18,-15,P+48,D 1240 SOUND 19,-15,P+96,D 1250 FOR X=0 TO 400:NEXT 1260 NEXT 1270 ENDPROC 1280 DATA 73,20,93,20,73,3,73,7,65,3,61 ,3,65,7,73,7,61,10 1290 DEF FNSCORE 1300 PRINT TAB(3,0);INT(S+S(X1%)+.9); 1310 SOUND 16,-15,5,10 1320 =S(X1%) 1330 DEF FNAGAIN 1340 COLOUR 1 1350 PRINT TAB(0,2);" WOULD YOU LIKE TO " 1360 PRINT " PLAY AGAIN (Y/N) ?"; 1370 REPEAT AN$=GET$ 1380 UNTIL AN$="Y" OR AN$="y" OR AN$= "N" OR AN$="n" 1390 IF AN$="Y" OR AN$="y" THEN =TRUE E LSE =FALSE 1400 DEF PROCINST 1410 VDU 17,131,17,1,12 1420 PRINT'"[spc3]BOMBER COMMAND "'' 1430 COLOUR 0:PRINT" DROP BOMBS ON TOW N" 1440 PRINT"BY PRESSING SPC BAR." 1450 PRINT"ONLY ONE BOMB IN AIR" 1460 PRINT"AT ANY ONE TIME."'' 1470 PRINT" PLANE MOVES DOWN AT" 1480 PRINT"EACH PASS OVER TOWN."' 1490 PRINT"GAME ENDS WHEN PLANE" 1500 PRINT"HITS BUILDING."'' 1510 PRINT"150 PTS PER BUILDING"; 1520 PRINT TAB(9,24);"&" 1530 PRINT"250 PTS ON LANDING."' 1540 *FX 15 1 1550 PRINT'TAB(3);"PRESS SPACE BAR" 1560 PRINT TAB(6);"TO PLAY" 1570 A=GET 1580 S=0:N%=300:WA%=0 1590 ENDPROC
Zombie
Now you can take on the challenge of Zombie in this exciting version of the game based on a program by Raymond Blake.
You are stranded on an island of cannibal zombies. Your only hope of escape is to lure them into the pot-holes scattered about the island. The trees on the island hinder the progress of both man and zombie, and falling into a pot-hole means eternal entrapment.
The game is made more difficult by the fact that you can move in only four directions. The zombies can not only move up, down, right and left, but can also move diagonally.
You need not panic, however, as the zombies are pretty short-sighted and this gives you a distinct edge with your 20/20 vision.
10 ON ERROR GOTO 1240 20 REM ZOMBIE 30 40 MODE 1 50 PROC_INIT 60 REPEAT 70 PROC_NEW_GAME 80 PROC_PLAY 90 UNTIL NOT FN_ANOTHER 100 CLS 110 END 120 130 DEF PROC_INIT 140 VDU 23,0,10,32,0;0;0; 150 VDU 23,128,0,&3C,&5A,&FF,&C3,&42,& 3C,0 160 VDU 23,129,8,&7E,&90,&3C,&24,&24,& 24,&33 170 VDU 23,130,&38,&44,&82,&8A,&EE,&28 ,&28,&44 180 VDU 19,3,2,0,0,0 190 DIM A%(6),B%(6) 200 *FX 4 1 210 ENDPROC 220 DEF PROC_NEW_GAME 230 CLS 240 P%=10:Q%=15 250 PROC_TREES 260 PROC_HOLES 270 PROC_ZOMBIES 280 ENDPROC 290 DEF PROC_TREES 300 COLOUR 3 310 FOR I%=1 TO 40 320 PRINT TAB(RND(39)-1,RND(31)-1);"[f s2]"; 330 NEXT I% 340 ENDPROC 350 DEF PROC_HOLES 360 COLOUR 2 370 FOR I%=1 TO 12 380 PRINT TAB(RND(39)-1,RND(31)-1);"o" ; 390 NEXT 400 ENDPROC 410 DEF PROC_ZOMBIES 420 COLOUR 1 430 FOR I%=1 TO 6 440 REPEAT 450 X%=RND(36):Y%=RND(30) 460 UNTIL FNC(X%,Y%)=32 470 A%(I%)=Y%:B%(I%)=X% 480 PRINT TAB(B%(I%),A%(I%));"[fs0]"; 490 NEXT 500 COLOUR 2 510 REPEAT Q%=Q%+1 520 UNTIL FNC(Q%,P%)=32 530 PRINT TAB(Q%,P%);"[fs1]"; 540 ENDPROC 550 DEF FNC(X%,Y%) 560 VDU 31,X%,Y% 570 A%=135 580 =(USR(&FFF4)AND&FFFF)DIV&100 590 DEF PROC_PLAY 600 REPEAT 610 DIE=FALSE 620 *FX 15 1 630 REPEAT 640 A%=GET 650 UNTIL A%>135 AND A%<140 660 M%=((A%=138)*(P%<30))-((A%=139)* (P%>0)) 670 N%=((A%=137)*(Q%<38))-((A%=136)* (Q%>0)) 680 PRINT TAB(Q%,P%);" "; 690 C%=FNC(Q%+N%,P%+M%) 700 IF C%=ASC"[fs0]" THEN DIE=TRUE 710 IF C%=ASC"o" THEN PROC_PIT 720 IF C%=32 THEN P%=P%+M%:Q%=Q%+N% 730 COLOUR 2 740 IF DIE THEN 900 750 PRINT TAB(Q%,P%);"[fs1]"; 760 COLOUR 1 770 FOR I%=1 TO 6 780 IF A%(I%)=99 THEN 840 790 A1%=SGN(P%-A%(I%)):B1%=SGN(Q%-B% (I%)) 800 PRINT TAB(B%(I%),A%(I%));" "; 810 IF FNC(B%(I%)+B1%,A%(I%)+A1%)=32 THEN A%(I%)=A%(I%)+A1%:B%(I%)=B%(I%)+B1 % ELSE PROC_ZOMBY 820 PRINT TAB(B%(I%),A%(I%));"[fs0]" ; 830 IF A%(I%)=P% AND B%(I%)=Q% THEN DIE=TRUE:I%=6 840 NEXT I% 850 SOUND &11,-10,10,2 860 G%=0 870 FOR I%=1 TO 6 880 IF A%(I%)=99 THEN G%=G%+1 890 NEXT I% 900 UNTIL G%=6 OR DIE 910 IF DIE THEN PRINT TAB(Q%,P%);" "; 920 ENDPROC 930 DEF PROC_PIT 940 DIE=TRUE 950 PRINT TAB(0,31);"Whoops! You just found a pit!"; 960 FOR S%=101 TO 5 STEP-4 970 SOUND 2,-10,S%,2 980 NEXT 990 SOUND &110,-10,5,5:SOUND &102,-10, 5,3 1000 ENDPROC 1010 DEF PROC_ZOMBY 1020 C%=FNC(B%(I%)+B1%,A%(I%)+A1%) 1030 IF C%=ASC"[fs0]" THEN ENDPROC 1040 IF C%=ASC"[fs2]" THEN ENDPROC 1050 IF C%=ASC"[fs1]" THEN DIE=TRUE:END PROC 1060 PRINT TAB(0,31);"Whoops! There goe s a Zombie."; 1070 COLOUR 2:PRINT TAB(B%(I%)+B1%,A%(I %)+A1%);"o"; 1080 FOR S%=101 TO 5 STEP-4 1090 SOUND 2,-10,S%,2 1100 NEXT 1110 SOUND &110,-10,4,5:SOUND &102,-10, 5,5 1120 PRINT TAB(0,31);SPC(29); 1130 A%(I%)=99 1140 COLOUR 1 1150 ENDPROC 1160 DEF FN_ANOTHER 1170 COLOUR 2 1180 IF DIE THEN PRINT TAB(0,3);"The zo mbies claim another victim !" ELSE PRINT TAB(0,3);"You have escaped the zombies! " 1190 PRINT'''"Another Game ?"; 1200 REPEAT K$=GET$ 1210 UNTIL K$="Y" OR K$="N" 1220 IF K$="N" THEN *FX 4 1230 =(K$="Y") 1240 MODE 6 1250 *FX 4 1260 REPORT:PRINT" at line ";ERL 1270 END
Two-Wall Smash
This game, patterned after one written by Mike O'Neill, is a two-wall version of the popular arcade game which is often called 'Breakout'.
The aim of the game is to destroy all the bricks in the walls by controlling the ball with your bat. The bat moves horizontally at the bottom of the screen. The ball moves at two different angles, and there are three bat sizes. The bat gets smaller as the game progresses - after a certain number of hits, when the ball reaches the second wall and when the ball hits the top of the screen.
The colour of the brick determines how much it is worth. The high score displayed on the screen, next to the current score. The number of the ball in play is also shown. The high score is updated at the end of each game.
10 REM TWO-WALL SMASH 20 30 MODE 7 40 PROC_INIT 50 REPEAT 60 PROC_NEWGAME 70 REPEAT ball=ball-1 80 PROC_NEWBALL 90 PROC_PLAY 100 UNTIL ball=0 110 UNTIL NOT FN_ANOTHER 120 END 130 140 DEF PROC_INIT 150 VDU 23,0,10,32,0;0;0; 160 brick$="||4" 170 big$="///" 180 mid$="//" 190 sml$="/" 200 HIGH=0 210 PROC_WALLS 220 PRINT TAB(9,9);"[fs1][fs8]WALL SMA SH[fs9]" 230 PRINT TAB(0,15);"[fs3]Press any ke y to play"; 240 *FX 15 1 250 dummy=GET 260 VDU 26 270 ENDPROC 280 DEF PROC_NEWGAME 290 S%=0:bat$=big$ 300 CLS 310 PROC_WALLS 320 ball=3:B%=20 330 ENDPROC 340 DEF PROC_WALLS 350 PRINT TAB(0,0);CHR$141;"[fs1]SCORE :[fs6]0";TAB(20,0);"[fs2]HIGH :[fs6]";H IGH 360 PRINT TAB(0,1);CHR$141;"[fs1]SCORE :[fs6]0";TAB(20,1);"[fs2]HIGH :[fs6]";H IGH 370 PRINT TAB(0,2);"[fc7]";STRING$(38, "p");"0"; 380 FOR Y%=3 TO 23 390 PRINT TAB(0,Y%);"[fc7]5";TAB(38,Y% );"[fc7]5"; 400 NEXT 410 PRINT TAB(2,22);"[fc6]"; 420 PROC_WALL(4) 430 PROC_WALL(10) 440 ENDPROC 450 DEF PROC_WALL(ROW%) 460 VDU 26 470 FOR Y%=0 TO 3 480 PRINT TAB(3,Y%+ROW%);CHR$(145+Y%); STRING$(11,brick$); 490 NEXT 500 W%=88 510 VDU 28,3,23,36,0 520 ENDPROC 530 DEF PROC_NEWBALL 540 PRINT TAB(B%,22);SPC(LEN(bat$)); 550 X%=RND(33):Y%=21 560 DX%=((X%>21)*2)+1 570 DY%=-1:PRINT TAB(X%,Y%);"O"; 580 B%=20:PRINT TAB(B%,22);bat$; 590 PRINT TAB(0,23);"[fs1]Balls :[fs6] ";ball; 600 ENDPROC 610 DEF PROC_PLAY 620 REPEAT 630 PROC_MOVE(INKEY-98,INKEY-67) 640 PROC_BALL 650 FOR delay=1 TO (1500-S%)DIV10:NE XT 660 PROC_MOVE(INKEY-98,INKEY-67) 670 UNTIL Y%>21 680 PRINT TAB(X%,Y%);"O"; 690 SOUND 0,-10,6,10 700 FOR delay=1 TO 2000:NEXT 710 PRINT TAB(X%,Y%);" "; 720 ENDPROC 730 DEF PROC_MOVE(L%,R%) 740 b%=B% 750 IF L% AND B%>1 THEN B%=B%-1 760 IF R% AND B%<(34-LEN(bat$)) THEN B %=B%+1 770 IF B%<>b% PRINT TAB(b%,22);SPC(LEN (bat$)); 780 PRINT TAB(B%,22);bat$; 790 ENDPROC 800 DEF PROC_BALL 810 IF X%=1 THEN DX%=1 820 IF X%=33 THEN DX%=-1 830 IF Y%=3 THEN DY%=1 840 IF Y%=21 AND (X%+1)>=B% AND (X%-1) <(B%+LEN(bat$)) PROC_return ELSE PRINT T AB(X%,Y%);"O"; 850 VDU 31,X%,Y%,32 860 X%=X%+DX%:Y%=Y%+DY% 870 PROC_TEST 880 ENDPROC 890 DEF PROC_TEST 900 VDU 31,X%,Y% 910 A%=135:M%=(USR(&FFF4)AND&FFFF)DIV& 100 920 IF Y%>20 THEN ENDPROC 930 IF M%<>32 THEN PROC_HIT ELSE PRINT "O"; 940 ENDPROC 950 DEF PROC_return 960 PRINT TAB(X%,Y%);"O"; 970 SOUND &12,-10,200,2 980 SOUND 2,-10,200,1 990 REPEAT UNTIL ADVAL(-7)>14 1000 DY%=-1 1010 ENDPROC 1020 DEF PROC_HIT 1030 IF Y%>20 THEN ENDPROC 1040 DY%=-DY% 1050 SOUND &11,-10,100,1 1060 IF X%MOD3=0 THEN PRINT TAB(X%-2,Y% );" O";:IFDX%<0THENDX%=1 1070 IF X%MOD3=1 THEN PRINT TAB(X%,Y%); "O ";:IFDX%>0THENDX%=-1 1080 IF X%MOD3=2 THEN PRINT TAB(X%-1,Y% );" O "; 1090 W%=W%-1 1100 IF Y%>8 THEN P%=4-((Y%+2)MOD4) ELS E P%=14-(Y%MOD4) 1110 S%=S%+P% 1120 PRINT TAB(7,0);S%; 1130 PRINT TAB(7,1);S%; 1140 IF W%=0 THEN PROC_EXTRABALL 1150 ENDPROC 1160 DEF PROC_EXTRABALL 1170 PRINT TAB(X%,Y%);" " 1180 PRINT TAB(B%,22);SPC(LEN(bat$)); 1190 PROC_WALL(4) 1200 PROC_WALL(10) 1210 PROC_NEWBALL 1220 IF bat$=mid$ THEN bat$=sml$ 1230 IF bat$=big$ THEN bat$=mid$ 1240 ENDPROC 1250 DEF FN_ANOTHER 1260 IF S%>HIGH THEN PRINT TAB(25,0);S% ;TAB(25,1);S% 1270 VDU 28,3,20,36,4,12 1280 PRINT TAB(12,5);"[fs1]GAME OVER[fs 7]" 1290 PRINT'' 1300 IF S%>HIGH THEN HIGH=S%:PRINT TAB( 7);"[fs8][fs3]A NEW HIGH SCORE![fs9]" 1310 PRINT''"[fs2]Another game Y/N ?"; 1320 REPEAT KEY$=GET$ 1330 UNTIL KEY$="Y" OR KEY$="N" 1340 VDU 26,12 1350 IF KEY$="Y" THEN =TRUE ELSE =FALSE
Sharp Shooter
In this fun program, based on an idea from Ant Hurrion, you control the man on the right of the cacti on your screen. You must shoot it out with the computer gunman.
The winner is the marksman who first gains 100 points. There are several levels of difficulty, and you're able to choose the level at which you'll start play at the start of the game.
10 REM Sharp Shooter 20 30 MODE 7 40 PROC_INIT 50 PROC_INSTR 60 REPEAT MODE 5 70 PROC_NEWGAME 80 PROC_PLAY 90 UNTIL NOT FN_ANOTHER 100 MODE 7 110 END 120 130 DEF PROC_INIT 140 VDU 23,0,10,32,0;0;0; 150 VDU 23,128,0,3,7,3,3,7,15,27 160 VDU 23,129,0,192,224,192,192,224,2 40,216 170 VDU 23,130,7,3,1,3,7,12,24,48 180 VDU 23,131,224,192,128,192,224,48, 24,12 190 VDU 23,132,0,0,0,1,3,1,113,31 200 VDU 23,133,0,0,0,128,192,128,128,1 28 210 VDU 23,134,1,1,1,15,9,9,25,0 220 VDU 23,135,128,128,128,128,128,136 ,248,0 230 VDU 23,136,0,0,0,1,3,1,1,1 240 VDU 23,137,0,0,0,128,192,128,142,2 48 250 VDU 23,144,1,1,1,1,1,9,15,0 260 VDU 23,145,128,128,128,240,144,144 ,152,0 270 VDU 23,146,48,48,52,52,60,24,24,24 280 VDU 23,147,0,0,0,56,56,56,0,0 290 VDU 23,148,0,192,97,51,25,77,127,0 300 VDU 23,149,0,3,134,204,152,178,254 ,0 310 ENVELOPE 1,1,-1,-2,-4,1,1,1,126,0, 0,-10,126,50 320 ENDPROC 330 DEF PROC_INSTR 340 PRINT TAB(12,1);"[fs1]SHARP SHOOTE R[fs7]" 350 PRINT'"[fs6]You control the Gunman on the right of" 360 PRINT"[fs6]the screen and must sho ot the computer" 370 PRINT"[fs6]gunman on the left of t he screen."'' 380 PRINT'"[fs2]To move UP press[fs3 ]A" 390 PRINT'"[fs2]To move DOWN press[fs3 ]Z" 400 PRINT'"[fs2]To FIRE press[fs3]RETU RN" 410 PRINT''"[fs6]The first to 100 poin ts wins!" 420 PRINT''"[fs6]Difficulty[fs3]1-9[fs 6](9 easy!)[fs3]"; 430 REPEAT D%=GET-ASC"0" 440 UNTIL D%>0 AND D%<10 450 PRINT'''"[fs1]GOOD LUCK ";:IF D%<5 THEN PRINT"SUCKER!" 460 DU=INKEY(200) 470 ENDPROC 480 DEF PROC_NEWGAME 490 VDU 19,1,2,0,0,0 500 VDU 19,3,6,0,0,0 510 VDU 23,0,10,32,0;0;0; 520 S1%=0:S2%=0 530 PROC_LANDSCAPE 540 ENDPROC 550 DEF PROC_LANDSCAPE 560 VDU 24,0;639;1279;1023; 18,0,131,1 6 570 VDU 24,0;0;1279;639; 18,0,130, 16, 26, 5 580 GCOL 0,1 590 FOR CACT%=0 TO 30 600 X%=RND(40)*32:Y%=RND(21)*32 610 MOVE X%,Y%:VDU 146 620 NEXT CACT% 630 VDU 4, 17,131, 17,0 640 PRINT TAB(0,0);"YOU:";S1%;TAB(10,0 );"ME :";S2% 650 Y1%=RND(20)+10:Y2%=RND(20)+10 660 y1%=Y1%:y2%=Y2% 670 PROC_DBL(2,Y1%,"[fs0][fs1]","[fs2] [fs3]") 680 PROC_DBL(17,Y2%,"[fs0][fs1]","[fs2 ][fs3]") 690 COLOUR 131 700 PRINT TAB(8,10);"READY!" 710 *FX 15 1 720 DU=INKEY(200) 730 PRINT TAB(8,10);"[spc6]" 740 ENDPROC 750 DEF PROC_PLAY 760 REPEAT 770 IF y1%<>Y1% THEN PROC_DBL(2,y1%, " "," "):PROC_DBL(2,Y1%,"[fs0][fs1]"," [fs2][fs3]") 780 IF y2%<>Y2% THEN PROC_DBL(17,y2% ," "," "):PROC_DBL(17,Y2%,"[fs0][fs1]" ,"[fs2][fs3]") 790 y1%=Y1%:y2%=Y2% 800 Y1%=Y1%-(RND(3)=1 AND Y1%<30)+(R ND(3)=1 AND Y1%>10) 810 Y2%=Y2%-(INKEY(-98) AND Y2%<30)+ (INKEY(-66) AND Y2%>10) 820 IF INKEY(-74) AND (RND(0)<.3+(D% /10)) THEN PROC_UFIRE 830 IF RND(10)>D% THEN PROC_FIRE 840 IF RND(5)=1 THEN COLOUR 1:COLOUR 130:PRINT TAB(RND(20)-1,11+RND(19));"[f s2]"; 850 UNTIL S1%=100 OR S2%=100 860 ENDPROC 870 DEF FN_ANOTHER 880 PRINT TAB(8,10); 890 IF S1%=100 THEN PRINT"I WON!" ELSE PRINT"YOU WON!" 900 COLOUR 130 910 PRINT'''"Do you wanter another" 920 PRINT"go ";:IF S2%=100 THEN PRINT" sharpshooter ?"; ELSE PRINT"?"; 930 REPEAT K$=GET$ 940 UNTIL K$="Y" OR K$="N" 950 IF K$="Y" THEN =TRUE ELSE =FALSE 960 DEF PROC_DBL(X%,Y%,T$,B$) 970 COLOUR 0 980 IF Y%<12 THEN COLOUR 131 ELSE COLO UR 130 990 PRINT TAB(X%,Y%);T$ 1000 IF Y%<11 THEN COLOUR 131 ELSE COLO UR 130 1010 PRINT TAB(X%,Y%+1);B$; 1020 ENDPROC 1030 DEF PROC_FIRE 1040 PROC_DBL(2,y1%,"[fs8][fs9]","[fs0] [fs1]") 1050 SOUND &10,-10,4,2 1060 FOR B%=4 TO 16 1070 IF B%<>4 THEN PROC_DBL(B%-1,y1%," [fs3]","") ELSE PROC_DBL(B%,y1%,"[fs3]", "") 1080 NEXT 1090 PROC_DBL(16,y1%," ","") 1100 IF y1%=y2% OR y1%=y2%+1 THEN PROC_ UDIE 1110 ENDPROC 1120 DEF PROC_UFIRE 1130 PROC_DBL(17,y2%,"[fs4][fs5]","[fs6 ][fs7]") 1140 SOUND &10,-10,5,2 1150 FOR B%=15 TO 2 STEP -1 1160 IF B%<>15 THEN PROC_DBL(B%+1,y2%," [fs3] ","") ELSE PROC_DBL(B%,y2%,"[fs3]" ,"") 1170 NEXT 1180 PROC_DBL(3,y2%," ","") 1190 IF y2%=y1% OR y2%=y1%+1 THEN PROC_ IDIE 1200 ENDPROC 1210 DEF PROC_UDIE 1220 PROC_DBL(17,y2%," ","[fs4][fs5]") 1230 SOUND 1,1,20,1 1240 S1%=S1%+10 1250 COLOUR 0:COLOUR 131 1260 PRINT TAB(4,0);S1% 1270 REPEAT UNTIL INKEY(-147) 1280 *FX 15 1 1290 D=INKEY(200) 1300 IF S1%<>100 THEN PROC_LANDSCAPE 1310 ENDPROC 1320 DEF PROC_IDIE 1330 PROC_DBL(2,y1%," ","[fs4][fs5]") 1340 SOUND 1,1,20,1 1350 S2%=S2%+10 1360 COLOUR 0:COLOUR 131 1370 PRINT TAB(14,0);S2% 1380 REPEAT UNTIL INKEY(-147) 1390 *FX 15 1 1400 D=INKEY(200) 1410 IF S2%<>100 THEN PROC_LANDSCAPE 1420 ENDPROC
Racer
In this game, on a racing track designed by Scott Vincent, you must drive your car around the circuit as quickly as you can without crashing. The faster you go, the more your score increases.
The game ends when your car skids off the track and mounts the grass. Obviously, at higher speeds the car tends to skid more when turning. If you go too fast, you'll lose control. The car starts off at around ten miles an hour.
10 REM Racer 20 30 MODE 4 40 PROC_INIT 50 REPEAT 60 PROC_NEWGAME 70 PROC_RACE 80 UNTIL NOT FN_ANOTHER 90 MODE 7 100 110 END 120 DEF PROC_INIT 130 VDU 19,7,2,0,0,0 140 VDU 23,0,10,32,0;0;0; 150 VDU 23,128,0,24,24,60,60,189,255,2 53 160 VDU 23,129,194,233,126,124,60,56,1 60,64 170 VDU 23,130,7,2,30,127,127,30,2,7 180 VDU 23,131,64,160,56,60,124,126,24 1,194 190 VDU 23,132,153,255,189,60,60,24,24 ,0 200 VDU 23,133,2,5,28,60,62,126,143,67 210 VDU 23,134,224,64,120,254,254,120, 64,224 220 VDU 23,135,67,143,126,62,60,28,5,2 230 VDU 23,136,-1,-1,-1,-1,-1,-1,-1,-1 240 H%=0 250 DIM X(2),Y(2) 260 ENDPROC 270 DEF PROC_TRACK 280 FOR Y%=1 TO 30 290 PRINT TAB(0,Y%);STRING$(40,"[fs8]" ); 300 NEXT 310 VDU 28,3,28,36,4 320 RESTORE 330 FOR A%=1 TO 41 340 READ Y%,X%,L% 350 PRINT TAB(X%,Y%);STRING$(L%," "); 360 NEXT 370 VDU 26 380 PRINT TAB(0,0);"Score :";S%;"[spc6 ]";TAB(20,0);"High :";H% 390 ENDPROC 400 410 DATA 3,15,11,4,14,14,5,14,15,6,4,8 ,6,14,6,6,22,8,7,3,10,7,15,5,7,23,7,8,2, 12,8,16,5,8,24,6 420 DATA 9,1,13,9,17,5,9,24,7,10,1,6,1 0,9,6,10,17,5,10,25,7,11,1,6,11,10,12,11 ,24,7 430 DATA 12 ,1,7,12,11,10,12,24,7,13,1 ,8,13,11,10,13,23,8,14,1,9,14,14,6,14,22 ,8,15,2,9,15,21,9 440 DATA 16,2,12,16,18,11,17,3,25,18,5 ,22,19,6,8,19,18,7,20,7,5,20,19,4 450 460 DEF PROC_NEWGAME 470 S%=0 480 PROC_TRACK 490 X(1)=640:Y(1)=512 500 X(2)=0:Y(2)=0.1 510 V%=10:A$="[fs0]" 520 PRINT TAB(10,2);"Speed =[spc5]m.p. h." 530 PRINT TAB(18,2);V%; 540 ENDPROC 550 DEF PROC_RACE 560 CRASH=FALSE 570 SOUND 0,-10,7,255 580 REPEAT 590 VDU 5 600 MOVE X(1),Y(1):GCOL0,0:VDU136 610 X(1)=X(1)-X(2) 620 Y(1)=Y(1)+Y(2) 630 IF FN_HIT THEN CRASH=TRUE 640 MOVE X(1),Y(1):GCOL 0,1:PRINT A$ 650 VDU 4 660 S%=S%+(V%DIV10) 670 PRINT TAB(7,0);S% 680 SOUND &11,0,V%,1 690 IF INKEY(-74) V%=V%-10*(V%<150) 700 IF INKEY(-90) V%=V%+10*(V%>10) 710 PROC_MOVE 720 PRINT TAB(18,2);V%;" "; 730 UNTIL CRASH 740 ENDPROC 750 DEF PROC_MOVE 760 PROC_DELAY(V%) 770 O=V%/5 780 X(2)=SGN(X(2))*O 790 Y(2)=SGN(Y(2))*O 800 IF INKEY(-65) PROC_LEFT 810 IF INKEY(-2) PROC_RIGHT 820 ENDPROC 830 DEF PROC_DELAY(T%) 840 REMFORW%=1 TO 500-(10*T%):NEXT 850 ENDPROC 860 DEF PROC_LEFT 870 A$=CHR$(128+((ASC(A$)+1)MOD8)) 880 IF A$<"[fs4]" THEN X(2)=O ELSE X(2 )=-O 890 IF A$<"[fs2]" OR A$>"[fs6]" THEN Y (2)=O ELSE Y(2)=-O 900 IF A$="[fs4]" OR A$="[fs0]" THEN X (2)=0 910 IF A$="[fs2]" OR A$="[fs6]" THEN Y (2)=0 920 ENDPROC 930 DEF PROC_RIGHT 940 A$=CHR$(128+((ASC(A$)-1)MOD8)) 950 IF A$<"[fs4]" THEN X(2)=O ELSE X(2 )=-O 960 IF A$<"[fs2]" OR A$>"[fs6]" THEN Y (2)=O ELSE Y(2)=-O 970 IF A$="[fs4]" OR A$="[fs0]" THEN X (2)=0 980 IF A$="[fs2]" OR A$="[fs6]" THEN Y (2)=0 990 ENDPROC 1000 DEF FN_HIT 1010 IF POINT(X(1),Y(1))<>0 THEN =TRUE 1020 IF POINT(X(1)+30,Y(1)-30)<>0 THEN =TRUE 1030 =FALSE 1040 DEF FN_ANOTHER 1050 SOUND &10,-10,255,255 1060 IF S%>H% THEN H%=S% 1070 PRINT TAB(26,0);H% 1080 PRINT TAB(10,10);"You hit somethin g!" 1090 REPEAT UNTIL INKEY(-147) 1100 PRINT TAB(10,21);"Another go ?"; 1110 SOUND &10,0,0,0 1120 *FX 15 1 1130 *FX 202 32 1140 REPEAT K$=GET$ 1150 UNTIL K$="Y" OR K$="N" 1160 IF K$="Y" THEN =TRUE ELSE =FALSE
Ski Run
In this program you have to steer your skier down the ski-slope, dodging the trees as you go. Your speed increases as you progress down the slope. If you move off the side, you'll see yourself reappear on the other side of the screen. If you drop off the bottom of the world, you'll reappear on the top of the screen. The 'Z' keys moves you left, and the '/' moves you right. The skier automatically moves down unless he is moving across the slope. The time for the completed run will be shown at the end of the game.
10 REM Ski Run 20 30 MODE 1 40 PROC_INIT 50 REPEAT 60 PROC_NEW_GAME 70 PROC_PLAY 80 UNTIL NOT FN_ANOTHER 90 END 100 110 DEF PROC_INIT 120 DIM M% 3 130 L%=-98:R%=-105 140 VDU 23,0,10,32,0;0;0; 150 VDU 23,128,&18,&18,&10,&3C,&50,&08 ,&11,&FE 160 VDU 23,129,&18,&18,&08,&3C,&0A,&10 ,&88,&7F 170 VDU 23,130,&1C,&5D,&3E,&08,&2A,&36 ,&22,&22 180 VDU 23,131,60,118,227,201,221,201, 201,201 190 VDU 23,132,&08,&1C,&1C,&3E,&7F,&41 ,0,0 200 VDU 23,133,0,0,0,0,0,8,8,8 210 VDU 23,134,&80,&80,&80,&80,&80,&80 ,&80,&80 220 VDU 23,135,1,1,1,1,1,1,1,1 230 VDU 19,2,2,0,0,0 240 ENVELOPE 1,1,-1,-2,-4,1,1,1,126,0, 0,-10,126,50 250 Tree$=CHR$(5)+CHR$(18)+CHR$(0)+CHR $(2)+"[fs4]"+CHR$(8)+CHR$(18)+CHR$(18)+C HR$(0)+"[fs5]"+CHR$(4) 260 COLOUR 0:COLOUR 131:CLS 270 ENDPROC 280 290 DEF PROC_NEW_GAME 300 PROC_LANDSCAPE 310 X%=2:Y%=2 320 PRINT TAB(X%,Y%);"[fs2]"; 330 Crash%=FALSE:Finish%=FALSE 340 ENDPROC 350 360 DEF PROC_LANDSCAPE 370 LOCAL X%,Y% 380 CLS:COLOUR 3:COLOUR 129 390 GCOL 0,1 400 MOVE 0,928:DRAW 0,1023 410 PRINT TAB(0,0);"START" 420 MOVE 159,928:DRAW 159,1023 430 MOVE 1088,0:DRAW 1088,96:DRAW 1279 ,96:DRAW 1279,0 440 PRINT TAB(34,29);"FINISH"; 450 FOR TREE=1 TO 150 460 REPEAT 470 X%=32*(RND(40)-1):Y%=31+(32*(RND (32)-1)) 480 UNTIL (X%>160 OR Y%<863) AND (X% <1056 OR Y%>128) 490 MOVE X%,Y% 500 PRINT Tree$; 510 NEXT 520 COLOUR 1:COLOUR 131 530 PRINT TAB(2,2); 540 ENDPROC 550 560 DEF PROC_PLAY 570 *FX 15 1 580 wait%=GET 590 TIME=0 600 VDU 31,X%,Y%,32,8 610 Man$="[fs2]" 620 REPEAT 630 IF FN_CLEAR THEN PRINT Man$; ELS E PROC_CRASH:GOTO 750 640 PROC_DELAY 650 Man$="[fs2]" 660 D%=1 670 IF INKEY(L%) THEN X%=X%-1:D%=0:M an$="[fs1]" 680 IF INKEY(R%) AND NOT INKEY(L%) T HEN X%=X%+1:D%=0:Man$="[fs0]" 690 Y%=Y%+D% 700 IF Y%=32 THEN Y%=0:IF X%<5 THEN Y%=2 710 IF X%=-1 THEN X%=39 720 IF X%=40 THEN X%=0 730 IF X%>33 AND Y%>28 THEN PROC_FIN ISH 740 VDU 8,32,31,X%,Y% 750 UNTIL Crash% OR Finish% 760 Time%=TIME 770 ENDPROC 780 790 DEF FN_CLEAR 800 A%=135:!M%=USR&FFF4 810 IF M%?1=0 THEN =FALSE ELSE =TRUE 820 830 DEF PROC_DELAY 840 T%=TIME+(32-Y%) 850 REPEAT UNTIL TIME>T% 860 SOUND &11,-10,Y%DIV4,3 870 ENDPROC 880 890 DEF PROC_CRASH 900 IF X%>33 AND Y%>28 THEN PROC_FINIS H:ENDPROC 910 COLOUR 0 920 PRINT TAB(X%,Y%);"[fs3]"; 930 Crash%=TRUE 940 SOUND &11,1,20,1 950 ENDPROC 960 970 DEF PROC_FINISH 980 Finish%=TRUE 990 SOUND &11,1,175,2 1000 PRINT "[fs2]"; 1010 ENDPROC 1020 1030 DEF FN_ANOTHER 1040 *FX 15 1 1050 COLOUR 3 1060 IF Y%>5 AND Y%<15 THEN VDU 28,11,2 4,29,16 ELSE VDU 28,11,14,29,6 1070 COLOUR 129:CLS 1080 IF Finish% THEN PRINT"You have fin ished"'"in ";Time%/100;" seconds." ELSE PRINT" You have Crashed!" 1090 COLOUR 2 1100 PRINT''" Another go ? "; 1110 REPEAT K$=GET$ 1120 IF K$>"Z" THEN K$=CHR$(ASC(K$)-3 2) 1130 UNTIL K$="Y" OR K$="N" 1140 VDU 26 1150 COLOUR 0:COLOUR 131:CLS 1160 =(K$="Y")