@joao.labs@joao.labs
Voltar para o blog
Desafio de Programação

Desafio: Pedra, Papel e Tesoura

O desafio

Vamos criar um jogo de Pedra, Papel e Tesoura. ✊🫱✌️

O jogador escolhe uma jogada e o computador sorteia outra. Depois, o programa precisa descobrir quem ganhou ou se houve empate.

Parece simples, mas esse pequeno desafio reúne vários fundamentos importantes:

  • entrada de dados;
  • variáveis;
  • arrays;
  • números aleatórios;
  • condições;
  • operadores AND e OR;
  • tomada de decisão.

Em vez de tentar resolver tudo de uma vez, vamos quebrar o problema em partes menores.

1. Como receber a jogada do player?

Primeiro, precisamos definir quais são as opções do jogo.

const opcoes = [
  "🪨 Pedra",
  "📄 Papel",
  "✂️ Tesoura"
];

Cada opção ocupa uma posição na lista:

0 → 🪨 Pedra
1 → 📄 Papel
2 → ✂️ Tesoura

Agora podemos pedir ao jogador que escolha uma delas:

const jogadaDoPlayer = prompt(
  "0: 🪨 Pedra, 1: 📄 Papel, 2: ✂️ Tesoura"
);

O jogador pode digitar 0, 1 ou 2.

Assim, podemos usar esse número para acessar a opção correspondente:

console.log(opcoes[jogadaDoPlayer]);

Se jogadaDoPlayer for 1, por exemplo:

opcoes[1] → 📄 Papel

2. Como sortear a jogada do computador?

Agora precisamos fazer o computador escolher uma das três opções.

Para isso, podemos usar Math.random().

Math.random();

Math.random() gera um número aleatório entre 0 e 1.

Por exemplo:

0.23
0.71
0.94

Mas precisamos de um número inteiro entre 0 e 2.

Podemos multiplicar o resultado por 3:

Math.random() * 3;

Agora teremos valores entre 0 e 3, mas ainda com casas decimais.

É aqui que entra o Math.floor().

Como funciona o Math.floor()?

Math.floor() arredonda um número para baixo.

Por exemplo:

Math.floor(2.8);
Math.floor(1.9);
Math.floor(0.4);

Os resultados serão:

2
1
0

Então podemos combinar as duas funções:

Math.floor(Math.random() * 3);

O resultado será sempre 0, 1 ou 2.

Por isso:

const jogadaDoCpu = Math.floor(Math.random() * 3);

é suficiente para sortear uma das três jogadas.

A lógica é:

  • O Math.random() sorteia número entre 0.0 e 1.0
  • Multiplicamos por 3
  • Com Math.floor() arrendondamos
  • Resultado: temos números aleatórios 0,1 e 2

Mostrando as jogadas

Agora temos as duas escolhas:

const jogadaDoPlayer = prompt(
  "0: 🪨 Pedra, 1: 📄 Papel, 2: ✂️ Tesoura"
);

const jogadaDoCpu = Math.floor(Math.random() * 3);

Podemos mostrar o que cada um escolheu:

console.log(`Você escolheu: ${opcoes[jogadaDoPlayer]}`);
console.log(`CPU escolheu: ${opcoes[jogadaDoCpu]}`);

Por exemplo:

Você escolheu: 📄 Papel
CPU escolheu: 🪨 Pedra

3. Como saber quem ganhou, perdeu ou se empatou? 🏆🍌🤝

Primeiro, temos uma situação fácil de verificar:

Se os dois escolheram a mesma coisa, houve empate.

if (jogadaDoPlayer == jogadaDoCpu) {
  console.log("Empatou 🤝");
}

A condição compara as duas jogadas.

Se forem iguais, temos um empate.

Como saber se o player ganhou?

Precisamos representar as regras do jogo.

O jogador ganha em três situações:

🪨 Pedra vence ✂️ Tesoura
📄 Papel vence 🪨 Pedra
✂️ Tesoura vence 📄 Papel

Podemos transformar cada uma dessas regras em uma condição.

jogadaDoPlayer == 0 && jogadaDoCpu == 2

Isso significa:

O jogador escolheu Pedra E o computador escolheu Tesoura.

O operador AND

O && representa AND, ou seja, "E".

As duas condições precisam ser verdadeiras.

Por exemplo:

jogadaDoPlayer == 0 && jogadaDoCpu == 2

Para essa expressão ser verdadeira:

  • o jogador precisa ter escolhido 0;
  • o computador precisa ter escolhido 2.

Se apenas uma delas for verdadeira, o resultado será falso.

O operador OR

Também temos o ||, que representa OR, ou seja, "OU".

Ele permite juntar as três maneiras diferentes de o jogador ganhar:

(jogadaDoPlayer == 0 && jogadaDoCpu == 2) ||
(jogadaDoPlayer == 1 && jogadaDoCpu == 0) ||
(jogadaDoPlayer == 2 && jogadaDoCpu == 1)

Podemos ler isso como:

O jogador ganhou se Pedra contra Tesoura OU Papel contra Pedra OU Tesoura contra Papel.

Cada bloco representa uma possibilidade de vitória.

O || diz que basta uma delas ser verdadeira.

Juntando as regras

Agora conseguimos montar a decisão completa:

if (jogadaDoPlayer == jogadaDoCpu) {
  console.log("Empatou 🤝");
}
else if (
  (jogadaDoPlayer == 0 && jogadaDoCpu == 2) ||
  (jogadaDoPlayer == 1 && jogadaDoCpu == 0) ||
  (jogadaDoPlayer == 2 && jogadaDoCpu == 1)
) {
  console.log("Você ganhou 🏆");
}
else {
  console.log("Computador venceu 💻");
}

A lógica fica:

O programa toma as decisões em ordem.

Primeiro verifica o empate.

Se não houve empate, verifica se o jogador venceu.

Se nenhuma dessas situações aconteceu, sobra uma possibilidade:

O computador venceu 💻

O código completo

Agora podemos juntar todas as partes:

const opcoes = [
  "🪨 Pedra",
  "📄 Papel",
  "✂️ Tesoura"
];

const jogadaDoPlayer = prompt(
  "0: 🪨 Pedra, 1: 📄 Papel, 2: ✂️ Tesoura"
);

const jogadaDoCpu = Math.floor(Math.random() * 3);

console.log(`Você escolheu: ${opcoes[jogadaDoPlayer]}`);
console.log(`CPU escolheu: ${opcoes[jogadaDoCpu]}`);

if (jogadaDoPlayer == jogadaDoCpu) {
  console.log("Empatou 🤝");
}
else if (
  (jogadaDoPlayer == 0 && jogadaDoCpu == 2) ||
  (jogadaDoPlayer == 1 && jogadaDoCpu == 0) ||
  (jogadaDoPlayer == 2 && jogadaDoCpu == 1)
) {
  console.log("Você ganhou 🏆");
}
else {
  console.log("Computador venceu 💻");
}
Testar no Laboratório JavaScript

O que aprendemos?

Apesar de ser um jogo pequeno, resolvemos vários problemas diferentes.

Primeiro, recebemos uma entrada do jogador.

Depois, usamos Math.random() e Math.floor() para criar uma escolha aleatória para o computador.

Por fim, usamos if, else if, else, && e || para transformar as regras do jogo em decisões.

O mais importante é perceber que não precisamos resolver um problema inteiro de uma vez.

Quebrar o problema em partes torna a programação muito mais fácil de entender e construir.


Até a próxima! 🚀

João.

João Trintin

João Trintin

Programação Pode Ser Simples