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
ANDeOR; - 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 entre0.0e1.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 💻");
}
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
Programação Pode Ser Simples