1
resposta

O que há de errado aqui?

1° - Minha função 'numeroAleatorio' está criando mais números aleatórios do que estabeleci no parâmetro ( Era pra gerar 5 números aleatórios mas gera entre 3 e 5).

2° - A função 'verifica' sempre me devolve "Você errou!" , mesmo inserindo um número gerado pelo código.

obs: não sei adicionar tags no tópico

<meta charset="utf-8">

<input/>
<button>Chutar número</button>

<script type="text/javascript">
    function geradorDeNumeros() {

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

    function numeroAleatorio(quantidade) {

        var numeroPensado = [];

        for(var contador = 1; contador <= quantidade; contador++) {

            var gerador = geradorDeNumeros();

            var existe = false;

        if(gerador !== 0) {

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

                if(numeroPensado[posicao] == gerador) {

                existe = true;
                break;    
                }
            }

            if(existe == false) {

                numeroPensado.push(gerador);

            }
        }
    }
    return numeroPensado
    }

    var numeroPensado = numeroAleatorio(5);
    console.log(numeroPensado);


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

    function verifica() {

        var achou = false

        for(var posicao = 0; posicao < numeroPensado; posicao++){

            if(input.value == numeroPensado[posicao]){

                alert("Você acertou!");

                achou = true;
                break;
            }
        }
            if (achou == false){

                alert("Você errou!");
        }
        input.value = "";
        input.focus();

    }

    var button = document.querySelector("button");
    button.onclick = verifica;
</script>
1 resposta

Oi, Vinícius! Tudo certo?

Desde já, peço desculpas pela demora em retornar.

Após testar o seu código, consegui identificar os fatores acerca dos pontos que você trouxe. Vamos olhá-los mais de perto?

1º - quando estamos trabalhando com laços de repetição, optamos pelo for quando temos certeza de quantas vezes será necessário repetir os comandos. Por outro lado, quando não sabemos ao certo a quantidade de vezes que a repetição acontecerá, fazemos uso do while.

O primeiro for da função numeroAleatorio() ocorre até que o contador seja igual ou maior à quantidade (quantidade essa que representa o tamanho da nossa lista numeroPensado). Tendo em vista que não sabemos quantas vezes será necessário verificar se um número gerado já se encontra dentro de numeroPensado, é preciso alterar o for por um while. Com a alteração, seu código ficará desta forma:

var contador = 1;

while (contador <= quantidade) {

    var gerador = geradorDeNumeros();
    var existe = false;

    if(gerador !== 0) {

        for(var posicao = 0; posicao <= numeroPensado.length; posicao++) {
            if(numeroPensado[posicao] == gerador) {
                existe = true;
                break;    
            }
        }

        if(existe == false) {
            numeroPensado.push(gerador);
            contador++
        }
    }
}

Com isso, enquanto contador for menor ou igual a quantidade, todos os comandos do bloco continuarão sendo executados. A única condição para que haja o incremento de contador é quando a variável existe for igual a false (já que, depois disso, o número gerado será adicionado à lista e, portanto, haverá um item a menos para completar os 5 necessários).

Com a maneira antiga, independente se o número gerado estivesse ou não dentro da lista numeroPensado, o incremento aconteceria — o que explica o fato de algumas listas ficarem com 3, 4 ou 5 itens.

2º - para que o laço de repetição da função verifica() aconteça, é necessário verificar se a variável posicao é menor que o tamanho da lista numeroPensado. Observe que, em seu código, faltou adicionar a propriedade length em numeroPensado. Abaixo, temos a estrutura for com a modificação:

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

Depois das modificações que fizemos, o nosso jogo passa a funcionar como queríamos! Vinícius, caso queria ver como ficou o código completo, esta aqui:

<meta charset="utf-8">

<input/>
<button>Chutar número</button>

<script type="text/javascript">
    function geradorDeNumeros() {

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

    function numeroAleatorio(quantidade) {

        var numeroPensado = [];

        var contador = 1;

        while (contador <= quantidade) {

            var gerador = geradorDeNumeros();
            var existe = false;

            if(gerador !== 0) {

                for(var posicao = 0; posicao <= numeroPensado.length; posicao++) {
                    if(numeroPensado[posicao] == gerador) {
                        existe = true;
                        break;    
                    }
                }

                if(existe == false) {
                    numeroPensado.push(gerador);
                    contador++
                }
            }
        }
        return numeroPensado
    }

    var numeroPensado = numeroAleatorio(5);
    console.log(numeroPensado);

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

    function verifica() {

        var achou = false

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

            if(input.value == numeroPensado[posicao]){
                alert("Você acertou!");
                achou = true;
                break;
            }
        }

        if (achou == false){
            alert("Você errou!");
        }
        input.value = "";
        input.focus();

    }

    var button = document.querySelector("button");
    button.onclick = verifica;
</script>

Espero tê-lo ajudado! Fico à disposição para te auxiliar caso surjam dúvidas após minha explicação ou ao longo dos seus estudos.

Grande abraço e até mais.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.