Páginas

sábado, 2 de janeiro de 2021

sábado, 2 de janeiro de 2021

Nacional: Jogo de Naves (1988)

Jogo de Naves - Rui Pereira

Começamos o novo ano da melhor maneira! Trazemos um jogo luso de 1988, programado em BASIC para modo texto, e que havia sido publicado em forma de listagem de código, num suplemento de jornal no dia 6 de Janeiro de 1989.

Trata-se de "Jogo de Naves" de Rui Manuel Henriques Pereira, um leitor do jornal "A Capital" que enviou alguns dos seus trabalhos para a secção de videojogos desta publicação. O Planeta Sinclair, o nosso blogue-irmão tem vindo a disponibilizar a digitalização de várias edições desta secção de "A Capital", como a que contém este jogo e que pode ser encontrada aqui neste link.

A descrição do jogo apresentada no jornal é parca em detalhes, pelo que só depois de digitarmos a listagem e de a experimentarmos durante uns minutos, é que tivemos uma primeira impressão. De facto, verificamos de que se tratava de uma adaptação de um jogo electrónico bastante popular em Portugal em meados dos anos 80.

Space Revenger
Retirado de http://handheldempire.com/game.jsp?game=2006

A inspiração foi, sem dúvida, o Space Revenger da Tronica, marca que distribuiu vários handhelds electrónicos, os quais eram conhecidos pelo seu visor orientado verticalmente, contrastando com o formato horizontal de muitos jogos electrónicos da época.

Este jogo electrónico tem como premissa controlar um tanque futurista que segue numa autoestrada de três faixas. Temos que abater vagas de naves alienígenas que surgem no horizonte, e desviar dos mísseis disparados em diferentes trajectórias pelos invasores.

O nosso canhão só é capaz de acertar num alvo a uma determinada distancia, pelo que naves demasiado afastadas ou próximas de nós estarão fora do alcance de tiro. Se o nosso tanque for atingido por um míssel perdemos uma das três vidas com que começamos a partida. Cada nave abatida por nós vale 5 pontos.

Inspirado em Space Revenger

E é basicamente o jogo programado por Rui Pereira. Apesar das limitações do modo texto, podemos perceber os vários elementos: temos a autoestrada de três faixas, o grande rectângulo branco na parte de baixo é o nosso tanque, e os rectangulos menores acima representam as naves, já os traços são os mísseis que devemos evitar.

As teclas C e B permitem o tanque movimentar-se para a esquerda e a direita respectivamente. A tecla V corresponde ao disparo. Apesar de muito simples, o jogo consegue ser divertido para um curto programa em BASIC.

Nós teclamos, ajustamos e testamos a listagem no GW-BASIC 3.23. Infelizmente a listagem impressa no jornal tinha alguns pequenos problemas, como erros de digitação, omissões e alguns trechos quase ilegíveis. Fizemos os possíveis para corrigi-los e tornar o jogo funcional sem o descaracterizar em demasia.

O jogo está disponível neste link. O ficheiro .ZIP contém a listagem em BASIC e o jogo compilado para quem não tem o GW-BASIC ou o QBASIC. Aconselhamos a reduzir a velocidade do CPU a quem usar o DOSBOX.

Como a listagem não é muita longa, segue abaixo para os curiosos e interessados!

