Hi ha jocs que són ideals per aprendre Python perquè tenen regles simples… però una implementació que pot complicar-se ràpid. Pedra, paper o tisores és perfecte per veure una diferència clau: quan convé escriure condicions, i quan és millor representar les regles amb una estructura de dades.
En aquest post construïm el joc i veurem per què un diccionari pot convertir-se en una “taula de decisió” molt més neta i escalable que una cadena infinita d’if/elif.
Objectiu del post
Passar d’un codi amb molts if a un codi on les regles estan definides en un diccionari, de manera clara i fàcil d’ampliar.
1) El primer enfocament: molts if (funciona, però no escala)
La manera més directa de programar aquest joc és escriure una condició per a cada combinació possible. El problema és que el codi creix ràpid, costa de llegir i és fàcil equivocar-se quan el vols modificar.
if player == "pedra" and cpu == "tisores":
resultat = "guanyes"
elif player == "pedra" and cpu == "paper":
resultat = "perds"
elif player == "paper" and cpu == "pedra":
resultat = "guanyes"
# ... i així fins completar totes les combinacionsIdea clau: aquest codi és “imperatiu” (controla el flux amb condicions). Però aquí les regles són una cosa fixa: té molt sentit descriure-les com una taula.
2) Pensar en regles com una “taula de decisió”
Quan les regles són estables (com en aquest joc), podem representar-les així:
- Pedra guanya a tisores i perd contra paper.
- Paper guanya a pedra i perd contra tisores.
- Tisores guanya a paper i perd contra pedra.
Això és informació perfecta per posar dins d’un diccionari, com si fos una mini base de dades de regles.
3) El diccionari com a taula de regles
Definim un diccionari on:
- La clau principal és la jugada del jugador (
"pedra","paper","tisores"). - El valor és un altre diccionari amb el resultat contra cada opció.
rules = {
"pedra": {"tisores": "guanyes", "paper": "perds"},
"paper": {"pedra": "guanyes", "tisores": "perds"},
"tisores": {"paper": "guanyes", "pedra": "perds"},
}Això és potent perquè descrivim el joc en lloc de programar cada cas amb condicions. I si un dia afegeixem noves opcions o regles, només hem de modificar aquesta estructura.
4) Calcular el resultat amb molt poc codi
Només hi ha un cas especial: si tots dos trieu el mateix, és empat. La resta surt directament del diccionari:
if player == cpu:
resultat = "empat"
else:
resultat = rules[player][cpu]Aquest és el moment “wow”: hem passat d’un munt d’if a un codi curt i llegible.
5) Afegir aleatorietat amb random
Perquè el joc sigui real, l’ordinador ha de triar una opció aleatòria:
import random
opcions = list(rules.keys())
cpu = random.choice(opcions)6) Codi complet (versió consola)
import random
rules = {
"pedra": {"tisores": "guanyes", "paper": "perds"},
"paper": {"pedra": "guanyes", "tisores": "perds"},
"tisores": {"paper": "guanyes", "pedra": "perds"},
}
opcions = list(rules.keys())
player = input("Tria pedra, paper o tisores: ").strip().lower()
# (Opcional) validació mínima
if player not in rules:
print("Opció no vàlida. Escriu: pedra, paper o tisores.")
else:
cpu = random.choice(opcions)
print(f"L'ordinador tria: {cpu}")
if player == cpu:
resultat = "empat"
else:
resultat = rules[player][cpu]
print(f"Resultat: {resultat}")Què hem après realment
- Diccionaris com a taules de decisió (regles clares = dades).
- Evitar cadenes llargues d’
if/elifquan hi ha patrons repetits. - random per simular una elecció de la CPU.
- Una idea important de projecte: primer modelem el problema, després escrivim el codi.

Aquest joc forma part de DeGalaLab Arcade, una col·lecció de mini jocs fets amb Python i portats a web amb Streamlit.
⏭️ Següent post de la sèrie: El joc del penjat: gestionar estat i errors.