Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
14
respostas

Jogo da Adivinhação com escolha de dificuldade.

Fiz alguns testes e está funcionando. Mas gostaria de saber se existe alguma forma de simplificar ou melhorar o código de alguma forma. Grato.

<meta charset="utf-8">

<h1> Jogo da Adivinhação </h1>
<hr>

<script>

    function pulaLinha() {

        document.write ("<br>");

    }

    function mostra (texto) {

        document.write (texto);
        pulaLinha ();

    }

    function sorteio (n) {

        return Math.round (Math.random () * n);

    }

    alert ("Bem vindo ao Jogo da Adivinhação!");
    var n = parseInt (prompt ("Escolha a dificuldade do jogo colocando o número limite do sorteio"));
    var numPensado = sorteio (n);
    var chute = parseInt(prompt ("Adivinhe o número que estou pensando de 0 a " + n));

    if (chute == numPensado) {
        mostra ("Parabéns, você acertou o número! A resposta era: " + numPensado);
    } else {
        if (chute > numPensado) {
            mostra ("Foi muito alto, tente novamente! A resposta era: " + numPensado);
        } else {
            mostra ("Foi muito baixo, tente novamente! A resposta era: " + numPensado);
        }    
    }
</script>
14 respostas

Fala Pablo... Beleza?

Ficou massa teu código.

Peguei ele e fiz de uma forma parecida porém o jogo só vai terminar quando você acertar. kkkkk... mas calma que ele vai te dando as dicas se foi menor ou maior no alert.

E no final o script vai te dá a quantidade de vezes que você tentou achar o número.

Dá uma testada e me diz o que achou.

Abs!

<meta charset="utf-8" />

<h1>Jogo da Adivinhação</h1>
<hr />

<script>
  const mostraEPula = (texto) => document.write(`${texto} <br />`);
  const sorteio = (n) => Math.round(Math.random() * n);
  const perguntarNumero = (pergunta) => parseInt(prompt(pergunta));

  alert("Bem vindo ao Jogo da Adivinhação!");

  const n = perguntarNumero(
    "Escolha a dificuldade do jogo colocando o número limite do sorteio"
  );
  const numPensado = sorteio(n);

  let chute = perguntarNumero(
    `Adivinhe o número que estou pensando de 0 a ${n}`
  );
  let acertou = false;
  let tentativas = 1;

  while (!acertou) {
    acertou = chute === numPensado;
    if (acertou) {
      mostraEPula(
        `Parabéns, você acertou o número!\nVocê tentou ${tentativas} vezes.`
      );
      break;
    } else {
      if (chute > numPensado) {
        alert("Foi muito alto, tente novamente!");
        tentativas++;
      } else {
        alert("Foi muito baixo, tente novamente!");
        tentativas++;
      }
    }
    chute = perguntarNumero(`Adivinhe o número que estou pensando de 0 a ${n}`);
  }
</script>

Se preferir, coloquei o código no Github. Pode acessar por aqui.

Testei o jogo aqui e deu certo sim, não sei ainda como funciona alguns dos comandos que você usou, mas vou pesquisar aqui. Achei muito boa essa ideia de ir gravando a quantidade de tentativas e manter o jogador tentando até acertar. E enquanto lia seu código tive a ideia de deixar o jogo um pouco mais divertido.

Para isso criar 2 modos de jogo. Um modo livre, onde o jogador tenta infinitamente até acertar com o número máximo do sorteio que ele escolher (que seria esse que você fez). O outro modo existem algumas dificuldades pré definidas, com um valor x de tentativas pra cada uma e uma quantidade de "vidas" que o jogador tem para acertar o número sorteado, e ao acabar as vidas o jogador perde.

Vou pesquisar sobre esses códigos que não conheço e tentar usar os princípios que aprendi até aqui para fazer isso, se eu travar em algum lugar ou conseguir terminar, trago minhas dúvidas e o código pronto. Muito obrigado pela resposta! xD

Muito bom!!!

Praticar nesses desafios ajuda demais a aprender.

Olá novamente! Depois de quebrar bastante a cabeça eu consegui fazer, porém tem um erro que não estou conseguindo resolver e algumas dúvidas, mas vou mandar em outro comentário...

