Obrigado a Julio Marchi pelo espaço cedido na MSX All
 

Senha



  English

  Jogo de inteligência, onde o computador escolhe uma seqüência de peças coloridas e cabe ao jogador descobri-la através de pistas que o computador dá sobre o palpite do jogador. Quanto mais rápido o jogador descobrir a seqüência, maior a sua pontuação.


  1. Regras do jogo
  O jogo dispõe de 8 peças coloridas, onde o computador escolhe quatro seqüências de peças distintas e cabe ao jogador descobrir qual as cores e posições corretas das peças escolhidas.
  A cada palpite do jogador o computador informa se:
  • Há uma peça na cor certa e na posição certa
  • Há uma peça na cor certa, mas na posição errada
  • Há uma peça da cor errada

  Obs: o jogo original possui 6 peças coloridas e não permite senhas com peças repetidas. Entretanto, pode-se realizar alterações de modo a deixar o jogo mais fácil ou difícil, mudando o número de peças coloridas e também permitindo que hajam peças iguais na senha.


  2. Rotinas do jogo
  A escolha das quatro peças

  A rotina sorteia aleatoriamente 4 das 8 peças coloridas.
10 DIM SE(4)
500 '
501 ' Cria senha
502 '
510 FOR F=1 TO 4
520 SE(F)=0:S=INT(8*RND(-TIME))+1
530 FOR P=1 TO F:IF SE(P)=S THEN 60 ELSE NEXT P
540 SE(F)=S
550 NEXT F
560 RETURN

  O vetor SE (senha) é criado para armazenar a senha do computador.
  Na linha 520, um número entre 1 e 8 é sorteado. Além disso, a posição atual do vetor é apagada. Isto é necessário porque a linha 530 varre o vetor "SE" de 1 até F, de modo a verificar se o número sorteado já existe. Caso o valor de SE(F) seja um "lixo", a verificação pode falhar.
  Se o valor sorteado "S" não existir, ele é armazenado em "SE(F)".


  Analisando o palpite do jogador

  Uma vez dado o palpite pelo jogador, basta comparar o vetor da senha (SE) com o vetor da jogada (JO). Caso haja peças da cor certa na posição certa, incluir no vetor de análise (AN) o valor 2 para cada ocorrência. Entretanto, se houver peças da cor certa na posição errada, incluir em "AN" o valor 1. O valor 0 indica que a peça é da cor errada.

  Rotina 1
10 DIM SE(4):DIM JO(4):DIM AN(4)
600 '
601 ' Analisa jogada
602 '
610 FOR F=1 TO 4:AN(F)=0:NEXT F
620 P=1:FOR F=1 TO 4:FOR G=1 TO 4
630 IF JO(F)=SE(G) THEN AN(P)=-(F=G)+1:P=P+1:G=5
640 NEXT F,G
650 RETURN

  Na linha 610, o vetor de análise é apagado e preparado para uma nova análise.
  Na linha 630, cada peça do jogador é comparada com as peças do computador. Se forem iguais, um teste é feito para saber se a posição está correta: "-(F=G)+1". Assim, se F=G, o valor retornado é -1 e o resultado final da expressão é 2. Caso F seja diferente de G, o valor da expressão é 1.
  O pequeno "truque" aplicado na linha 630 permite testar e atribuir ao mesmo tempo os valores 1 ou 2 para a peça da cor correta.
  Obs: Caso a peça do jogador seja igual a uma do computador, podemos interromper o laço mais interno e passar para a próxima peça do jogador. Assim, atribui-se "G=5" para que o laço FOR de "G" seja interrompido. Isso é uma espécie de "break" para o laço FOR do Basic.

  Crítica: a rotina 1 é simples, mas o padrão de análise fornecido pode facilitar e muito a descoberta da senha, pois permite uma interpretação na sequência de análise. Por exemplo, se ela retornar o vetor "1,2,0,0", eu posso interpretar que uma pedra está na posição correta e a imediatamente anterior é da cor certa, mas na posição errada.
  Assim, garantindo que o valor 2 na análise venha sempre primeiro que o valor 1, eliminamos esse problema.

  Rotina 2
