Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Não sai do loop nunca

Pessoal, boa tarde!

Referente ao exercício/jogo de adivinhar, quis fazer uma implementação aparentemente simple a mais mas não está dando certo de jeito nenhum.

O usuário tem 3 tentativas. Nas 2 primeiras, deve aparecer um alert com "tente novamente". Na 3a e última, aparecer "acabaram as suas chances" porque não faz sentido aparecer "tente novamente".

O programa original estava rodando certo (inclusive fiz ele antes de assistir a resolução para treinar, mesmo), mas quando tentei fazer esta alteração, aparentemente está dando dois problemas:

  1. Mesmo acertando o número, ele fica no loop infinito;
  2. Sempre aparece a mensagem de "acabaram as suas chances", mesmo nas tentativas 1 e 2.

E uma dúvida sobre o "break": o que ele faz "por baixo dos panos" (como o prof Flavio gosta de dizer)? Ele apenas quebra o laço ou ele atribui um valor ao contador ou a alguma variável de codição do laço?

Para mim, faz todo o sentido a forma como está o código, mas não encontro os erros de jeito nenhum.

Solicito ajuda aos Sherlock Holmes da Programação de plantão.

Obs: outra vez, tentei coloca um "if" ou um "else" dentro de outro "else" e não deu certo, também. Não sei se tem alguma sacada diferente para isso ou minha lógica que está errada mesmo.

Valeu, um abraço.

Segue o código:

<meta charset="utf-8">

<script>

function pL() {
    document.write("<br><br>");
}

function mostra(frase) {
    document.write(frase);
    pL();
}

var numeroPensado = Math.round(Math.random() * 10);
console.log (numeroPensado); //serve para ver no console o número

var maxTentativas = 3;
var tentativa = 1;
var totalTentativas = 1;

while (tentativa <= maxTentativas) {

var chute = parseInt(prompt("Dê seu chute!"));

    if (numeroPensado == chute) { //eu acerto, mas não sai do loop nunca!
         mostra("Você acertou!");
         tentativa = maxTentativas; //o break apenas quebra ou faria tentativa = maxTentativas = 1?

     } else { //se errou, checar se é a última tentativa ou não

         if (tentativa = 3) {
             alert("ACABARAM SUAS CHANCES!"); //se esta foi a última chance, não pode mostrar "tente novamente"    

         } else { //se for a tentativa 1 ou 2
            alert("ERROOOUUU! Tente novamente");
            tentativa++; //incremento..ok
            totalTentativas++; //variável auxiliar para contar as tentativas (acho que nem precisa)
        }
    }
}

if(totalTentativas = 4) { 
    mostra("Você gastou todas as suas tentativas!\nO número correto era " + numeroPensado);
}

</script>
3 respostas
solução!

Oi, Marcio.

Duas coisas que eu percebi no seu código:

  • Comparação são feitas com dois símbolos de igual, e você está fazendo com um apenas, ou seja, está atribuindo um valor à variável em questão.

No caso,

         if (tentativa = 3) {

Trocar por

         if (tentativa == 3) {

e

if(totalTentativas = 4) {

Trocar por

if(totalTentativas == 4) {
  • Como você disse, a variável totalTentativas é irrelevante, pode usar tentativa.

  • Quando você chega no ponto (tentativa == 3), seu método mostra corretamenta a mensagem, porém não incrementa a variável. Isso está causando o loop pois ele eternamente ficará no mesmo valor.

Finalmente, o bolo todo ficará assim:

var maxTentativas = 3;
    var tentativa = 1;

    while (tentativa <= maxTentativas) {

    var chute = parseInt(prompt("Dê seu chute!"));

        if (numeroPensado == chute) { //eu acerto, mas não sai do loop nunca!
             mostra("Você acertou!");
             break;

         } else { //se errou, checar se é a última tentativa ou não

             if (tentativa == 3) {
                 alert("ACABARAM SUAS CHANCES!"); //se esta foi a última chance, não pode mostrar "tente novamente"

             } else { //se for a tentativa 1 ou 2
                alert("ERROOOUUU! Tente novamente");
            }
        tentativa++;

        }
    }

    if(tentativa == 4) {
        mostra("Você gastou todas as suas tentativas!\nO número correto era " + numeroPensado);
    }

Noossa, verdade! São 2 iguais e estava faltando o inceremento! Obrigado!!

É nóis! Não esquece de marcar o problema como resolvido.