Obrigado a Julio Marchi pelo espaço cedido na MSX All |
||
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. 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:
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. 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 erradaCó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 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 |
||