7
respostas

Meu loop p/ limitar a qtd de tentativas não funcionou nem com for() nem com while()

Não consegui entender o porque... quando acerta tudo bem, mas quando erra o loop não encerra nunca, fica infinito... tanto usando "for" quanto usando "while"

<meta charset="utf-8">

<input/>
<button>Você consegue adivinhar o meu segredo?</button>

<script>

    function sorteia() {
        return Math.round(Math.random()*10);
    }

    function sorteiNumero(quantidade) {
        var segredos = [];
        var numero = 1;

        while(numero <= quantidade) {
            var numeroAleatorio = sorteia();

            if(numeroAleatorio != 0) {
                var achou = false;

                for(var posicao = 0; posicao < segredos.length; posicao++) {

                    if(segredos[posicao] == numeroAleatorio) {
                        achou = true;
                        break;
                    }
                }

                if(achou == false) {
                    segredos.push(numeroAleatorio);
                    numero++;    
                }    
            }
        }
        return segredos;
    }

    var segredos = sorteiNumero(3);

    console.log(segredos);

    function mostra() {
        alert("FIM!!! Pressione Enter para reiniciar");
    }

    var input = document.querySelector("input");
        input.focus();

    function verifica() {
        var achou = false;
//        var cont = 1;

//        while(cont < tentativas) {    
            for(var posicao = 0; posicao < segredos.length; posicao++) {
                if(input.value == segredos[posicao]) {
                    alert("Você descobriu meu segredo");
                    achou = true;
                    mostra();
                    break;
                } 
            }
            if(achou == false) {
                alert("Você errou");
//                cont++
            }
            input.value = "";
            input.focus();
//        }

    }

    var tentativas = parseInt(prompt("quantas tentativas você deseja?"));

//    for(var cont = 0; cont < tentativas; cont++) {
        var button = document.querySelector("button");
        button.onclick = verifica;
//    }

    document.write("<br>FIM!!!");

</script>
7 respostas

Olá, Wagner! Tudo bem? Espero que sim!!!

O loop infinito acontece quando não colocamos a variável contador dentro do WHILE ou FOR.

Toda vez que é feito o looping, em vez dele somar a contagem, ele zera e volta a contagem inicial. Isso faz com que nunca saia desse looping até consumir toda a memória do seu computador!

Por isso devemos ter uma atenção quando tivermos usando WHILE ou FOR.

Segue um exemplo:

//Crio uma variável contadora fora do loop
var contador = 0;

//Inicio meu laço
while (contador <= 10) {
    //Escrevo a variável na tela
    document.write (contador);

    //Agora adiciono 1 a cada volta do laço na variável contador
    contador++;
}

Espero ter ajudado, Wagner!!!

Bons estudos e vamos em frente!!!

ok entendo o exemplo...mas no código acima, que eu postei, eu crio as variaveis fora do while... e no for eu crio na hora que declaro a função... continuo nao entendendo....

Wagner, outro ponto importantíssmo, que acabou não saindo na minha resposta acima:

O incremento é quem vai contar a sua variável toda vez dentro do looping.

No WHILE colocamos ele no final e já no FOR ele vai dentro da declaração. Por exemplo:

var numero = 0;

    while (numero <= 10) {

        console.log(numero);

        numero++;        

    }

Perceba que o incremento NUMERO++ é quem somará e guardará na sua variável fora do WHILE até chegar a 10 e comparar se 10 é menor ou igual a 10.

Já no FOR o incremento está dentro da declaração, justamente quando você chama o FOR.

for (numero = 0; numero <= 10; numero++) {
        console.log (numero);
    }

Detalhe: tanto no WHILE como no FOR, também é possível rodar o código sem declarar o incremento.

Se o incremento não for declarado não haverá a soma. Logo, todo o looping lançará:

  • numero igual a zero

  • numero (zero) é menor que 10........sim!

  • imprime zero


  • numero igual a zero

  • numero (zero) é menor que 10........sim!

  • imprime zero


E assim por diante! Não vai parar!!!

