2. Motxilla per a un joc d’ordinador

Estem desenvolupant un joc d’ordinador en el qual el jugador duu una motxilla per a emmagatzemar-hi objectes de diferents tipus, tal com la que hi ha en l’exemple de més avall. Com podeu observar, la motxilla pot transportar un nombre limitat d’objectes de tipus diferents, però no hi ha límit sobre la quantitat d’objectes d’un tipus tipus concret que s’hi poden desar.

../../../../_images/minecraft.png

Aspecte del joc. La part inferior mostra la motxilla, en aquest cas amb capacitat per a objectes de nou tipus diferents; és a dir, la motxilla disposa de nou espais (6 ocupats i 3 buits).

2.1. Classe Motxilla (5 punts)

Al fitxer motxilla.py, hi deseu la classe Motxilla, tal com queda especificada a continuació:

class motxilla.Motxilla(nespais)

Representa una motxilla amb capacitat per a transportar nespais tipus d’objectes diferents. Inicialment, la motxilla és buida.

Atributs:

nespais

Nombre màxim de tipus d’objectes de la motxilla (int), és a dir, nombre d’espais de què disposa la motxilla (slots).

objectes

Diccionari (un dict) amb els objectes que hi ha desats a la motxilla. Les claus són el nom de cada tipus d’objectes i els valors un enter, sempre positiu, d’objectes del tipus concret que hi ha dins la motxilla.

Mètodes:

afegir(n, nomt)

Afegeix a la motxilla n objectes del tipus nomt, només si caben dins de la motxilla. Si no hi caben, no fa res.

treure(nomt)

Treu tots els objectes del tipus nomt de la motxilla, alliberant un espai. Si no hi havien objectes de tipus nomt, no fa res.

nombre_objectes()

Retorna el nombre total d’objectes que hi ha dins de la motxilla.

Operacions:

len(m)

Retorna el nombre d’espais ocupats de la motxilla.

m[nomt]

Retorna el nombre d’objectes de tipus nomt que hi ha dins de la motxilla. Si no n’hi ha cap, retorna 0.

Exemples d’ús de la classe:


>>> from motxilla import Motxilla
>>> m = Motxilla(4)
>>> m.nespais, m.objectes
(4, {})
>>> len(m)
0
>>> m.afegir(5, 'canya')
>>> m.objectes
{'canya': 5}
>>> m.nombre_objectes()
5
>>> m.afegir(2, 'flor')
>>> m.nombre_objectes()
7
>>> m.objectes == {'flor':2, 'canya':5}
True
>>> for x in ['flor', 'sorra', 'canya', 'diamant', 'roca']:
...   print(m[x], end=',')
2,0,5,0,0,
>>> m.afegir(2, 'flor')
>>> m['flor']
4
>>> m.afegir(100, 'sorra')
>>> m.afegir(13, 'sorra')
>>> m['sorra']
113
>>> len(m)
3
>>> m.afegir(11, 'mongeta')
>>> m.afegir(59, 'roca')
>>> len(m)
4
>>> m.nombre_objectes()
133
>>> for x in ['flor', 'sorra', 'canya', 'diamant', 'mongeta', 'roca']:
...   print(m[x], end=',')
4,113,5,0,11,0,
>>> m.afegir(113, 'fusta')
>>> m.treure('flor')
>>> m['flor']
0
>>> len(m)
3

Trobareu més jocs de proves al fitxer tests-motxilla.txt.

2.2. Classe MotxillaLimit (2 punts)

Ara volem que la motxilla tingui un límit sobre el nombre d’objectes que cap a cada espai de la motxilla (un únic valor límit global per a tots els espais). A tal efecte, es demana que, al fitxer moxtilla_limit implementeu la classe MotxillaLimit derivant-la per herència de Motxilla, tal com s’especifica tot seguit:

class motxilla_limit.MotxillaLimit(nespais, maxobj)

Representa una motxilla amb capacitat per a transportar maxobj objectes de nespais tipus diferents. Inicialment, la motxilla és buida.

Atributs addicionals:

La classe ha de tenir un atribut, un enter, que sigui el nombre màxim d’objectes que cap en un espai de la motxilla. Aquest atribut ha de ser privat per evitar que es modifiqui inadequadament.

Mètodes:

espai(nomt)

Retorna el nombre d’objectes de tipus nomt que caben a la motxilla. Tingues en compte que l’espai està limitat nombre d’objectes que caben a cada espai i també pels espais disponibles.

afegir(n, nomt)

Afegeix a la motxilla n objectes del tipus nomt només si caben dins de la motxilla, és a dir, si hi ha espai per a desar-los-hi. Si no hi caben, no fa res.

Exemples d’ús de la nova classe:


>>> from motxilla_limit import MotxillaLimit
>>> m = MotxillaLimit(5, 10)   # Hi ha 5 espais lliures de 10 objectes cadascun
>>> m.nespais, m.objectes
(5, {})
>>> len(m)
0
>>> m.afegir(3, 'canya')  # Omplim un espai amb 3 objectes (3 canyes)
>>> m.objectes
{'canya': 3}
>>> m.nombre_objectes()
3
>>> m.espai('canya')      # A l'espai de les canyes encara n'hi caben 7
7
>>> m.espai('flor')       # La motxilla no conté flors, però n'hi caben 10 perquè hi ha espais lliures
10
>>> m.afegir(2, 'flor')   # Omplim un altre espai amb 2 objectes (2 flors)
>>> m.objectes == {'flor':2, 'canya':3}
True
>>> m.nombre_objectes()
5
>>> m.espai('flor')       # A l'espai de les flors encara n'hi caben 8
8
>>> m.afegir(7, 'canya')  # Omplim del tot l'espai de les canyes
>>> m.espai('canya')      # ... i per tant ara no hi caben canyes
0
>>> m.afegir(10, 'flor')  # No fa res perquè només caben 8 flors, no 10
>>> for x in ['flor', 'sorra', 'canya', 'diamant', 'roca']:
...   print(m[x], m.espai(x), end=',')
2 8,0 10,10 0,0 10,0 10,
>>> m.afegir(2, 'flor')  # Afegim dues flors
>>> m['flor']
4
>>> m.afegir(23, 'sorra') # No fa res perquè a cada espai només hi caben 10 objectes
>>> m['sorra']
0
>>> len(m)
2

Trobareu més jocs de proves al fitxer tests-motxillaLimit.txt.