Pedra, paper o tisores: quan un diccionari és millor que molts if

Construïm el joc de pedra, paper o tisores en Python i aprenem per què un diccionari és millor que molts if. Un exercici pràctic per escriure codi més net, llegible i escalable.

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 combinacions

Idea 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/elif quan 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.
Pedra, paper o tisores en Python: diccionaris vs if | DeGalaLab

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.