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

Erro no looping

Usando o modelo da aula de simulação de login e misturando com o jogo da adivinhação, eu resolvi criar um jogo que te dá mais 2 chances para adivinhar o número.

O problema é que quando a pessoa acerta da segunda vez ou quando não acerta de jeito nenhum, o programa não executa nenhuma ação, ele apenas para. Alguém saberia dizer onde está o problema?

<meta charset="UTF-8">

<h1>Tente adivinhar o número em que estou pensando:</h1>

<input>
<button>Pensamos o mesmo número?</button>

<script>

    var numero = document.querySelector("input");
    var numeroAleatorio = Math.round(Math.random() * 10);
    console.log(numeroAleatorio);


    function acertou(){

        if (numero.value == numeroAleatorio || numero == numeroAleatorio){

            alert ("SIM! Eu também pensei no número " + numeroAleatorio);

            numeroAleatorio = Math.round(Math.random() * 10);
            console.log(numeroAleatorio);
        }
    }

    function errou (){

        for (var tentativas = 2; tentativas > 0; tentativas--){

            if (numero.value != numeroAleatorio && numero != numeroAleatorio) {
                alert("O número em que eu pensei é diferente, mas você pode tentar adivinhá-lo mais " + tentativas + " vez(es).");
                numero = parseInt(prompt("Digite um novo chute."));

            }else if (numero == numeroAleatorio){

                acertou();
                break;

            }else if (numero != numeroAleatorio && tentativas == 0){

                alert("Você NÃO adivinhou e não tem mais tentativas. Eu pensei no número " + numeroAleatorio);
                numeroAleatorio = Math.round(Math.random() * 10);
                console.log(numeroAleatorio);
            }
        }
    }

    function verifica (){

        if(numero.value == numeroAleatorio){

            acertou();

        }else{

            errou();
        }

    }

    var button = document.querySelector("button");
    button.onclick = verifica;

    numero.value = "";
    numero.focus();

</script>
4 respostas

Ei Bruna, o problema está dentro do seu laço de repetição (for), quando sua tentativa chega em 1 ele para de executar devido a condição ser tentativa > 0, deveria ser tentativa >= 0 e fazer algumas alterações nas condições dentro do laço. Resolvendo seu problema de forma simples, modifiquei sua função 'error' para que funcione de maneira correta. Existem outras formas para fazer funcionar que eu testei aqui mas fica o desafio.

function errou (){
        for (var tentativas = 2; tentativas >= 0; tentativas--){

            if (numero.value != numeroAleatorio && numero != numeroAleatorio && tentativas > 0) {
                alert("O número em que eu pensei é diferente, mas você pode tentar adivinhá-lo mais " + tentativas + " vez(es).");
                numero = parseInt(prompt("Digite um novo chute."));

            }else if (numero == numeroAleatorio){
                acertou();
                break;
            }
            if (numero != numeroAleatorio && tentativas == 0){

                alert("Você NÃO adivinhou e não tem mais tentativas. Eu pensei no número " + numeroAleatorio);
                numeroAleatorio = Math.round(Math.random() * 10);
                console.log(numeroAleatorio);
            }
        }
    }

voce pode fazer algumas alterações nas condições dentro do laço, tirando a ultima condição do laço tambem resolveria caso modificasse algumas coisas dentro da função. Boa sorte!

Obrigada! Essa alteração realmente resolveu o problema das tentativas! Só que apareceu outro problema... Se a pessoa não acertar de primeira, independentemente dela acertar ou não durante as tentativas, quando volta para o campo, ainda que ela coloque o número certo, aparece que ela errou. Fora isso, o campo não está ficando vazio ou em foco...

A impressão que eu tenho é que depois que clica no botão nunca mais sai da função 'verifica', a menos que reinicie a página, mas não consigo entender o porquê (acho que passei tanto tempo revirando esse código que minha criatividade acabou).

Tem salvação ou vou ter que criar outro código do zero?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

Bruna, eu fiz assim de uma maneira simples para tentar lhe ajudar e coloquei alguns comentarios no código, veja se consegue entender.

<meta charset="UTF-8">

<h1>Tente adivinhar o número em que estou pensando:</h1>

<input>
<button>Pensamos o mesmo número?</button>

<script>
    // ISSO EXECUTA AO INICIAR O PROGRAMA 
    var numero = document.querySelector("input");
    var numeroAleatorio = Math.round(Math.random() * 10);
    console.log('Primeiro Número aleatorio: ', numeroAleatorio);
    numero.focus();

    // ESSAS FUNCOES EXECUTAM QUANDO SAO CHAMADAS

    // ESSA FUNCAO RESETA O CAMPO INPUT, CRIA UM NOVO NUMERO ALEATORIO E COLOCA O FOCUS.
    function reset() {
        numero.value = "";
        numeroAleatorio = Math.round(Math.random() * 10);
        console.log('Novo Número Aleatorio: ', numeroAleatorio)
        numero.focus();
    }

    // VERIFICO SE O NUMERO DIGITADO NO INPUT É O MESMO QUE O NUMERO ALEATORIO E PASSO ELE POR PARAMETRO
    function verifica (){
        if(numero.value == numeroAleatorio){
            acertou(numero.value);
        }else{
            errou(numero.value);
        }
    }

    // PASSO UM PARAMETRO QUE É O NUMERO DIGITADO
    function acertou(numeroQueFoiDigitado){
        if (numeroQueFoiDigitado == numeroAleatorio){
            alert ("SIM! Eu também pensei no número " + numeroAleatorio);
            reset();
        }
    }

    // RECEBE POR PARAMETRO O VALOR DIGITADO NO INPUT
    function errou(numeroQueFoiDigitado){
        for (var tentativas = 2; tentativas >= 0; tentativas--){
            if (numeroQueFoiDigitado != numeroAleatorio && tentativas > 0) {
                alert("O número em que eu pensei é diferente, mas você pode tentar adivinhá-lo mais " + tentativas + " vez(es).");
                // SE CAIR NESSE ERRO, ELE ALTERA O VALOR QUE VEIO POR PARAMETRO, PELOVALOR QUE FOR DIGITADO NO PROMPT
                numeroQueFoiDigitado = parseInt(prompt("Digite um novo chute."));

            } else if (numeroQueFoiDigitado == numeroAleatorio){
                // SE CAI NESSA CONDICAO ENVIA O VALOR PARA QUE DENTRO DA FUNCAO ACERTOU TRATE E EXIBA A MENSAGEM
                acertou(numeroQueFoiDigitado);
                break;
            }
            // CASO A TENTATIVA SEJA 0 E O VALOR DIFERENTE RETORNA O VALOR QUE FOI PENSADO
            if (numeroQueFoiDigitado != numeroAleatorio && tentativas == 0){
                alert("Você NÃO adivinhou e não tem mais tentativas. Eu pensei no número " + numeroAleatorio);
                reset();
            }
        }
    }

    var button = document.querySelector("button");
    button.onclick = verifica;


</script>

Abraços.

Incrível, Yago! Adorei a ideia de criar a função reset! Muito obrigada!! Agora é continuar estudando para conseguir fazer essa análise sem colar haha