2
respostas

Manipulando array - função vira um loop infinito

Tentando reproduzir o código visto em aula, eu acabei criando um looping infinito na minha pagina e não consigo encontrar o erro, a pagina só carrega indefinidamente.

<meta charset="utf-8">


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

<script type="text/javascript">

  function sorteia() { //Gera o número aleatório

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

  function sorteiaNumeros(quantidade) { //vai incrementar a lista de array com os números aleatórios

    var segredos = []; // cria array vazio para ser prenchido

    var numero = 1; //variavel para inicializar o loop while e indicar a quantidade máxima de número que temos que gerar

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

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

              if(segredos[posicao] == numeroAleatorio){
                achou = true
                break;;
              }
              if(achou = false){  //após inserir essa parte no código que deu erro, mas preciso dela para que  não seja colocado nenhum valor repetido no array
                segredos.push(numeroAleatorio);
                numero++;
              }
            }

      }
      return segredos
  }
  var segredos = sorteiaNumeros(3); // Aqui é onde definimos o tamanho da array(lista) vazia na função acima
  console.log(segredos);

  var input = document.querySelector("input"); // define a parte da interação do usuário com a caixa a ser prenchida com o chute

  input.focus(); // deixa a borda da caixa a ser prenchida com relevo colorido

  function verifica() { // aqui fazemos a função percorrer o array para saber se a resposta do usuário esta  certa(se estiver dentro do array) ou errada.
      var achou = false;
      var numeroAleatorio

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

        if(input.value == segredos[posicao]){ // aqui é onde a função verifica se o usuário acertou ou não

          alert("Você acertou");
          achou = true;
          break;
      }
    }
    if(achou == false){ // parte da função sinaliza que o usuário respondeu é errada
      alert("Você ERROU")
    }
  input.value = " ";
  input.focus();
  }

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

</script>
2 respostas
for(var posicao = 0; posicao < segredos.length; posicao++){

              if(segredos[posicao] == numeroAleatorio){
                achou = true
                break;;
              }
              if(achou = false){  //após inserir essa parte no código que deu erro, mas preciso dela para que  não seja colocado nenhum valor repetido no array
                segredos.push(numeroAleatorio);
                numero++;
              }
            }

Você criou um array vazio, ou seja, o tamanho dele é zero. A variável posicao, cujo valor inicial é zero, não é menor que o tamanho do array, e as instruções no for não são executadas. numero nunca será incrementada e nunca ficará maior que quantidade, assim, o laço while fica num looping infinito. Você pode usar segredos = new Array(tamanho) para criar o array e ir acessando as posições por indexação em vez de criar um array vazio e ir anexando elementos a ele.

Douglas, tinha algumas linhas erradas no seu código. Eu refiz ele alterando algumas linhas. Compare esse que eu fiz com o seu pra você saber aonde errou, e assim não cometer mais esses erros.

Segue o código:

<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();
            var achou = false;

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

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

            }

            if (achou == false) { //Parte que eu adicionei
                segredos.push(numeroAleatorio);
                numero++;
            }
        }

        return segredos;
    }

    function verifica() {

        var achou = false;

        for(var posicao = 0; posicao < segredos.length; posicao++){
            if(input.value == segredos[posicao]) {
                alert("Você acertou");
                achou = true;
                break;
            }
        }

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

        input.value = " ";
        input.focus();
    }

    var segredos = sorteiaNumeros(3); 
    console.log(segredos);

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

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

</script>

Espero ter ajudado!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software