1
resposta

LOOP INFINITO - Ajudem por favor !

<meta charset="UTF-8">

<form>                                      <!-- a tag form dá foco no botão. -->
<button>Compare com o meu segredo</button>
<input/>
</form>

<script>
   
   function sorteia(){

        return Math.round(Math.random() * 10); //retorna um número aleatório

   }

   function sorteiaNumeros(quantidade){
        var segredos = [];
        var contador = 1;

        while(contador <= 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){  //se não achou o numero, incrementará um novo número aleatório
                      segredos.push(numeroAleatorio); 
                      contador++;
            }
            
        }
        return segredos;

    }
   var segredos = sorteiaNumeros(15);
   
   console.log(segredos);

   var entrada = document.querySelector("input"); //captura a entrada da tag input do html
                                                  //e atribui a variavel entrada.
   entrada.focus();
    
    
    function verifica() {

        var achou = false;

        for(var n=0; n < segredos.length; n++){
            
            if(entrada.value == segredos[n]) { //compara a entrada capturada a cada valor no array.

                alert("Você ACERTOU!");
                achou = true;
                break;
            } 
        }
       
        if(achou == false){
            alert("Você ERROU!!!!!!!!");
        }

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

    var botao = document.querySelector("button"); //passa a tag button para a variável botao

    botao.onclick = verifica; //associa ao botão a execução do verifica, ou seja, somente ao clicar,
                              //leva o conteúdo da função para dentro do onclick do botao
                              //(que já tem o parâmetro button) e executa a função.

</script>``
1 resposta

Opa beleza???

Acredito que identifiquei o erro, está solicitando que sorteie 15 numeros mas o teu range máximo do método sorteia é 10 aí qdo ele encontra do 1 ao 10 não consegue sortear mais e entra em loop. Abaixo eu fiz dois códigos, um seguindo o modelo que implementou com algumas melhorias e o segundo completamente refatorado para que possa usar de referência e aprender um pouco mais.

Bons estudos!!!!


    function sorteia() {
        return Math.round(Math.random() * 10); //retorna um número aleatório
    }

    function sorteiaNumeros(quantidade) {
        var segredos = [];
        var contador = 1;

        while(contador <= quantidade) {
            var achou = false;

            // garantindo que não sorteie o zero
            do {
                numeroAleatorio = sorteia();
            } while (numeroAleatorio == 0);
                
            // entrando na validação quando houver pelo menos 1 segredo adicionado
            if (segredos.length) {
                for (var posicao = 0; posicao < segredos.length; posicao++) {
                    if (segredos[posicao] == numeroAleatorio) {
                        achou = true;
                        break;
                    }
                }
            }
            
            // se não achou o numero, incrementará um novo número aleatório
            if (achou == false) {  
                segredos.push(numeroAleatorio); 
                contador++;
            }
        }
        
        return segredos;
    }

    /** 
     * o método sorteia tem um limite máximo de 10 números,
     * você estava solicitando 15, por isso o looping infinito 
     * poderá atribuir até no máximo 10
     **/
    var segredos = sorteiaNumeros(10); 
   
    console.log("Segredos " + segredos + " - qtde segredos: " + segredos.length);

Refatorado:

    function sorteiaRefatorado(intervaloMax = 10) {
        // desta forma fica entre 1-10 sem o zero
        return Math.round(Math.random() * (intervaloMax - 1)) +1;
    }

    function sorteiaNumerosRefatorado(quantidade, intervaloMax = 10) {
        let segredos = [];

        if (quantidade > intervaloMax) {
            console.log(`Quantidade não pode ser maior do que ${intervaloMax}`);
            return [];
        }

        while(quantidade) {
            numeroAleatorio = sorteiaRefatorado(intervaloMax);
            // o includes verifica se existe no array, estou negando a condição com a ! antes ( ou seja, se não estiver na array entra no if)
            if (!segredos.includes(numeroAleatorio)) {  
                segredos.push(numeroAleatorio); 
                quantidade--; // como não preciso manter a quantidade, posso fazê-la negativa e não preciso criar uma var de contador
            }
        }
        
        return segredos;
    }

    // Aqui está usando o default com intervalo de 1-10 e sorteando 10 números
    var segredos = sorteiaNumerosRefatorado(10); 
    console.log("Segredos " + segredos + " - qtde segredos: " + segredos.length);

    // Usando intervalo de 1-7 e sorteando 7 números
    var segredos = sorteiaNumerosRefatorado(7, 7); 
    console.log("Segredos " + segredos + " - qtde segredos: " + segredos.length);

    // Usando intervalo de 1-7 e sorteando 8 números, este vai apresentar a mensagem da validação
    var segredos = sorteiaNumerosRefatorado(8, 7); 
    console.log("Segredos " + segredos + " - qtde segredos: " + segredos.length);