Capítol 12

El joc "4 en ratlla"

Programarem el clàssic joc de taula "4 en ratlla", on juguen la persona i la màquina.

El joc

4 en ratlla (en angles, Connect Four) es un joc de taula per a dos jugadors. El tauler te 7 columnes i 6 files. Cada torn, un jugador deixa caure una fitxa per una columna i la fitxa cau fins a la posicio mes baixa disponible, com per gravetat. Guanya el primer que aconsegueix alinear 4 fitxes seguides en horitzontal, vertical o diagonal.

Es un joc perfecte per al simulador de PyCat perque es per torns: el jugador tria una columna, la fitxa cau, i despres juga la maquina.

Construirem el joc pas a pas:

  • El tauler, guardat com una llista de llistes i dibuixat amb Unicode.
  • La gravetat: la fitxa cau fins a la fila mes baixa buida.
  • La detecció de 4 en ratlla (la part mes enginyosa).
  • L'estratègia de la màquina per intentar guanyar la partida.

Peça 1: el tauler

El tauler es una llista de 6 files, i cada fila es una llista de 7 valors. Fem servir cadenes de caràcters per representar cada casella.
"\u00b7" per buida ( · ),
"\u25cf" per la fitxa del jugador (●)
"\u25cb" per la de la maquina (○)

Peça 2: la gravetat

Quan un jugador tria una columna, la fitxa no queda a dalt sinó que directament cau fins a la fila mes baixa que estigui buida. Per trobar aquesta altura que ha de caure, recorrem la columna de baix a dalt:

Peça 3: qui ha guanyat?

Cada cop que es col·loca una fitxa, hem de comprovar si forma una linia de 4. En lloc de mirar tot el tauler, nomes comprovem des de la fitxa acabada de posar en 4 direccions: horitzontal, vertical i les dues diagonals.

Per a cada direccio, comptem quantes fitxes consecutives del mateix jugador hi ha cap a un costat i cap a l'altre. Si el total arriba a 4 o mes, vol dir que ha guanyat:

Aquesta peça que has llegit és, probablement, la més enginyosa del joc.
La llista direccions conte 4 parelles [df, dc] que representen com ens movem per cada eix. Per exemple, [0, 1] vol dir "mateixa fila, columna seguent" (horitzontal) i [1, -1] vol dir "fila seguent, columna anterior" (diagonal).
Per a cada direcció, el primer while compta cap endavant (+df, +dc) i el segon cap enrere (-df, -dc). Aixi detectem linies on la fitxa nova esta al mig, no nomes al final.

Peça 4: l'estratègia de joc de la màquina

La nostra màquina segueix una estrategia senzilla de tres passos:

  1. Puc guanyar? Prova cada columna. Si posar-hi una fitxa dona 4 en ratlla, juga alla.
  2. He de bloquejar? Prova cada columna amb la fitxa del rival. Si el rival guanyaria, la maquina bloqueja aquella columna.
  3. Si no es compleixen les condicions anteriors, escollirà les columnes del centre, perquè són les que donen més opcions.

Fixa't que la funcio retorna fila, col (dues coses alhora). Aixi el programa principal sap on ha jugat la maquina i pot comprovar si ha guanyat. La llista preferides prioritza la columna 4 (index 3), que es el centre del tauler i estadisticament la millor posicio.

El joc complet

Ara juntem totes les peces.
La persona que juga té les fitxes , i la màquina, les .
A cada torn, la persona escriu el numero de columna (1–7) escollit i prem la tecla Retorn.
Ja pots jugar!

  • Bucle for (cap. 6): per recorrer el tauler, les direccions i les columnes.
  • Condicionals (cap. 4): per detectar guanyadors, bloquejar el rival i validar l'entrada.
  • range(n, -1, -1) (cap. 6): per recorrer la columna de baix a dalt.
  • random.choice() (cap. 11): per decidir qui comenca.
  • Tot el curs en un sol programa d'unes 100 linies!

    Repte obert

    El joc funciona, pero pots millorar-lo:

    • Maquina mes intel·ligent. Afegeix un quart pas a la IA: abans de triar el centre, comprova si posar una fitxa dona 3 en ratlla (preparant un 4 en ratlla futur).
    • Dos jugadors. Modifica el programa perque dos humans puguin jugar alternant torns, sense la IA.
    • Tauler mes gran. Canvia FILES i COLS per fer un tauler 9x7. Funciona sense tocar res mes!

    Resum