Sobre o código em si, talvez ele esteja bem porco hehe peço desculpas...

Segue o código:

<meta charset="utf-8" />

<h1>Jogo da Adivinhação</h1>
<hr />

<script>
  const mostraEPula = (texto) => document.write(`${texto} <br />`);
  const sorteioLivre = (n) => Math.round(Math.random() * n);
  const sorteioFacil = () => Math.round(Math.random () * 10);
  const sorteioMedio = () => Math.round(Math.random () * 100);
  const sorteioDificil = () => Math.round(Math.random () * 100); 
  const perguntarNumero = (pergunta) => parseInt(prompt(pergunta));

  alert("Bem vindo ao Jogo da Adivinhação!");
  alert("Selecione o modo de jogo.")

  var modoJogo = prompt("Digite 0 para entrar no modo livre ou 1 para entrar no modo desafiante.")

  if (modoJogo == 0) {

       const n = perguntarNumero("Escolha o número limite do sorteio");
       const numPensado = sorteioLivre(n);
       console.log(numPensado);

       let chute = perguntarNumero(`Adivinhe o número que estou pensando de 0 a ${n}`);
       let acertou = false;
       let tentativas = 1;

       while (!acertou) {
         acertou = chute === numPensado;
         if (acertou) {
            mostraEPula(`Parabéns, você acertou o número!\nVocê tentou ${tentativas} vezes.`);
            break;
         } else {
            if (chute > numPensado) {
            alert("Foi muito alto, tente novamente!");
            tentativas++;
         } else {
            alert("Foi muito baixo, tente novamente!");
             tentativas++;
         }
         }
         chute = perguntarNumero(`Adivinhe o número que estou pensando de 0 a ${n}`);
       }
  } 



  if (modoJogo == 1) {
      alert ("Você entrou no modo desafiante, escolha uma dificuldade.");
      var dificuldade = prompt("Digite o número referente à dificuldade: 1 - Fácil |2 - Médio |3 - Difícil");

      if (dificuldade == 1) {
          let acertou = false;
          let vidas = 4;      

          alert ("Estou pensando em um número de 0 a 10. Você tem 5 tentativas para acertá-lo!");
          const numPensado = sorteioFacil();
          console.log(numPensado);
          let chute = perguntarNumero("Adivinhe o número que estou pensando");

          while (!acertou || vidas != 0) {
              acertou = chute === numPensado;
              if (vidas == 0) {
                  mostraEPula ("Que pena, você perdeu todas as vidas! T-T");
              break;    
              }
              if (acertou == true) {
                  vidas++;
                  mostraEPula ("Parabéns, você acertou o número! Você manteve " + vidas + " vidas!");
              break;
          } else {
              if (chute > numPensado) {
                  alert("Foi muito alto, tente novamente! " + vidas + " vidas restantes!");
                  vidas--;                  
              } else {
                  alert("Foi muito baixo, tente novamente! " + vidas + " vidas restantes!");                  
                  vidas--;
              }
              }
          chute = perguntarNumero();    
          }
          }

  if (dificuldade == 2) {
          let acertou = false;
          let vidas = 9;      

          alert ("Estou pensando em um número de 0 a 100. Você tem 10 tentativas para acertá-lo!");
          const numPensado = sorteioMedio();
          console.log(numPensado);
          let chute = perguntarNumero("Adivinhe o número que estou pensando");

          while (!acertou || vidas != 0) {
              acertou = chute === numPensado;
              if (vidas == 0) {
                  mostraEPula ("Que pena, você perdeu todas as vidas! T-T");
              break;    
              }
              if (acertou == true) {
                  vidas++;
                  mostraEPula ("Parabéns, você acertou o número! Você manteve " + vidas + " vidas!");
              break;
          } else {
              if (chute > numPensado) {
                  alert("Foi muito alto, tente novamente! " + vidas + " vidas restantes!");
                  vidas--;                  
              } else {
                  alert("Foi muito baixo, tente novamente! " + vidas + " vidas restantes!");                  
                  vidas--;
              }
              }
          chute = perguntarNumero();    
          }
          }

          if (dificuldade == 3) {
          let acertou = false;
          let vidas = 4;      

          alert ("Estou pensando em um número de 0 a 100. Você tem 5 tentativas para acertá-lo!");
          const numPensado = sorteioDificil();
          console.log(numPensado);
          let chute = perguntarNumero("Adivinhe o número que estou pensando");

          while (!acertou || vidas != 0) {
              acertou = chute === numPensado;
              if (vidas == 0) {
                  mostraEPula ("Que pena, você perdeu todas as vidas! T-T");
              break;    
              }
              if (acertou == true) {
                  vidas++;
                  mostraEPula ("Parabéns, você acertou o número! Você manteve " + vidas + " vidas!");
              break;
          } else {
              if (chute > numPensado) {
                  alert("Foi muito alto, tente novamente! " + vidas + " vidas restantes!");
                  vidas--;                  
              } else {
                  alert("Foi muito baixo, tente novamente! " + vidas + " vidas restantes!");                  
                  vidas--;
              }
              }
          chute = perguntarNumero ();    
          }
          }
  }
  </script>