Se ainda tiver dúvidas, Wagner, estamos a disposição!!!

Bons estudos!!!

Eu entendi as explicações, porém, não consegui visualizar o erro no meu código! quando usei while, defini a variável antes e incrementei dentro do loop. quando faço for declaro a variável e o incremento na própria função e em nenhum dos dois casos o meu código funcionou. Poderiam, por gentileza, apontar o erro dentro do meu código ?

Olá Wagner, tudo certo?

Basicamente não existe um contador para esse if, que está fora do for:

if(achou == false) {
                alert("Você errou");

Por isso que se você ficar errando o código nunca termina.

Espero ter ajudado, bons estudos!

O código correto:

 function sorteia() {
        return Math.round(Math.random()*10);
    }

    function sorteiNumero(quantidade) {
        var segredos = [];
        var numero = 1;

        while(numero <= quantidade) {
            var numeroAleatorio = sorteia();

            if(numeroAleatorio != 0) {
                var achou = false;

                for(var posicao = 0; posicao < segredos.length; posicao++) {

                    if(segredos[posicao] == numeroAleatorio) {
                        achou = true;
                        break;
                    }
                }

                if(achou == false) {
                    segredos.push(numeroAleatorio);
                    numero++;    
                }    
            }
        }
        return segredos;
    }

    var segredos = sorteiNumero(3);

    console.log(segredos);

    var contador = 0;

    function mostra() {
        alert("FIM!!! Pressione Enter para reiniciar");
    }

    var input = document.querySelector("input");
    input.focus();

    function verifica() {
        var achou = false;

            for(var posicao = 0; posicao < segredos.length; posicao++) {
                if(input.value == segredos[posicao]) {
                    alert("Você descobriu meu segredo");
                    achou = true;
                    mostra();
                    document.write("<br>FIM!!!");
                    break;
                } 
            }
            if(achou == false && contador < tentativas) {
                alert("Você errou");
                contador++;
            }else{
                  document.write("<br>FIM!!!");
            }
            input.value = "";
            input.focus();


    }

    var tentativas = parseInt(prompt("quantas tentativas você deseja?"));


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

Olá Wagner.

O problema com as soluções com while e for que você tentou é que elas não estão agindo junto com o usuário.

    function verifica() {
        var achou = false;
//        var cont = 1;

//        while(cont < tentativas) {    
            for(var posicao = 0; posicao < segredos.length; posicao++) {
                if(input.value == segredos[posicao]) {
                    alert("Você descobriu meu segredo");
                    achou = true;
                    mostra();
                    break;
                } 
            }
            if(achou == false) {
                alert("Você errou");
//                cont++
            }
            input.value = "";
            input.focus();
//        }

    }

Por exemplo essa solução com while ela está parcialmente correta, mas ela não espera a ação do usuário.

        var cont = 1;

A logica do contador cont está correta, porem ele vai começar em 0 já que inicialmente o usuário não fez nenhuma tentativa. E ela vai armazenar as tentativas que o usuário fez, porem ela deveria ser declarada fora da função verifica, porque no lugar que ela está sempre que a função for chamada o valor 1 será atribuído a ela.

if (achou == false) {
                alert("Você errou");
                cont++
            }

E o if está correto, sempre que o usuário errar você soma um no contador, dessa maneira registrando as tentativas dele.

        while (cont < tentativas) {
            for (var posicao = 0; posicao < segredos.length; posicao++) {

O raciocino do while também está correto, o usuário pode tentar enquanto o cont for menor que o numero tentativas , mas o problema é que não temos mudança das variáveis dentro desse while já que ele não está esperando o usuário apertar o botão novamente.

A solução apresentada pelo Diego Rodrigues Cravo Teixeira resolve esse problema já que ele deixa o if abaixo responsável por verificar se o contador já chegou no valor de tentativas.

if(achou == false && contador < tentativas) {

Espero ter ajudado a entender qual era o problema que estava gerando seu erro, mas se ainda estiver com duvida, não hesite em perguntar.

Bons estudos.