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

(Dúvida) Jogo Adivinha - Condicional Novo Sorteio

<meta charset="UTF-8">
<html>
<script>

    function pulaLinha() {
        document.write("<br>");
    }

    function mostra(frase) {
        document.write(frase);
        pulaLinha();
    }

    function sorteia(n) {
        var nEscolhido = Math.round(Math.random() * n);
        return nEscolhido;
    }

    var numeroPensado = sorteia(100);
    var chute = parseInt(prompt("Digite seu chute:"));

    if (chute == numeroPensado) {
        mostra("Você acertou! Eu pensei no número " + numeroPensado + ".");
    } else if (chute > numeroPensado) {
        mostra("Você errou! O numero que pensei é MENOR do que " + chute + ".");
    } else {
        mostra("Você errou! O número que pensei é MAIOR do que " + chute + ".");
    }

</script>

</html>

Realizando a etapa "Consolidando seu conhecimento 1" e adicionando as condições de número maior ou menor, me ocorreu de criar uma solução para a instrução de sorteio não rodar novamente até que o usuário acerte o número, se orientando apenas pelas dicas "Você errou! O número é maior" - "Você errou, o número é menor". Uma vez que acerte, o programa sai desse loop e é mostrada a mensagem "Você acertou! Pensei no número" tal.

Tentei criar com while, if, if dentro de while, mas não certo. Alguém sabe de uma solução?

10 respostas

Oi, bom teria mostrar como você fez, em tese o problema deveria estar na lógica não no seu uso

 var numeroPensado = sorteia(10);

 var chute = parseInt(prompt("Digite seu chute:"));

    while (chute !== numeroPensado) {
        if (chute > numeroPensado) {
            mostra("Você errou! O numero que pensei é MENOR do que " + chute + ".");
            chute = parseInt(prompt("Digite seu chute:"));
        } else {
            mostra("Você errou! O número que pensei é MAIOR do que " + chute + ".");
            chute = parseInt(prompt("Digite seu chute:"));
        }
        mostra("Você acertou! Eu pensei no número " + numeroPensado + ".");
    }

No trecho acima é a minha tentativa incompleta. No caso, eu quero que " var numeroPensado = sorteia(10); " seja executado apenas quando o usuário acertar; em caso de erro, eu quero que o usuário continue tentando até acertar o número da vez.

Obs.: Por padrão, o código mostrado na aula gera outro número aleatório independentemente de acerto ou erro.

 var numeroPensado = sorteia(10);

 var chute = parseInt(prompt("Digite seu chute:"));

    while (chute !== numeroPensado) {
        if (chute > numeroPensado) {
            mostra("Você errou! O numero que pensei é MENOR do que " + chute + ".");
        } else {
            mostra("Você errou! O número que pensei é MAIOR do que " + chute + ".");
        }
        // tirei para a mensagem pois não faz sentido dentro do while
         chute = parseInt(prompt("Digite seu chute:"));
          if (isNaN(chute)) { // valida se o que foi digitado é numero, no cas isNaN retorna true se não for um numero
              chute = 0; // coloquei zero para limpar o que foi digitado, mas poderias emitir uma alerta 
          }
        // aqui estava exibindo a mensagem, mas tem que ser fora do while pois dentro do while a pessoa ainda não acertou
    }
    mostra("Você acertou! Eu pensei no número " + numeroPensado + ".");

Com seu código acontece a mesma coisa que aconteceu comigo: se acerto de primeira, a mensagem positiva aparece, contudo, se erro, o prompt se repete eternamente e as mensagens de maior ou menor não aparecem, enquanto a página fica carregando durante todo o processo.

Screenshot navegador

Por enquanto vou continuar no curso, mas depois voltarei neste problema pois agora não consigo tirar isso da cabeça hahahaha Mas obrigado.

Opa,

Coloque um log para ver o que está exibindo na console:

var numeroPensado = sorteia(10);
console.log("numeroPensado é: ", numeroPensadado);

 var chute = parseInt(prompt("Digite seu chute:"));
