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

Loop infinito

Não consigo achar o erro do loop infinito.

<meta charset="utf-8">>

<input/>
<button>Compare com o meu segredo</button>>



<script>


    function sorteia() {

        return Math.round(Math.random() * 10)

    }

    function sorteiaNumeros(quantidade) {

        var segredos = [];
        var numero = 1;

        while (numero <= quantidade) {

            var numeroAleatorio = sorteia();

            if (numeroAleatorio =! 0) {

                var achou = false;


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


                    if (segredos[z] == numeroAleatorio) {

                        achou = true;
                        break;
                    }
                }


                if (achou == false) {

                    segredos.push(numeroAleatorio);
                    numero++

                }    
            }
        }

        return segredos
    }

    var segredos = sorteiaNumeros(5);


    console.log(segredos);



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


    function verifica() {

        var achou1 = false;

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

            if (input.value == segredos[i]) {

                alert("Voce acertou");
                var achou1 = true;
                break

            }

            }

            if (achou1 == false) {

                alert("Errou!")
                input.value = "";
                input.focus();
        }


        }


    button.onclick = verifica;


</script>>

3 respostas

Oi Pedro, tudo bom?

O problema é que seu while não está batendo nunca a condição:

numero <= quantidade

Isso significa que o numero não está aumentando. Esse comportamento está rolando porque aqui:

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


                    if (segredos[z] == numeroAleatorio) {

                        achou = true;
                        break;
                    }
                }

A gente diz que, se encontrar, é só dar break no for e continuar o while:

        if (achou == false) {

                    segredos.push(numeroAleatorio);
                    numero++

                }    

Então, o que está acontecendo é que ele sempre encontra, e nunca sai do while.

Aqui, acredito que o ideal seja, ao encontrar parar o while. Ou criar algum critério de parada para o while. Se você quiser seguir o primeiro caso, você pode parar a execução dos dois com um return no lugar do break. Algo como:

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

                    if (segredos[z] == numeroAleatorio) {

                        achou = true;
                        return;
                    }
                }

O return para a execução do bloco todo, diferente do break que para apenas o laço de repetição =)

solução!

André,

Obrigado pela ajuda, porém não era esta solução, inclusive ela iria tirar a lógica do programa. Depois muito quebrar a cabeça, descobri que era só um erro de sintaxe: Eu escrevi =! ou invés !=

Troquei e funcionou direitinho.

Boa Pedro, faz todo sentido. Passei batido nessa condição e achei que o problema tava mais pra frente.

Fico feliz que tenha resolvido e obrigado por compartilhar com a gente a solução =)