MSX Invaders
Versão em MSX Basic do famoso jogo Space Invaders.
Teste o programa no WebMSX – The Online MSX Emulator
Destrua as naves alienígenas antes que elas atinjam o solo.
Para jogar, utilize as setas do cursor da DIREITA e ESQUERDA para movimentar o canhão no solo. Para disparar, pressione a seta PARA CIMA.
Contribuição: Paulo Maluf
Código fonte
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
10 CLEAR 1000 20 ON STOP GOSUB 1140:STOP ON 30 DEFINT S 40 N=RND(-TIME):GOSUB 890 50 COLOR 15,1,1:SCREEN 1,2:WIDTH 32:KEYOFF:GOSUB 630 60 EE=5:S=0 70 CL=8192:VPOKE CL+4,112:VPOKE CL+5,128:VPOKE CL+12,240:VPOKE CL+13,160:VPOKE CL+14,208:VPOKE CL+15,192:VPOKE CL+27,166 80 A=1:B=9:C=1:D=-1:E=EE:XL=INT(RND(1)*7)+12 90 A$=STRING$(22,32) 100 B$=" "+STRING$(20,112)+" " 110 BB$=" "+STRING$(20,113)+" " 120 C$=" "+STRING$(20,104)+" " 130 CC$=" "+STRING$(20,105)+" " 140 D$=" "+STRING$(20,36)+" " 150 DD$=" "+STRING$(20,35)+" " 160 E$=" "+STRING$(20,43)+" " 170 EE$=" "+STRING$(20,42)+" " 180 CLS:LOCATE 2,0:PRINT"M.S.X. INVADERS SCORE:";S 190 LOCATE 0,20:PRINT STRING$(9,120):LOCATE 23,20:PRINT STRING$(9,120):LOCATE 0,21:PRINT STRING$(32,220) 200 PUT SPRITE 0,(XL*8-2,160),4 210 FOR X=A TO B STEP C 220 LOCATEX,E-4:PRINTA$:LOCATEX,E-3:PRINTB$:LOCATEX,E-2:PRINTC$:LOCATEX,E-1:PRINTD$:LOCATEX,E:PRINTE$ 230 IF E>19 THEN GOSUB 490 240 ST=STICK(0):IF ST=0 THEN FOR DL=1 TO 100:NEXT DL: GOTO 400 250 XL=XL+(ST=7 AND XL>9)-(ST=3 AND XL<22):PUTSPRITE 0,(XL*8-2,160) 260 IF ST<>1 THEN FOR DL=1 TO 100:NEXT DL:GOTO 400 270 SOUND 0,0:SOUND 7,198:SOUND 8,16:SOUND 12,2:SOUND 13,3 280 FOR M=19 TO E STEP-3:LOCATE XL,M:PRINT"<":LOCATE XL,M:PRINT" ":NEXT M 290 F=0:Q$=E$:QQ$=EE$:R=0:GOSUB 420:E$=Q$:EE$=QQ$ 300 IF F=1 THEN 390 310 LOCATE XL,E-1:PRINT"<":LOCATE XL,E-1:PRINT" " 320 Q$=D$:QQ$=DD$:R=1:GOSUB 420:D$=Q$:DD$=QQ$ 330 IFF=1 THEN 390 340 LOCATE XL,E-2:PRINT"<":LOCATE XL,E-2:PRINT" " 350 Q$=C$:QQ$=CC$:R=2:GOSUB 420:C$=Q$:CC$=QQ$ 360 IF F=1 THEN 390 370 LOCATE XL,E-3:PRINT"<":LOCATE XL,E-3:PRINT" " 380 Q$=B$:QQ$=BB$:R=3:GOSUB 420:B$=Q$:BB$=QQ$ 390 IF B$="" AND C$="" AND D$="" AND E$="" THEN 550 400 SWAP B$,BB$:SWAP C$,CC$:SWAP D$,DD$:SWAP E$,EE$ 410 NEXT X: E=E+1:SWAPA,B:SWAP C,D:GOTO 210 420 IF Q$="" OR MID$(Q$,XL-X+1,1)=" "THEN RETURN 430 LOCATE XL,E-R:PRINT" " 440 MID$(Q$,XL-X+1)=" ":MID$(QQ$,XL-X+1)=" ":F=1:S=S+25-E 450 LOCATE XL,E-R:PRINT"a":BEEP:LOCATE 24,0:PRINT S 460 LOCATE XL,E-R:PRINT" " 470 IF Q$=A$ THEN Q$="":QQ$="" 480 RETURN 490 IF E>19 AND E$<>"" THEN 540 500 IF E>20 AND D$<>"" THEN 540 510 IF E>21 AND C$<>"" THEN 540 520 IF E>22 THEN 540 530 RETURN 540 FOR DL=1 TO 500:NEXT DL:PUTSPRITE0,(-32,0):CLS:LOCATE 3,5:PRINT"THE ALIENS HAVE TAKEN OVER":GOTO 610 550 COLOR15,15,15:PUTSPRITE0,(0,209): FOR DL=1 TO 15:NEXT DL:COLOR 15,1,1:GOSUB 960 560 CLS:LOCATE 0,5:PRINT" YOU HAVE DEFEATED THE ALIENS!!!" 570 LOCATE 0,7:PRINT" AND SCARED OFF THE MOTHER SHIP" 580 LOCATE 6,11:PRINT"YOUR SCORE IS:";S 590 LOCATE 0,18:PRINT"BUT ANOTHER WAVE IS APPROACHING." 600 EE=EE+.5:FOR DL=1 TO 1500:NEXT DL:GOTO 70 610 LOCATE 6,10:PRINT"YOUR SCORE WAS:";S:LOCATE 2,20:PRINT"PRESS SPACE-BAR TO PLAY AGAIN" 620 IF NOT STRIG(0) THEN 620 ELSE 60 630 PRINTTAB(10)"INSTRUCTIONS":PRINTTAB(10);"~~~~~~~~~~~~":PRINT:PRINT 640 PRINT" USE THE LEFT AND RIGHT CURSOR":PRINT:PRINT" KEYS TO MOVE YOUR LASER BASE":PRINT:PRINT" AND THE CURSOR UP KEY TO FIRE": PRINT 650 PRINT"QUICK SHOOTING EARNS MORE POINTS":PRINT"AS DOES HITTING THE MOTHER SHIP":PRINT:PRINT" AND A NEW WAVE ARRIVES AFTER":PRINT:PRINT" EACH WAVE IS DESTROYED AND" 660 PRINT:PRINT" THE MOTHER SHIP IS BEATEN OFF":LOCATE 8,22:PRINT"ONE MOMENT PLEASE" 670 RESTORE 840 680 SP$="":FOR J=0 TO 7:READ K 690 SP$=SP$+CHR$(K):NEXT J 700 SPRITE$(0)=SP$ 710 SP$="":FOR I=0 TO 7 720 SP$=SP$+CHR$(VPEEK(1504+I)) 730 NEXT I:SPRITE$(1)=SP$ 740 FOR H=2 TO 3:SP$(H)="":FOR I=0 TO 31:READ SP 750 SP$(H)=SP$(H)+CHR$(SP):NEXT I 760 SPRITE$(H)=SP$(H): NEXT H 770 RESTORE 870 780 READ CH:IF CH=999 THEN 820 790 FOR J=0 TO 7:READ K 800 VPOKE CH*8+J,K:NEXT J 810 GOTO 780 820 LOCATE 4,22:PRINT"PRESS SPACE-BAR TO PLAY" 830 IF NOT STRIG(0)THEN 830 ELSE RETURN 840 DATA 12,12,12,30,30,63,63,63 850 DATA 0,0,0,0,7,31,63,237,237,63,31,7,0,0,0,0,0,0,0,0,224,248,252,191,191,252,248,224,0,0,0,0 860 DATA 0,0,0,0,7,31,63,251,251,63,31,7,0,0,0,0,0,0,0,0,224,248,252,111,111,252,248,224,0,0,0,0 870 DATA 35,130,68,124,84,124,68,130,0,36,68,40,124,84,124,40,68,0,42,124,214,254,108,254,146,40,108,43,124,214,254,108,254,40,40,198,96,17,186,124,62,255,126,92,138,97,161,82,42,28,63,200,166,36 880 DATA 104,28,62,42,127,20,34,65,0,105,28,62,42,127,20,34,34,34,112,56,124,130,214,124,40,40,40,113,56,124,130,214,124,40,68,130,120,255,171,213,171,213,171,213,255,999 890 COLOR 1,1,1:SCREEN 3 900 OPEN "GRP:"AS#1 910 FOR I=1 TO 10:M$="M.S.X":Y=24:X=48 920 FOR K=1 TO 2:FOR J=1 TO LEN(M$):COLOR RND(1)*14+2 930 PRESET(X,Y):PRINT#1,MID$(M$,J,1) 940 X=X+32:NEXT J 950 M$="INVADERS":Y=120:X=4:NEXT K,I:RETURN 960 Y=1:XR=15:Z=0 970 CL=8192:VPOKE CL+4,112:VPOKE CL+5,128:VPOKE CL+12,240:VPOKE CL+13,160:VPOKE CL+14,208:VPOKE CL+15,192:VPOKE CL+27,166 980 CLS:LOCATE 2,0:PRINT"M.S.X. INVADERS SCORE:";S 990 LOCATE 0,20:PRINTSTRING$(9,120):LOCATE 23,20:PRINTSTRING$(9,120):LOCATE .21:PRINTSTRING$(32,229) 1000 PUTSPRITE 0,(XR*8-2,160),4 1010 FOR DL=1 TO 250:NEXT DL 1020 ON INTERVAL=3 GOSUB1130:ON SPRITE GOSUB 1120 1030 INTERVAL ON:SPRITE ON 1040 ST=STICK(0):IF ST=0 THEN FOR DL=1 TO 10:NEXT DL:GOTO 1100 1050 XR=XR+(ST=7 AND XR>9)-(ST=3 AND XR<22) 1060 PUTSPRITE 0,(XR*8-2,160) 1070 IF ST<>1 THEN FOR DL=1 TO 10:NEXT DL:GOTO 1100 1080 SOUND 0,0:SOUND 7,198:SOUND 8,16:SOUND 12,2:SOUND 13,3 1090 FOR M=148 TO 24 STEP-3:PUTSPRITE 1,(XR*8,M),15:NEXT M:PUTSPRITE 1,(-32,0) 1100 IF Z<0 OR Z>240 THEN 1110 ELSE 1040 1110 INTERVAL OFF:SPRITE OFF:FOR I=0 TO 3:PUTSPRITE I,(-32,0):NEXT I:RETURN 1120 INTERVAL OFF:SPRITE OFF:PUTSPRITE 1,(-32,0):BEEP:FOR DL=1 TO 25:NEXT DL:Y=1.2*-Y:S=S+RND(1)*50+25:LOCATE 24,0:PRINT S:RETURN 1030 1130 Z=Z+Y:PUTSPRITE 2,(Z,24),10,2:PUTSPRITE2,,,3:RETURN 1140 INTERVAL OFF:SPRITE OFF:SCREEN 1:COLOR 15,4,4 |