1
resposta

[Dúvida] Interação no sorteio de números aleatórios retornando NaN

Fiz algumas alterações no jogo do número da sorte.

Ao sortear um novo número, aparentemente numa interação que acontece em um momento aleatório, tenho como numero secreto o valor NaN.

Não consegui entender o porque dessa interação, nem decifrar o momento exato. Pois acontece em momentos diferentes, até mesmo com entradas aparentemente iguais.

Alguém poderia ajudar, por favor?

let listaNumerosEscolhidos = [];
let numeroSecreto;
let numeroMaximo;
let tentativas = 1;

function exibirTextos(tag, texto)
{
    let campo = document.querySelector(tag);
    campo.innerHTML = texto;
}

function verificarChute()
{
    let chute = document.querySelector("input").value;
    let palavraTentativa = tentativas == 1 ? "tentativa" : "tentativas";
    if(chute == numeroSecreto)
        {
            exibirTextos("h1", "Parabéns! Você acertou em " + tentativas + " " + palavraTentativa + ".");
            exibirTextos("p", "Clique em novo jogo para gerar um novo número.");
            document.getElementById("reiniciar").removeAttribute("disabled");
        }
        else if(chute > numeroSecreto)
        {
            tentativas++;
            exibirTextos("h1", "Tente novamente");
            exibirTextos("p", "Escolha um número menor que " + chute);
            limparCampo();
        }else
        {
            tentativas++;
            exibirTextos("h1", "Tente novamente");
            exibirTextos("p", "Escolha um número maior entre " + chute + " a " + numeroMaximo);
            limparCampo();
        }
    
}

function novoJogo()
{
    numeroMaximo = prompt("Digite o número máximo para determinar a dificuldade do jogo");
    console.log("Numero maximo: " + numeroMaximo);
    
    if(numeroMaximo <= listaNumerosEscolhidos.length)
    {
        alert("Número não disponível, escolha outro.")
        return novoJogo();
    }
    else
    {
        numeroSecreto = gerarNumeroAleat(numeroMaximo);
        console.log("Numero secreto: " + numeroSecreto);
        exibirTextos("h1", "O Número Secreto");
        exibirTextos("p", "Escolha um número entre 1 a " + numeroMaximo);
        document.getElementById("reiniciar").setAttribute("disabled", true);
        limparCampo();
        tentativas = 1;
    }
}

function gerarNumeroAleat(maximo)
{
    let numeroEscolhido = parseInt(Math.random() * maximo + 1);
    if(listaNumerosEscolhidos.includes(numeroEscolhido))
    {
        return gerarNumeroAleat();
    }
    else
    {
        listaNumerosEscolhidos.push(numeroEscolhido);
        console.log(listaNumerosEscolhidos);
        return numeroEscolhido;
    }
   
}

function limparCampo()
{
    chute = document.querySelector('input');
    chute.value = '';
}

if(numeroMaximo == null){
    exibirTextos("h1", "O Número Secreto");
    exibirTextos("p", "Clique em Novo Jogo para começar");
}
<!DOCTYPE html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://code.responsivevoice.org/responsivevoice.js"></script>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@700&family=Inter:wght@400;700&display=swap"
        rel="stylesheet">
    <link rel="stylesheet" href="style.css">
    <title>JS Game</title>
</head>

<body>

    <div class="container">
        <div class="container__conteudo">
            <div class="container__informacoes">
                <div class="container__texto">
                    <h1></h1>
                    <p class="texto__paragrafo"></p>
                </div>
                <input type="number" min="1" max="10" class="container__input">
                <div class="chute container__botoes">
                    <button onclick="verificarChute()" class="container__botao">Chutar</button>
                    <button onclick="novoJogo()" id="reiniciar" class="container__botao" >Novo jogo</button>
                </div>
            </div>
            <img src="./img/ia.png" alt="Uma pessoa olhando para a esquerda" class="container__imagem-pessoa" />
        </div>
    </div>




    <script src="app.js" defer></script>
</body>

</html>
1 resposta

Olá, Julio.

Tudo bem?

Eu testei aqui e percebi que o jogo depende do "númeroMáximo" para definir o intervalo do número aleatório, porém você só pede esse número na função novoJogo(), e essa função só é acionada quando clica no botão Novo Jogo, por isso quando inicia o jogo sem apertar, ele vem com esse número máximo como undefined. Para resolver você pode chamar a função no código assim que o programa for executado, dessa forma ele já inicia pedindo o número máximo, e as outras vezes só vai pedir quando clicar no botão Novo jogo, eu testei dessa forma e funcionou.

Veja que eu chamei a função novoJogo() logo após a declaração dessa mesma função:

function novoJogo()
{
    numeroMaximo = prompt("Digite o número máximo para determinar a dificuldade do jogo");
    console.log("Numero maximo: " + numeroMaximo);
    
    if(numeroMaximo <= listaNumerosEscolhidos.length)
    {
        alert("Número não disponível, escolha outro.")
        return novoJogo();
    }
    else
    {
        numeroSecreto = gerarNumeroAleat(numeroMaximo);
        console.log("Numero secreto: " + numeroSecreto);
        exibirTextos("h1", "O Número Secreto");
        exibirTextos("p", "Escolha um número entre 1 a " + numeroMaximo);
        document.getElementById("reiniciar").setAttribute("disabled", true);
        limparCampo();
        tentativas = 1;
    }
}

novoJogo()                     //AQUI

Assim ele sempre roda a função novoJogo() quando recarrega a página ou executa o programa a primeira vez.

Veja se faz sentido, faça o teste e qualquer coisa manda aqui de novo.

Espero ter ajudado. Bons estudos.