Qual é o erro?

Devido ao limite de caracteres, não deu espaço pra mandar as dúvidas...

Primeiramente, tem um problema que não consegui resolver no código do jogo:

  • Quando o jogador realiza a tentativa, automaticamente ele perde uma vida, mesmo ao acertar, então eu acabei desviando desse problema dando uma vida quando acerta, porém se na última vida o jogador acerta o número, a mensagem de game over aparece mesmo assim. Não consegui resolver esse problema...

A respeito das minhas dúvidas:

  • Na linha 25, 32 e 43, você usou ${} para isolar uma variável dentro do texto, mas eu não consegui replicar isso, acabei mantendo para perguntar, apesar de em outros lugares eu acabei usando o método que eu sei.
  • Sobre os comando "const" e "let" pesquisei, entendi mais ou menos o que ele é, mas tive dificuldade em usa-los, talvez ao longo do curso eu vá acabar aprendendo sobre eles eventualmente, mas tem como você me informar a funcionalidade deles nesse código em específico e o que exatamente levou você a substituir os comandos function e var.

Desde já agradeço pelo suporte! :D

Opa..

Vou tentar esclarecer tuas dúvidas.

Na linha 25, 32 e 43, você usou ${} para isolar uma variável dentro do texto...

Ocorre que usei template string ali. Se você observar bem não são aspas simples ou duplas que estão envolvendo a string. São duas crases que envolvem. Sendo assim você consegue utilizar variáveis dentro da template string sem necessidade de utilizar o + para concatenar a string com a variável.

Listo abaixo um exemplo que entrega o mesmo resultado.

const nome = 'Pablo'
const sobrenome = 'Gibrin'

console.log('Olá, meu nome completo é ' + nome + ' ' + sobrenome)
console.log(`Olá, meu nome completo é ${nome} ${sobrenome}`)

Sobre os comando "const" e "let"... Hoje em dia o uso do var é um pouco desencorajado pois o var tem escopo global. E isso pode causar algum bug em programas grandes caso você acesse uma variável que já existe e troque o valor dela, porém de um outro lugar.. de um lugar do codigo que voce nao esperava.

O const e let tem escopo de bloco.

Este link vai te dar uma noção maior sobre a declaração de variáveis.

Variáveis com const não podem ter uma reatribuição de valor enquanto as que são declaradas com let podem.

// pode ser feito
let movel = 'Mesa'
console.log(movel)
movel = 'Cadeira'
console.log(movel)

// não pode ser feito
const movel = 'Mesa'
console.log(movel)
movel = 'Cadeira'
console.log(movel)

Sobre o uso de arrow function é questão de gosto mesmo. =D

Como não sou muito chamar funções antes de declarar elas, não preciso utilizar o hoisting da function.

A arrow function encurta um pouco o código e deixa um pouco mais clean.

function mostra(texto) {
  return texto
}

const mostra = texto => texto

Quando se tem apenas 1 parâmetro podemos ocultar as () dos parâmentros e se ela apenas retorna uma coisa podemos ocultar o return.