console.log("chute: ", chute);
    while (chute !== numeroPensado) {
        if (chute > numeroPensado) {
            mostra("Você errou! O numero que pensei é MENOR do que " + chute + ".");
        } else {
            mostra("Você errou! O número que pensei é MAIOR do que " + chute + ".");
        }
        // tirei para a mensagem pois não faz sentido dentro do while
         chute = parseInt(prompt("Digite seu chute:"));
         console.log("novo chute é : ", chute);
          if (isNaN(chute)) { // valida se o que foi digitado é numero, no cas isNaN retorna true se não for um numero
              chute = 0; // coloquei zero para limpar o que foi digitado, mas poderias emitir uma alerta 
          }
        // aqui estava exibindo a mensagem, mas tem que ser fora do while pois dentro do while a pessoa ainda não acertou
    }
    mostra("Você acertou! Eu pensei no número " + numeroPensado + ".");

Coloque o prompt fora do IF e a mensagem de acerto fora do while que fica repetindo até acertar. Como o chute é referência do while, pense nele como um contador, normalmente colocamos isso ao final da instrução do laço.

    while (chute !== numeroPensado) {
        if (chute > numeroPensado) {
            mostra("Você errou! O numero que pensei é MENOR do que " + chute + ".");
        } else {
            mostra("Você errou! O número que pensei é MAIOR do que " + chute + ".");
        }
            chute = parseInt(prompt("Digite seu chute:"));
    }
        mostra("Você acertou! Eu pensei no número " + numeroPensado + ".");
solução!

Oi,

Eu fiz assim, e não deu problemas, não deu problema

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

</body>
<script>
    var numeroPensado = 5;
    console.log("numeroPensado é: ", numeroPensado);

    var chute = parseInt(prompt("Digite seu chute:"));
    console.log("chute: ", chute);

    while (chute !== numeroPensado) {
        if (chute > numeroPensado) {
            alert("Você errou! O numero que pensei é MENOR do que " + chute + ".");
        } else {
            alert("Você errou! O número que pensei é MAIOR do que " + chute + ".");
        }
        // tirei para a mensagem pois não faz sentido dentro do while
         chute = parseInt(prompt("Digite seu chute:"));
         console.log("novo chute é : ", chute);
          if (isNaN(chute)) { // valida se o que foi digitado é numero, no cas isNaN retorna true se não for um numero
              chute = 0; // coloquei zero para limpar o que foi digitado, mas poderias emitir uma alerta 
          }
        // aqui estava exibindo a mensagem, mas tem que ser fora do while pois dentro do while a pessoa ainda não acertou
    }
    alert("Você acertou! Eu pensei no número " + numeroPensado + ".");
</script>
</html>

Consegui resolver, mas com uma alteração:

O console mostrava que de fato o var numeroPensado = sorteia(10); fica em pausa até que o usuário acerte o número, mas a mensagem de número maior ou menor não aparecia na interface do navegador. Minha solução foi substituir mostra por alert e mostrar esta mensagem como alerta. O programa segue pedindo um novo número normalmente e ao final, mostra o resultado na interface do usuário. Eu queria que as mensagens de número maior ou menor aparecessem consecutivamente na interface do usuário até que ele acertasse, mas acho que desta forma fica melhor.

Obrigado pela ajuda, Flávio e demais.

Abaixo, o código completo para quem quiser testar:

<meta charset="UTF-8">
<html>
<script>

    function pulaLinha() {
        document.write("<br>");
    }

    function mostra(frase) {
        document.write(frase);
        pulaLinha();
    }

    function sorteia(n) {
        var nEscolhido = Math.round(Math.random() * n);
        return nEscolhido;
    }

    var numeroPensado = sorteia(10);
    console.log("numeroPensado é: ", numeroPensado);

    var chute = parseInt(prompt("Digite seu chute:"));
    console.log("chute: ", chute);
    while (chute !== numeroPensado) {
        if (chute > numeroPensado) {
            alert("Você errou! O numero que pensei é MENOR do que " + chute + ".");
        } else {
            alert("Você errou! O número que pensei é MAIOR do que " + chute + ".");
        }

        chute = parseInt(prompt("Digite seu chute:"));
        console.log("novo chute é : ", chute);
        if (isNaN(chute)) {
            chute = 0;
        }

    }
    mostra("Você acertou! Eu pensei no número " + numeroPensado + ".");

</script>

</html>

Legal,

Sim, de fato quando chamas um metodo, isso o javascript não espera o retorno, uma solução seria colocar async /await

tipo isso:

async adivia() {
...
 await mostra(".......");  // Obriga o javascript a esperar o retorno
...
}

Boa! Vou dar uma estuadada nisso depois. Valeu!