quarta-feira, março 08, 2023

MSX Programas: MicroSistemas 52

Neste número da saudosa MicroSistemas, temos um pequeno programa de batalha naval.

Batalha Naval

Artigo Original: Renato da Silva Oliveira e Pierluigi Piazzi

O programa que apresentamos na listagem, ilustra como uma ideia simples pode dar origem a um jogo de razoável complexidade. Uma das coisas mais triviais que se pode pensar, ao fazer um jogo, é num atirador e num alvo. Obviamente, nesses casos, o usuário costuma fazer o papel do atirador. Em nosso exemplo, usamos um navio lançando cargas em profundidade num submarino.

Um pouco mais difícil é engendrar uma forma de fazer com que o usuário tenha que pensar antes de dar seu tiro. Em nosso jogo é praticamente inevitável o uso do fosfato cerebral! O  usuário é obrigado a pensar para obter êxito (e isso, para muitos, dói!).

A ideia por trás de tudo é bastante simples. Para atingir o submarino, o usuário deve dar a posição em que a carga será lançada e isso é feito através da introdução de três números: um que indique a posição na direção Norte e Sul, outro que indique a posição na direção Leste e Oeste e um terceiro indicando a profundidade em que a carga deverá explodir.

O submarino é colocado, ao acaso, dentro de uma região cúbica de 8 Km na direção Norte e Sul, 8 Km na direção Leste e Oeste e 4Km de profundidade. Nessa mesma região, está colocado também o navio lançador de cargas. Observe a figura 1.

Note que o navio sempre fica no vértice do paralelepípedo formado pela região de 8x8x4 quilômetros cúbicos e que o submarino é sempre colocado numa posição de coordenadas inteiras. Por exemplo, ele nunca vai estar em uma profundidade de 2,5 Km (estará a 2 ou a 3 km).

Ao ser executado, o programa pede a introdução dos três números indicadores da posição. Inicialmente, a distância ao longo da direção Norte e Sul (N/S), depois a distância ao longo da direção Leste e Oeste (L/O) e, finalmente, a profundidade (P). O primeiro tiro deve ser dado ao acaso. Lembre-se que os valores para N/S e L/O devem estar entre 0 e 8, e os valores de P devem estar entre 0 e 4. Caso esses limites sejam desrespeitados, o tiro será perdido.

Como resposta a cada tiro, o programa dá uma dica ao usuário: a distância a que a carga explodiu do submarino. Essa distância é calculada através do "Teorema de Pitágoras" aplicado a um espaço tridimensional (Teorema de "Tritágoras"). A ilustração do teorema pode ser vista na figura 2.

É a partir dessa informação que os tiros sub sequêntes devem ser dados. Por exemplo, imagine que seu primeiro tiro tenha sido "4" "1" "3" e que a distância obtida como dica tenha sido "4". Isso significa que a distância em que a carga lançada explodiu do submarino foi de 4 Km.

O segundo lançamento já deve ser feito no sentido de verificar a posição do submarino numa dada direção. Considerando ainda a situação exemplificada anteriormente, suponha que queremos verificar a profundidade. Basta manter os números N/S e L/O e alterar - para mais ou para menos - o número P. Por exemplo, imagine que fizemos o lançamento "4" "1" "2" e que recebemos a dica 5.196. Isso significa que nos afastamos da posição procurada e é conveniente tentarmos outro sentido.

Se tentarmos "4" "1" "4" e obtivermos o mesmo número como dica (5.196), podemos então concluir que a profundidade do submarino é 3 Km. Agora, devemos fazer o mesmo com os números N/S e L/O.

Depois de algumas partidas mal sucedidas, você achará o caminho certo para destruir o submarino. Eventualmente, após adquirir bastante prática, o leitor pode tentar alterar dois ou três números de uma só vez.

Vamos, agora, compreender o programa de modo a sofisticá-lo um pouco. Antes, porém, analisemos suas partes principais:

Inicialização

Esta parte faz a apresentação da tela, recebe o nome do jogador através do teclado e sorteia a posição do submarino na região delimitada para o jogo. O sorteio é realizado através da função RND. Como a posição do submarino é data através de três números, basta fazer um sorteio para cada um deles (veja as linhas 80 a 100). Se você quiser alterar a região onde o submarino pode estar, basta mudar os números 9 e 5 nas linhas 80, 90 e 100.

Lançamentos

Esta parte recebe os dez lançamentos do jogador. Cada lançamento necessita da introdução de três números. Após receber cada um deles através do teclado, o programa calcula a distância entre a posição da explosão e a posição do submarino (através do Teorema de "Tritágoras". Você lembra!?). Finalmente, os dados introduzidos são impressos na tela no formato de uma tabela.

Finalização

Esta parte simplesmente encerra o jogo, informando a vitória ou derrota do jogador. 

Agora sim, vamos incrementar o programa! Uma das grandes vantagens dos micros da linha MSX sobre os outros, está na facilidade com que podemos produzir sons através de seu BASIC. Acrescente ao programa as linhas que constam na listagem 1. Todas elas tornam o programa um pouco mais atrativo. Agora, você pode começar a fazer suas próprias modificações acrescentando outros sons ou fazendo com que o navio e o submarino sejam desenhados na tela.

Listagem 1:

30 INTERVAL ON
40 ON INTERVAL=150 GOSUB 470
270 GOSUB 540
469 REM Som de Fundo
470 SOUND 6,8
480 SOUND 7,55
490 SOUND 10,9
500 SOUND 11,0
510 SOUND 12,180
520 SOUND 13,10
530 RETURN
539 REM Som de Lançamento e Explosão
540 SOUND 6,20
550 SOUND 7,55
560 SOUND 8,16
570 SOUND 11,0
580 SOUND 12,180
590 SOUND 13,10
600 RETURN