Sobre o erro no teu código, eu não consegui entender de fato o que há de errado, desculpe.

Espero ter ajudado!

Abs.

Ah sim, ficou mais claro agora a questão de como usar const e let, realmente acaba deixando o código mais limpo.. alguns termos ainda me confundem mas um pouco de estudo e tudo se resolve :)

Essa template string facilita bastante, acho que vou começar a usar mais kkkk

Sobre o jogo... Não sei se expliquei bem, talvez na prática seja mais fácil entender... no modo que criei Desafiante, o jogador vai perdendo uma vida pra cada erro ao tentar acertar o número do sorteio, dessa forma vou contabilizando as vidas restantes dele. Até aí tudo bem.

Porém, se na última vida o jogador acertar, a mensagem que programei para caso do jogador perder o jogo aparece no lugar da mensagem de vitória. A vida do jogador está sendo descontada não ao errar, mas ao tentar acertar, mesmo que acerte ele perde uma vida.

Fala Pablo...

Cara, aqui rodou normal... fiz o teste e após acertar as 3 opções do desafiante retornou mensagem de vitória com a informação de vidas que eu consegui manter. Bateu certinho tua lógica.

Eu separei os arquivos js para ficar melhor de ler... estava um pouco grande.. essa é uma parte da refatoração. ;D

E ai eu criei um verificador no começo que só aceitará 0 e 1 para iniciar o jogo. Qualquer valor diferente disso ele ficará pedindo os valores corretos.

https://github.com/eraldosiniciof/forum-alura/tree/master/duvida15

O projeto está no meu repositório. Vou tentar colocar no pŕoximo comentário, caso você queira replicar por aqui.

arquivo: index.html

<meta charset="utf-8" />

<h1>Jogo da Adivinhação</h1>
<hr />
<script src="./modoLivre.js"></script>
<script src="./modoDesafiante.js"></script>
<script>
  const mostraEPula = (texto) => document.write(`${texto} <br />`);
  const sorteioLivre = (n) => Math.round(Math.random() * n);
  const sorteioFacil = () => Math.round(Math.random() * 10);
  const sorteioMedio = () => Math.round(Math.random() * 100);
  const sorteioDificil = () => Math.round(Math.random() * 100);
  const perguntarNumero = (pergunta) => parseInt(prompt(pergunta));

  alert("Bem vindo ao Jogo da Adivinhação!");
  alert("Selecione o modo de jogo.");
  const perguntaModo = () =>
    Number(prompt("[ 0 ] para modo livre\n[ 1 ] para modo desafiante"));

  const iniciarJogo = (modo) => {
    while (true) {
      if (modo === 0) {
        modoLivre();
        break;
      }
      if (modo === 1) {
        modoDesafiante();
        break;
      }
      if (modo !== 0 && modo !== 1) {
        alert("Número de modo de jogo errado. Tente novamente.");
        modo = perguntaModo();
      }
    }
  };

  iniciarJogo(perguntaModo());
</script>

arquivo: modoDesafiante.js

