1. Classe Match3 (7 punts)

../../../../_images/match3.jpg

Per a desenvolupar un joc de tipus match3, ens cal una classe de Pyhton que representi el tauler que conté les joies de diferents tipus (forma i color). L’objectiu del joc és destruir les joies del tauler. Per a aconseguir-ho, el jugador ha d’anar intercanviant de posició de les joies de dues en dues; quan es forma un grup vertical o horitzontal de tres o més joies del mateix tipus, es destrueixen i s’actualitza el tauler afegint-hi noves joies.

El tauler del joc contindrà una sèrie de joies disposades en un espai rectangular com el que mostra la figura, amb una alçada i una amplada predeterminades. El tipus de joia s’identificarà amb un enter positiu i les posicions buides s’identificaran amb un zero.

Una posició del tauler s’identifica amb una tupla de les seves coordenades (f, c), essent f l’índex de la fila i c el de la columna. La posició amb coordenades (0,0) serà la de la cantonada superior esquerra del tauler i la de la cantonada inferior dreta tindrà coordenades (alçada-1, amplada-1). Direm que una posició és interior al tauler si les seves coordenades no superen aquests límits.

Implementeu la classe Match3 i deseu-la al mòdul match3 (fitxer match3.py) tal com queda especificada:

class match3.Match3(alçada, amplada)

Crea un tauler de les mides indicades, inicialment tot buit (sense cap joia).

Atributs públics:

alçada

Nombre de files del tauler (enter positiu)

amplada

Nombre de columnes del tauler (enter positiu)

Operacions:

Operació

Resultat

m[pos]

Identificador de la joia que hi ha a la pos del tauler m. Si no hi ha cap joia retorna 0, i si pos és exterior al tauler m retorna -1.

m[pos]=v

Assigna la joia v a la posició pos del tauler m. El valor v=0 indica que la posició quedarà buida. Es compleix que pos és interior a m.

len(m)

Nombre de joies que hi ha al tauler.

Mètodes:

es_interior(p)

Retorna un booleà que indica si p és una posició interior al tauler.

intercanvia(p, q)

Intercanvia la joia de la posició p amb la de la posició q. Es compleix que tant p com q són posicions interiors al tauler. Si una de les dues posicions és buida, simplement canvia de lloc una joia.

Per a emmagatzemar les joies que hi ha al tauler cal un atribut privat, que ha de ser una llista de llistes d’identificadors de joies (nombres enters, zero si no hi ha cap joia). Cada subllista serà una llista d’identificadors, corresponent a les joies que hi ha en una fila del tauler.

Exemples d’ús:

>>> from match3 import Match3

>>> m = Match3(4, 5)
>>> m.amplada
5
>>> m.alçada
4
>>> len(m)
0
>>> m.es_interior((1,3)) and m.es_interior((0,0)) or m.es_interior((3,4))
True
>>> m.es_interior((-1,-10)) or m.es_interior((4,5)) or m.es_interior((10,4))
False
>>> for f in range(4):    # Dibuixem el tauler utilitzant l'accés a les posicions
...    for c in range(5):
...       print(m[f,c], end='')
...    print()
00000
00000
00000
00000
>>> # Accés a algunes posicions exteriors
>>> m[8,9], m[-1,2], m[3,5], m[4,2], m[1,-1]
(-1, -1, -1, -1, -1)
>>> m[0,0] = 5
>>> m[2,1] = 1
>>> m[2,2] = 1
>>> m[2,3] = 1
>>> m[3,4] = 5
>>> len(m)
5
>>> for f in range(4):   # Dibuixem el tauler
...    for c in range(5):
...       print(m[f,c], end='')
...    print()
50000
00000
01110
00005
>>> m.intercanvia((0,0), (1,4))
>>> for f in range(4):
...    for c in range(5):
...       print(m[f,c], end='')
...    print()
00000
00005
01110
00005
>>> m[0,4] = 5
>>> m[1,2] = 1
>>> len(m)
7
>>> m.intercanvia((0,4), (2,4))
>>> m[0,0] = 4
>>> for f in range(4):
...    for c in range(5):
...       print(m[f,c], end='')
...    print()
40000
00105
01115
00005

Disposeu de jocs de prova al fitxer tests-match3.txt