Construindo o jogo de adivinhação, passo a passo
Chegou a hora de juntar tudo o que você aprendeu num projeto só. Vamos construir o clássico jogo de adivinhar um número secreto, peça por peça, do mais simples ao completo.
Estudar esta lição interativa →Todo projeto grande, mesmo os mais impressionantes, é feito das mesmas peças pequenas que você já aprendeu: variáveis guardando informação, decisões escolhendo caminhos, laços repetindo tarefas, funções organizando passos. Vamos provar isso construindo, peça por peça, o clássico jogo de adivinhar um número secreto. A ideia central de "dividir para conquistar" do Módulo 5 vale aqui também: em vez de escrever o jogo inteiro de uma vez, vamos montá-lo em passos pequenos, testando cada um antes de seguir para o próximo.
Passo 1: comparar um palpite com o segredo. A base de tudo é uma simples comparação, o Módulo 3 puro:
let secreto = 7;
let palpite = 5;
console.log(palpite === secreto);O passo mais simples possível: comparar dois valores.
Passo 2: dar uma dica quando errar. Um jogo de verdade não só diz "certo" ou "errado", ele ajuda: se o palpite for menor que o segredo, avisa para tentar um número maior, e vice-versa. Isso é um if/else if/else encadeado:
let secreto = 7;
let palpite = 5;
if (palpite === secreto) {
console.log("Acertou!");
} else if (palpite < secreto) {
console.log("Muito baixo, tente um número maior.");
} else {
console.log("Muito alto, tente um número menor.");
}Agora com três caminhos possíveis, em vez de dois.
Passo 3: repetir para vários palpites, e parar no acerto. Um jogador de verdade tenta várias vezes, não uma só. Vamos simular isso com uma lista de palpites (no lugar de pedir input, que este editor não recebe) e um laço for que testa cada um, parando assim que acertar:
let secreto = 7;
let palpites = [3, 9, 7, 2];
let tentativas = 0;
let venceu = false;
for (let i = 0; i < palpites.length; i++) {
tentativas++;
let palpite = palpites[i];
if (palpite === secreto) {
console.log("Acertou com " + palpite + " na tentativa " + tentativas + "!");
venceu = true;
break;
} else if (palpite < secreto) {
console.log(palpite + " é muito baixo.");
} else {
console.log(palpite + " é muito alto.");
}
}
console.log("Venceu:", venceu, "| Tentativas:", tentativas);Agora com laço, contador de tentativas e break no acerto.
Repare que cada passo acrescentou uma peça nova sobre a anterior, sem reescrever tudo do zero: primeiro só comparar, depois dar uma dica, depois repetir e parar. É a mesma lógica de montar um móvel seguindo um manual: você não tenta encaixar todas as peças de uma vez às cegas, você segue uma ordem, confirmando cada etapa antes de seguir para a próxima.
Repare na linha break; assim que o jogador acerta: ela encerra o laço imediatamente, mesmo que ainda existissem palpites depois na lista. Sem o break, o laço continuaria testando os palpites restantes, mesmo já tendo achado a resposta certa, o que não faria sentido num jogo de verdade.
Sem o break, o laço não para no acerto: ele segue testando os palpites seguintes da lista, e a variável tentativas continua subindo mesmo depois da vitória, dando um número de tentativas errado no final. É um lembrete de que peças que pareciam simples isoladamente (o laço, o if) interagem de formas que só aparecem quando tudo está montado junto, exatamente por isso vale testar cada passo separado antes de juntar tudo.
let secreto = 7;
let palpites = [3, 9, 7, 2];
let tentativas = 0;
let venceu = false;
for (let i = 0; i < palpites.length; i++) {
tentativas++;
let palpite = palpites[i];
if (palpite === secreto) {
console.log("Acertou com " + palpite + " na tentativa " + tentativas + "!");
venceu = true;
} else if (palpite < secreto) {
console.log(palpite + " é muito baixo.");
} else {
console.log(palpite + " é muito alto.");
}
}
console.log("Venceu:", venceu, "| Tentativas:", tentativas);Adicione break; depois do acerto e rode.