1. Classe Memory (7 punts)¶
Per a desenvolupar un joc de memòria ens cal una classe de Pyhton que representi les cartes que hi ha sobre la taula. En aquest joc, inicialment es disposen totes les cartes de cap per avall sobre la taula, barrejades. Per torns, cada jugador en gira dues i si coincideix el què hi ha dibuixat se les queda; altrament, les dues cartes es tornen a girar cap per avall i passa el torn al següent jugador. El guanyador del joc és qui té més cartes quan ja no en queda cap sobre la taula. Així doncs, l’estratègia és memoritzar la posició de les cartes que s’han anat destapant, per tenir més probabilitats de girar-ne d’iguals i quedar-se-les. Les imatges de les cartes s’identifiquen amb un caràcter i els espais buits pel caràcter '*'.
En començar el joc les cartes es disposaran en un espai rectangular de nfils files per ncols columnes. Cada carta estarà situada en una posició identificada per una tupla (f, c), essent f l’índex de la fila i c el de la columna. La posició de la carta superior esquerra serà la (0,0) i la inferior dreta (nfils-1, ncols-1). Direm que una posició és interior si les seves coordenades no superen aquests límits.
Implementeu la classe Memory i deseu-la al mòdul memory (fitxer memory.py) tal com queda especificada:
- class memory.Memory(nfils, ncols)¶
Inicialitza l’espai del joc com un rectangle de dimensions \(nfils \times ncols\) sense cap carta.
Atributs públics:
- nfils¶
Nombre de files de l’espai de joc (enter positiu)
- ncols¶
Nombre de columnes de l’espai de joc (enter positiu)
Operacions:
Operació
Resultat
m[pos]Identificador de la carta que hi ha a la
posdel jocm. Si aposno hi ha cap carta, retorna'*'. Es compleix queposés una posició interior.m[pos]=cCol·loca la carta
c(cap per avall) a la posicióposdem. Sic='*'s’elimina la carta que hi pogués haver apos. Es compleix queposés una posició interior.len(m)Nombre de cartes que hi ha al joc
mMètodes:
- omplir(s, i)¶
Donat un string s de \(ncols\) caràcters, assigna els caràcters de s a la fila i-èssima de l’espai de joc, començant per la carta de més a l’esquerra i acabant per la de més a la dreta.
- capgira(p, q)¶
Realitza el torn d’un jugador, simulant el capgirament de les cartes de les posicions p i q. Si les dues cartes coincideixen (tenen el mateix valor), s’eliminen de l’espai de joc, altrament no el modifica. Es compleix que tant a p com a q són posicions interiors on hi ha una carta.
Per a emmagatzemar les cartes del joc cal un atribut privat, que ha de ser un diccionari. Les claus seran les posicions de les cartes i cada clau (cada posició) tindrà associada l’identificador de la imatge de la carta que hi ha. En aquest diccionari només s’hi han de desar les posicions que continguin cartes.
Exemples d’ús:
>>> from memory import Memory
>>> m = Memory(4, 6)
>>> m.nfils
4
>>> m.ncols
6
>>> len(m)
0
>>> for f in range(4): # Dibuixem l'espai de joc utilitzant l'accés per índex
... for c in range(6):
... print(m[f,c], end='')
... print()
******
******
******
******
>>> m[0,0] = 'A'
>>> m[0,1] = 'B'
>>> m[0,2] = 'C'
>>> m[0,3] = 'C'
>>> m[0,4] = 'A'
>>> m[0,5] = 'H'
>>> m[2,4] = 'D'
>>> len(m)
7
>>> for f in range(4): # Dibuixem l'espai de joc (les cartes)
... for c in range(6):
... print(m[f,c], end='')
... print()
ABCCAH
******
****D*
******
>>> m[2,4] = '*'
>>> len(m)
6
>>> m.omplir('BADAEC', 1)
>>> m.omplir('HDCFFE', 2)
>>> m.omplir('FGAAGF', 3)
>>> for f in range(4): # Dibuixem l'espai de joc (les cartes)
... for c in range(6):
... print(m[f,c], end='')
... print()
ABCCAH
BADAEC
HDCFFE
FGAAGF
>>> len(m)
24
>>> m.capgira((0,0), (3,4)) # Cartes no coincidents
>>> m.capgira((2,1), (1,2)) # Cartes coincidents; s'eliminen
>>> for f in range(4):
... for c in range(6):
... print(m[f,c], end='')
... print()
ABCCAH
BA*AEC
H*CFFE
FGAAGF
>>> len(m)
22
Disposeu de jocs de prova al fitxer tests-memory.txt