10 ' RUI PEREIRA 88/6/4
20 ' JOGO DE NAVES
30 ' PARA O IBM PC e COMPATIVEIS
35 ' Ajustes Planeta MS-DOS 2021/01/01
40 CLS:WIDTH 40:KEY OFF
50 PRINT "C-ESQUERDA"
60 PRINT "B-DIREITA"
70 PRINT "V-FOGO"
80 PRINT "PRIMA UMA TECLA"
90 X$=INKEY$: IF X$="" THEN 90
100 PT=0:VD=3
110 A1=0:A2=0:B1=0:B2=0:C1=0:C2=0
120 CLS:AP=18:LOCATE ,,0:E=0:D=0
130 IF VD<>3 THEN 200
140 OPEN "R",#1,"RECORDE",20
150 FIELD #1,8 AS N$ ,12 AS NUMP$
160 GET #1,2
170 NOME$=N$
180 ASDF=CVI(NUMP$)
190 CLOSE #1
200 PRINT "RECORD:";ASDF
210 PRINT NOME$
220 FOR C=13 TO 25 STEP 4
230 FOR L=9 TO 16
240 LOCATE L,C:PRINT "|"
250 NEXT L:NEXT C
260 D1$=" ":D2$=" ":D3$=" ":D4$=" "
270 E1$=" ":E2$=" ":E3$=" ":E4$=" "
280 F1$=" ":F2$=" ":F3$=" ":F4$=" "
290 LOCATE 6,13
300 PRINT "VIDAS  PONTOS"
310 LOCATE 7,13:PRINT VD
320 LOCATE 7,20:PRINT PT
330 LOCATE 15,19:PRINT ""
340 LOCATE 16,18:PRINT "███"
350 FOR A=1 TO 18
360 GOSUB 1170:NEXT A
370 LOCATE 9,14:PRINT "   "
380 IF A2=1 THEN 420
390 E=E+1
400 IF E=4 THEN D1$="│":E=0
410 GOTO 460
420 LOCATE 10,15:PRINT " ":A2=0
430 LOCATE 9,14:PRINT "─█─"
440 RANDOMIZE TIMER:I=RND
450 IF I>=.4 THEN D1$="│" ELSE D1$="\"
460 Z1$=D1$:Z2$=D2$:Z3$=D3$:Z4$=D4$
470 C=14:GOSUB 1390
480 D1$=Z1$:D2$=Z2$:D3$=Z3$:D4$=Z4$
490 FOR A=1 TO 18
500 GOSUB 1170:NEXT A
510 LOCATE 9,18:PRINT "   "
520 IF B2=0 THEN 550
530 LOCATE 10,19:PRINT " ":B2=0
540 LOCATE 9,18:PRINT "─█─":E1$="│"
550 Z1$=E1$:Z2$=E2$:Z3$=E3$:Z4$=E4$
560 C=18:GOSUB 1390
570 E1$=Z1$:E2$=Z2$:E3$=Z3$:E4$=Z4$
580 FOR A=1 TO 18
590 GOSUB 1170:NEXT A
600 LOCATE 9,22:PRINT "   "
610 IF C2=1 THEN 650
620 D=D+1
630 IF D=4 THEN F1$="│":D=0
640 GOTO 690
650 LOCATE 10,23:PRINT " ":C2=0
660 LOCATE 9,22:PRINT "─█─"
670 RANDOMIZE TIMER:I=RND
680 IF I>=.4 THEN F1$="│" ELSE F1$="/"
690 Z1$=F1$:Z2$=F2$:Z3$=F3$:Z4$=F4$
700 C=22:GOSUB 1390
710 F1$=Z1$:F2$=Z2$:F3$=Z3$:F4$=Z4$
720 FOR A=1 TO 18
730 GOSUB 1170:NEXT A
740 IF A1=0 THEN 770
750 LOCATE 11,15:PRINT " ":A1=0
760 LOCATE 10,15:PRINT "▄":A2=1
770 FOR A=1 TO 17
780 GOSUB 1170:NEXT A
790 IF B1=0 THEN 820
800 LOCATE 11,19:PRINT " ":B1=0
810 LOCATE 10,19:PRINT "▄":B2=1
820 FOR A=1 TO 18
830 GOSUB 1170:NEXT A
840 IF C1=0 THEN 870
850 LOCATE 11,23:PRINT " ":C1=0
860 LOCATE 10,23:PRINT "▄":C2=1
870 FOR A=1 TO 18
880 GOSUB 1170
890 NEXT A
900 RANDOMIZE TIMER:I=RND
910 IF I>=.5 THEN 930
920 LOCATE 11,15:PRINT "■":A1=1
930 FOR A=1 TO 18
940 GOSUB 1170:NEXT A
950 RANDOMIZE TIMER:I=RND
960 IF I>.5 THEN 980
970 LOCATE 11,19:PRINT "■":B1=1
980 FOR A=1 TO 18
990 GOSUB 1170:NEXT A
1000 RANDOMIZE TIMER:I=RND
1010 IF I>=.5 THEN 350
1020 LOCATE 11,23:PRINT "■":C1=1
1030 GOTO 350
1040 OPEN "R",#1,"RECORDE",20
1050 FIELD #1, 8 AS N$ ,12 AS NUMP$
1060 GET #1,2
1070 NOME$=N$
1080 QW=CVI(NUMP$)
1090 IF PT<>"B" AND H$<>"b" THEN 1210
1200 AN=AP+4:S=26:GOTO 1230
1210 IF H$<>"C" AND H$<>"c" THEN RETURN
1220 AN=AP-4:S=10
1230 IF AN=S THEN RETURN
1240 LOCATE 15,AP+1:PRINT " "
1250 LOCATE 16,AP:PRINT "   "
1260 LOCATE 15,AN+1:PRINT ""
1270 LOCATE 16,AN:PRINT "███"
1280 AP=AN:RETURN
1290 FOR L=14 TO 10 STEP -2
1300 LOCATE L,AP+1:PRINT CHR$(34):NEXT L
1310 IF AP=14 THEN I=A2:A2=0:GOTO 1330
1320 IF AP=18 THEN I=B2:B2=0 ELSE I=C2:C2=0
1330 IF I=0 THEN 1360
1340 LOCATE 10,AP+1:PRINT "*"
1350 PT=PT+5:LOCATE 7,20:PRINT PT
1360 FOR L=14 TO 10 STEP -2
1370 LOCATE L,AP+1:PRINT " "
1380 NEXT L:RETURN
1390 IF Z4$=" " THEN 1530
1400 IF Z4$="│" THEN CV=C:CN=C:P=C:GOTO 1430
1410 IF Z4$="\" THEN CV=18:CN=20 ELSE CV=20:CN=18
1420 P=18
1430 LOCATE 14,CV:PRINT " "
1440 LOCATE 16,CN:PRINT Z4$:Z4$=" "
1450 IF AP<>P THEN 1520
1460 LOCATE 15,P:PRINT "\|/"
1470 LOCATE 16,P:PRINT "( )"
1480 VD=VD-1:LOCATE 7,13:PRINT VD
1490 IF VD=0 THEN LOCATE 12,14 ELSE 1510
1500 PRINT "FIM DE JOGO":FOR J=1 TO 3000:NEXT J
1505 LOCATE 24,1:CLS:GOTO 1040
1510 FOR J=1 TO 2500:NEXT J:GOTO 110
1520 LOCATE 16,P:PRINT "   "
1530 IF Z3$=" " THEN 1580
1540 IF Z3$="│" THEN CV=C:CN=C:GOTO 1560
1550 IF Z3$="\" THEN CV=16:CN=18 ELSE CV=22:CN=20
1560 LOCATE 12,CV:PRINT " ":Z4$=Z3$
1570 LOCATE 14,CN:PRINT Z3$:Z3$=" "
1580 IF Z2$=" " THEN 1630
1590 IF Z2$="│" THEN CV=C:CN=C:GOTO 1610
1600 IF Z2$="\" THEN CV=14:CN=16 ELSE CV=24:CN=22
1610 LOCATE 10,CV:PRINT " ":Z3$=Z2$
1620 LOCATE 12,CN:PRINT Z2$:Z2$=" "
1630 IF Z1$=" " THEN RETURN
1640 IF Z1$="/" THEN C=24
1650 LOCATE 10,C:PRINT Z1$
1660 Z2$=Z1$:Z1$=" ":RETURN

0 comentários:

Enviar um comentário