El joc de les serps i les escales

../../../_images/snakes_and_ladders.png

L’objectiu d’aquest exercici és crear una classe que serveixi per a representar informàticament una partida del clàssic joc de taula de les escales i les serps. Per si no hi heu jugat mai, es tracta d’una mena de joc de l’oca: Per torns, cada jugador fa avançar la seva fitxa segons el valor del dau que tira per les caselles en l’ordre numerat, començant des de la casella 1. Si cau a l’extrem inferior d’una escala, avança fins a l’altre extrem de l’escala, i si cau al cap d’una serp, retrocedeix fins a la seva cua. Guanya el primer jugador que arriba (o supera) la darrera casella del tauler.

La classe TaulerSE

Fixem-nos que un tauler no és més que un conjunt de caselles numerades a partir de l’u, algunes d’elles connectades amb d’altres a través de serps i escales. En conseqüència, n’hi haurà prou amb emmagatzemar el nombre de caselles del tauler i, per cada casella, amb quina altra casella està connectada només en el cas que sigui el començament d’una escala o el cap d’una serp. La informació de les serps i escales s’emmagatzemarà en un atribut privat de la classe, com s’explica més avall. Deseu la classe al mòdul taulers (fitxer taulers.py).

class taulers.TaulerSE(ncaselles)

Crea una instància de la classe que representa un tauler amb el nombre de caselles indicat. Inicialment, el tauler no contindrà més que les caselles buides, és a dir, no hi haurà cap serp ni cap escala.

Atributs públics:

ncaselles

Nombre de caselles del tauler (int).

Mètodes:

nombre_se()

Retorna el nombre total de serps i escales que hi ha al tauler.

afegir_escala(ci, cf)

Afegeix una escala al tauler amb el començament en la casella ci i el final a la cf. Es compleix que \(1 \leq ci \lt cf \leq ncaselles\).

afegir_serp(ci, cf)

Afegeix una serp al tauler amb la cua a la posició ci i el cap a la posició cf. Es compleix que \(1 \leq ci \lt cf \leq ncaselles\).

Aquesta classe ha de suportar les operacions següents:

Operació

Resultat

t[i]

Retorna un enter que serà:

  • 0 si la casella i no és ni el començament d’una escala ni el cap d’una serp

  • la casella amb la posició final d’una escala si i és el començament d’una escala

  • la casella amb la cua de la serp si i és el cap d’una serp

Es compleix \(1 \leq i \le t.ncaselles\)

A l’hora d’implementar la classe, tingeu en compte que caldrà un atribut privat per a desar la informació de les escales i serps del tauler. Es recomana que sigui un diccionari les claus de la qual siguin l’índex de es caselles que són el començament d’una escala i els caps de les serps; els valors, l’índex de la casella corresponent on es va a parar quan hi caus, és a dir, el final de l’escala o la cua de la serp. Per exemple, pel tauler del dibuixat, aquest diccionari tindria el valor {3:17, 20:33, 28:42, 40:46, 47:61, 25:11, 32:16, 48:34, 58:45}.

Disposeu de jocs de prova al fitxer tests-taulerSE.txt i d’una solució al fitxer taulers.py.

Iterador de serps

Dissenyeu la següent funció, que permet recórrer les posicions de les serps d’un tauler. Podeu dissenyar-la com un generador o bé com una funció que retorna un iterador. Deseu-la al mòdul iserps (fitxer iserps.py).

iserps.iter_serps(t)
Paràmetres:

t – tauler de joc (TaulerSE)

Retorna:

un iterador sobre la seqüència de tuples que (cap, cua) de totes les posicions del tauler on hi ha una serp amb el cap i la cua en el tauler t. La seqüència ha d’estar ordenada en ordre creixent de les posicions dels caps de les serps.

Disposeu d’un joc de proves en el fitxer tests-iserps.txt i d’una solució al fitxer iserps.py.

La Classe PartidaSE

Tot seguit, cal representar una partida de diversos jugadors, que fan servir fitxes de diferents colors. A tal fi, farem ús del mecanisme d’herència per a derivar la classe PartidaSE de TaulerSE. Com que caldrà saber en tot moment on són les fitxes dels jugadors, desarem aquesta informació dins la nova classe. Implementeu-la seguint aquesta especificació i deseu-la al mòdul partida (fitxer partida.py).:

class partides.PartidaSE(ncaselles, colors_jug)

Crea una instància de la classe que representa una partida amb el nombre de caselles indicat per ncaselles. El paràmetre colors_jug és una llista de strings amb els colors de les fitxes dels jugadors de la partida. Inicialment, el tauler no contindrà més que les caselles buides i totes les fitxes dels jugadors estaran situades a la primera casella.

Atributs públics (addicionals):

posicio

Diccionari de amb les posicions de cadascun dels jugadors. Les claus són els noms colors de les seves fitxes (string) i els valors l’índex de la casella on estan situades.

Mètodes (addicionals):

mou_fitxa(color, num_dau)

Mou la fitxa del color indicat en funció del valor del dau, seguint les normes del joc. És a dir, cal avançar la fitxa tantes caselles com num_dau, però si cau al començament d’una escala, es mourà fins al seu extrem superior, i si cau al cap d’una serp, es mourà fins a la seva cua. També cal impedir que la fitxa superi l’última casella del tauler.

qui_guanya()

Retorna una llista ordenada amb el noms del colors de les fitxes dels jugadors que estan més avançades al tauler (una llista amb un sol color si hi ha un únic jugador que va guanyant).

Disposeu de jocs de prova al fitxer tests-partidaSE.txt i d’una solució al fitxer partides.py.