600 '
601 ' Analisa jogada
602 '
610 FOR F=1 TO 4:AN(F)=0:NEXT F
620 P=1
630 FOR F=1 TO 4
640 IF SE(F)=JO(F) THEN AN(P)=2:P=P+1
650 NEXT F : IF P>4 THEN W=1:RETURN
660 FOR F=1 TO 4:FOR G=1 TO 4 
670 IF JO(F)=SE(G) AND F<>G THEN AN(P)=1:P=P+1:G=5
680 NEXT G,F
690 RETURN

  Essa rotina primeiro analisa as cores iguais na posição correta, para depois procurar as cores certas na posição errada. Dessa forma o valor 2 virá sempre que o valor 1 no vetor de análise.
  A linha 650 testa se o vetor "AN" foi todo preenchido na análise de "cores iguais na posição correta". Se isso ocorrer, significa que o jogador adivinhou a seqüência e o jogo deverá terminar. O flag "W" é sinalizado com o valor 1.


  Decodificando o comando do jogador

  Essa rotina tem como objetivos analisar o vetor de string escrito pelo jogador, identificando os valores corretos de 1 a 8, e passar os valores para o vetor "JO".
400 '
401 ' Decofifica jogada
402 '
410 F=1:IF LEN(JJ$)<>4 THEN F=0:RETURN
420 FOR P=1 TO 4
430 V=VAL(MID$(JJ$,P,1))
440 IF V<1 OR V>8 THEN F=0:RETURN
450 JO(P)=V
460 NEXT P
470 RETURN


  Imprimindo as dicas

  Depois de analisada a jogada, é hora de imprimir o resultado para o jogador:
 * - Há uma peça na cor certa e na posição certa
 . - Há uma peça na cor certa, mas na posição errada
 X - Há uma peça da cor errada
  Código:
300 '
301 ' Imprime analise
302 '
310 FOR F=1 TO 4
320 IF AN(F)=2 THEN PRINT"*"; ELSE IF AN(F)=1 THEN PRINT"."; ELSE PRINT"X";
330 NEXT F:PRINT
340 RETURN



  3. Jogo completo
5 ' MarMSX 2018
10 DIM SE(4):DIM JO(4):DIM AN(4)
20 COLOR 15,1,1:SCREEN0:WIDTH 40:KEY OFF
30 PRINT"Jogo da Senha":PRINT"=============":PRINT
40 R=1:W=0:GOSUB 500
50 LINE INPUT"Entre com a sequencia (1-8): ";JJ$
60 GOSUB 400:IF F=0 THEN 50
70 GOSUB 600:GOSUB 300
80 IF W=0 AND R=8 THEN PRINT"Voce nao descobriu a senha. Fim de jogo.":END
90 IF W=1 THEN PRINT"Voce descobriu a senha em";R;"rodadas.":END
100 R=R+1:GOTO 50
300 '
301 ' Imprime analise
302 '
310 FOR F=1 TO 4
320 IF AN(F)=2 THEN PRINT"*"; ELSE IF AN(F)=1 THEN PRINT"."; ELSE PRINT"X";
330 NEXT F:PRINT
340 RETURN
400 '
401 ' Decofifica jogada
402 '
410 F=1:IF LEN(JJ$)<>4 THEN F=0:RETURN
420 FOR P=1 TO 4
430 V=VAL(MID$(JJ$,P,1))
440 IF V<1 OR V>8 THEN F=0:RETURN
450 JO(P)=V
460 NEXT P
470 RETURN
500 '
501 ' Cria senha
502 '
510 FOR F=1 TO 4
520 SE(F)=0:S=INT(8*RND(-TIME))+1
530 FOR P=1 TO F:IF SE(P)=S THEN 60 ELSE NEXT P
540 SE(F)=S
550 NEXT F
560 RETURN
600 '
601 ' Analisa jogada
602 '
610 FOR F=1 TO 4:AN(F)=0:NEXT F
620 P=1
630 FOR F=1 TO 4
640 IF JO(F)=SE(F) THEN AN(P)=2:P=P+1
650 NEXT F:IF P>4 THEN W=1:RETURN
660 FOR F=1 TO 4:FOR G=1 TO 4 
670 IF SE(F)=JO(G) AND F<>G THEN AN(P)=1:P=P+1:G=5
680 NEXT G,F
690 RETURN

Marcelo Teixeira Silveira
Engenheiro de Sistemas e Computação - UERJ
Mestre em Engenharia de Computação - UERJ

© MarMSX 1999-2018