const modoDesafiante = () => {
  alert("Você entrou no modo desafiante, escolha uma dificuldade.");
  var dificuldade = prompt(
    "Digite o número referente à dificuldade: \n1 - Fácil\n2 - Médio\n3 - Difícil"
  );

  if (dificuldade == 1) {
    let acertou = false;
    let vidas = 4;

    alert(
      "Estou pensando em um número de 0 a 10. Você tem 5 tentativas para acertá-lo!"
    );
    const numPensado = sorteioFacil();
    console.log(numPensado);
    let chute = perguntarNumero("Adivinhe o número que estou pensando");

    while (!acertou || vidas != 0) {
      acertou = chute === numPensado;
      if (vidas == 0) {
        mostraEPula("Que pena, você perdeu todas as vidas! T-T");
        break;
      }
      if (acertou == true) {
        vidas++;
        mostraEPula(
          "Parabéns, você acertou o número! Você manteve " + vidas + " vidas!"
        );
        break;
      } else {
        if (chute > numPensado) {
          alert(
            "Foi muito alto, tente novamente! " + vidas + " vidas restantes!"
          );
          vidas--;
        } else {
          alert(
            "Foi muito baixo, tente novamente! " + vidas + " vidas restantes!"
          );
          vidas--;
        }
      }
      chute = perguntarNumero();
    }
  }
  if (dificuldade == 2) {
    let acertou = false;
    let vidas = 9;

    alert(
      "Estou pensando em um número de 0 a 100. Você tem 10 tentativas para acertá-lo!"
    );
    const numPensado = sorteioMedio();
    console.log(numPensado);
    let chute = perguntarNumero("Adivinhe o número que estou pensando");

    while (!acertou || vidas != 0) {
      acertou = chute === numPensado;
      if (vidas == 0) {
        mostraEPula("Que pena, você perdeu todas as vidas! T-T");
        break;
      }
      if (acertou == true) {
        vidas++;
        mostraEPula(
          "Parabéns, você acertou o número! Você manteve " + vidas + " vidas!"
        );
        break;
      } else {
        if (chute > numPensado) {
          alert(
            "Foi muito alto, tente novamente! " + vidas + " vidas restantes!"
          );
          vidas--;
        } else {
          alert(
            "Foi muito baixo, tente novamente! " + vidas + " vidas restantes!"
          );
          vidas--;
        }
      }
      chute = perguntarNumero();
    }
  }

  if (dificuldade == 3) {
    let acertou = false;
    let vidas = 4;

    alert(
      "Estou pensando em um número de 0 a 100. Você tem 5 tentativas para acertá-lo!"
    );
    const numPensado = sorteioDificil();
    console.log(numPensado);
    let chute = perguntarNumero("Adivinhe o número que estou pensando");

    while (!acertou || vidas != 0) {
      acertou = chute === numPensado;
      if (vidas == 0) {
        mostraEPula("Que pena, você perdeu todas as vidas! T-T");
        break;
      }
      if (acertou == true) {
        vidas++;
        mostraEPula(
          "Parabéns, você acertou o número! Você manteve " + vidas + " vidas!"
        );
        break;
      } else {
        if (chute > numPensado) {
          alert(
            "Foi muito alto, tente novamente! " + vidas + " vidas restantes!"
          );
          vidas--;
        } else {
          alert(
            "Foi muito baixo, tente novamente! " + vidas + " vidas restantes!"
          );
          vidas--;
        }
      }
      chute = perguntarNumero();
    }
  }
};

tem o modoLivre ainda... vou postar no proximo comentario.

solução!

arquivo: modoLivre.js

const modoLivre = () => {
  const n = perguntarNumero("Escolha o número limite do sorteio");
  const numPensado = sorteioLivre(n);
  console.log(numPensado);

  let chute = perguntarNumero(
    `Adivinhe o número que estou pensando de 0 a ${n}`
  );
  let acertou = false;
  let tentativas = 1;

  while (!acertou) {
    acertou = chute === numPensado;
    if (acertou) {
      mostraEPula(
        `Parabéns, você acertou o número!\nVocê tentou ${tentativas} vezes.`
      );
      break;
    } else {
      if (chute > numPensado) {
        alert("Foi muito alto, tente novamente!");
        tentativas++;
      } else {
        alert("Foi muito baixo, tente novamente!");
        tentativas++;
      }
    }
    chute = perguntarNumero(`Adivinhe o número que estou pensando de 0 a ${n}`);
  }
};

Colocar esses três arquivos e roda o index.html no teu navegador.

Opa, eai, cara ficou muito melhor a visualização do código :o

Realmente estava bem grande e dificultava um pouco pra localizar alguma linha específica. Que bom que deu certo, funcionou aqui os modos, a estética das mensagens do "menu" melhorou também. Vou dar uma revisada no seu código e logo mais dar continuidade no curso, agradeço pela sua ajuda, aprendi bastante nesse desafio. Paz o/

Coisa boa Pablo!!!

E ainda dá pra melhorar mas é melhor "soltar" as versões do que esperar a versão perfeita.

Bons estudos!

hahaha Com certeza! Pode ter certeza que quando eu tiver mais conhecimento vou voltar e otimizar o joguinho. xD

Obrigado novamente! Abraços!!