Listagem do Jogo:

10 COLOR 4,7:SCREEN 0: WIDTH 38
20 PRINT"BATALHA NAVAL TRI-DIMENSIONAL"
50 PRINT:PRINT"DIGITE SEU NOME ALMIRANTE:"
60 INPUT N$
70 CLS
80 LET LO0=INT(RND(-TIME)*9)
90 LET NS0=INT(RND(-TIME)*9)
100 LET P0=INT(RND(-TIME)*5)
110 LOCATE 2,1:PRINT"ALMIRANTE:";N$
120 LOCATE 2,4:PRINT"TIRO    L/O   N/S   P  - DISTANCIA"
130 FOR T=1 TO 10
140 LOCATE 3,T+5:PRINT T
150 LOCATE 11,T+5
160 LINE INPUT LO$
170 LOCATE 17,T+5
180 LINE INPUT NS$
190 LOCATE 22,T+5
200 LINE INPUT P$
210 LET DLO=VAL(LO$)-LO0
220 LET DNS=VAL(NS$)-NS0
230 LET DP=VAL(P$)-P0
240 LET D=INT(.5+1000*SQR(DLO*DLO+DNS*DNS+DP*DP))/1000
250 LOCATE 26,T+5
260 IF VAL(P$)>4 OR VAL(P$)<0 OR VAL(NS$)>8 OR VAL(NS$)<0 OR VAL(LO$)>8 OR VAL(LO$)<0 THEN PRINT"perdido!":GOTO 300
280 PRINT D
290 IF D=0 THEN GOTO 380
300 NEXT T
310 FOR G=1 TO 10
320 FOR F=2 TO 15:COLOR1,F:CLS:NEXTF
340 NEXT G
350 LOCATE 2,20
360 PRINT:PRINT:PRINT"SEU NAVIO ACABA DE SER ATINGIDO POR UM TORPEDO."
370 GOTO 450
380 FOR G=1 TO 10
390 FOR F=2 TO 15:COLOR1,F:CLS:NEXTF
400 NEXT G
410 LOCATE 2,20
420 PRINT"  PARABENS VOCE FOI PROMOVIDO A"
430 PRINT"  ... ALMIRANTE DE ESQUADRA.":PRINT
440 PRINT"   VOCE FEZ ";11-T;" PONTOS"
450 INPUT "Digite RETURN para nova batalha.";A$
460 RUN

Uma mudança mais estrutural seria fazer com que, após cada tiro, o submarino se deslocasse. Isso tornaria o jogo muito mais difícil.

O programa deve ser digitado, mantendo-se a numeração das linhas da listagem. Posteriormente, você deverá completá-lo com as linhas que estão faltando.


Listagem com alterações sugeridas:
10 COLOR 4,7:SCREEN 0: WIDTH 38
20 PRINT"BATALHA NAVAL TRI-DIMENSIONAL"
30 INTERVAL ON
40 ON INTERVAL=150 GOSUB 470
50 PRINT:PRINT"DIGITE SEU NOME ALMIRANTE:"
60 INPUT N$
70 CLS
80 LET LO0=INT(RND(-TIME)*9)
90 LET NS0=INT(RND(-TIME)*9)
100 LET P0=INT(RND(-TIME)*5)
110 LOCATE 2,1:PRINT"ALMIRANTE:";N$
120 LOCATE 2,4:PRINT"TIRO    L/O   N/S   P  - DISTANCIA"
130 FOR T=1 TO 10
140 LOCATE 3,T+5:PRINT T
150 LOCATE 11,T+5
160 LINE INPUT LO$
170 LOCATE 17,T+5
180 LINE INPUT NS$
190 LOCATE 22,T+5
200 LINE INPUT P$
210 LET DLO=VAL(LO$)-LO0
220 LET DNS=VAL(NS$)-NS0
230 LET DP=VAL(P$)-P0
240 LET D=INT(.5+1000*SQR(DLO*DLO+DNS*DNS+DP*DP))/1000
250 LOCATE 26,T+5
260 IF VAL(P$)>4 OR VAL(P$)<0 OR VAL(NS$)>8 OR VAL(NS$)<0 OR VAL(LO$)>8 OR VAL(LO$)<0 THEN PRINT"perdido!":GOTO 300
270 GOSUB 540
280 PRINT D
290 IF D=0 THEN GOTO 380
300 NEXT T
310 FOR G=1 TO 10
320 FOR F=2 TO 15:COLOR1,F:CLS:NEXTF
340 NEXT G
350 LOCATE 2,20
360 PRINT:PRINT:PRINT"SEU NAVIO ACABA DE SER ATINGIDO POR UM TORPEDO."
370 GOTO 450
380 FOR G=1 TO 10
390 FOR F=2 TO 15:COLOR1,F:CLS:NEXTF
400 NEXT G
410 LOCATE 2,20
420 PRINT"  PARABENS VOCE FOI PROMOVIDO A"
430 PRINT"  ... ALMIRANTE DE ESQUADRA.":PRINT
440 PRINT"   VOCE FEZ ";11-T;" PONTOS"
450 INPUT "Digite RETURN para nova batalha.";A$
460 RUN
470 SOUND 6,8
480 SOUND 7,55
490 SOUND 10,9
500 SOUND 11,0
510 SOUND 12,180
520 SOUND 13,10
530 RETURN
540 SOUND 6,20
550 SOUND 7,55
560 SOUND 8,16
570 SOUND 11,0
580 SOUND 12,180
590 SOUND 13,10
600 RETURN

Links

  • openMSX: Executar este disco no openMSX

Downloads

Nenhum comentário:

Postar um comentário