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

Alert se repetindo mais do que deveria

Boa tarde, no código abaixo tento programar um jogo de adivinhação simples. Tudo ocorre bem, porém o alert programado para o Erro do usuário aparece 3 vezes seguidas, forçando com que o usuário tenha que clicar 3 vezes no 'Ok' para fechá-los. Não encontro meu erro, alguém poderia me ajudar?

<meta charset="UTF-8">
<h1> Adivinha </h1>
<input>
<button> Digite seu chute aqui </button>

<script>

    var numeroPensado = Math.round(Math.random()*10);
    console.log(numeroPensado);
    var tentativas = 1;
    var caixa = document.querySelector("input");
    var botao = document.querySelector("button");

    function reseta(){
        caixa.value = "";
        caixa.focus();
    }


    function ordem(){
        while( tentativas <= 3) {
            if(caixa.value == numeroPensado ) {
                alert("Você acertou!");
                reseta();
                break;
            } else {
                alert("Você errou.");
                reseta();
                }        
                tentativas++;
        }
    }
    botao.onclick = ordem;
    reseta();

</script>
4 respostas

Oi, Gabriel! Então, o que acontece é que seu loop while na função ordem não espera o usuário digitar outro número no input para rodar o próximo loop. Assim, no caso do else (porque no caso do if há o break, quebrando o laço while), todo o código vai ser executado logo na primeira vez que a função ordem for chamada. O que eu recomendaria pra você é mudar esse laço while para uma condição if, dessa forma:

function ordem(){
    if(tentativas <= 3) {
        if(caixa.value == numeroPensado ) {
            alert("Você acertou!");
            reseta();
        } else {
            alert("Você errou.");
            reseta();
        }        
        tentativas++;
    }
}

O que acha dessa solução, Gabriel?

Yan, desde já, obrigado. Entendi a solução, porém continuo em dúvida quanto ao meu erro. No caso do meu código, o erro estaria no uso indevido do break? O breakfaz com que apenas o elseseja repetido? Obrigado!

solução!

Gabriel, a questão é que não é um erro tão objetivo e direto, é um erro de lógica. No seu código, o loop é executado por inteiro no momento que você aperta o botão, quando o que você quer, na verdade, não é um loop, mas sim que o código seja executado a cada vez que o botão é apertado. O erro, na minha opinião, foi optar pelo while. Espero que tenha ficado mais claro, peço perdão pela confusão!

Entendi, ficou claro agora. Muito obrigado, ajudou bastante!