Solucionado (ver solução)
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!!