| Organització: | Secció ETSEIB, Departament de Ciències de la Computació, UPC |
|---|---|
| Data: | 7 de gener de 2015 |
| Copyright: | Reconeixement-CompartirIgual 3.0 No adaptada de Creative Commons |
| Durada: | 1 hora 30 minuts |
Volem dissenyar la classe Tauler que representa un tauler de tetris. El tauler és una retícula rectangular de caselles de diferents colors. Inicialment, totes les caselles tenen el mateix color que anomenarem color de fons. Els colors es representen com tuples (R, G, B) de valor comprès entre 0 i 255. La implementació d'aquesta classe serà molt semblant a la segona implementació de base_laberint2 en la pràctica laberint: només es guardaran les caselles que tenen un color diferent del color de fons. Per això s'utilitzarà un diccionari que tingui per clau posicions de caselles i per valor el color de les caselles de color diferent del de fons.
Dissenyeu la classe amb els següents mètodes:
La classe Rectangle està definida al mòdul rect.py. Dissenyeu la funció recursiva AreaMax(lrect) que, donada una llista d'instàncies a la classe Rectangle, retorni el rectangle d'àrea més gran. Suposeu que la llista té com a mínim un rectangle. Si hi ha dos o més rectangles d'àrea màxima, cal retornar el d'índex més baix. Deseu la funció al mòdul ex2.py.
Hem utilitzat un graf dirigit de networkx (un DiGraph) per a representar les relacions familiars entre persones. En aquest graf, només hi ha desada la relació pare/mare-fill/a, és a dir, els nodes del graf són les persones, identificades pel nom (un string) i una aresta dirigida de x a y indica que x és progenitor de y.
Per exemple el graf següent,
creat amb la següent seqüència d'operacions en Python,
>>> import networkx as nx
>>> g = nx.DiGraph()
>>> gent = ['Joan','Anna','Pere','Josep','Maria','Carla','Rut','Gisela']
>>> fills = [ ('Joan','Anna'), ('Joan','Pere'), ('Joan','Josep'), ('Maria','Anna'), ('Maria','Pere'), ('Carla','Josep'), ('Pere','Rut'), ('Pere','Gisela') ]
>>> g.add_nodes_from(gent)
>>> g.add_edges_from(fills)
representa una família de 8 membres, en la qual en Joan té tres fills (Anna, Pere, Josep), la Maria dos (Anna, Pere), la Carla un (en Josep) i en Pere dues filles (Rut i Gisela).
Dissenyeu la funció fills_comuns(g, a, b) que, donat un digraf g com el descrit i els noms de dues persones, retorna un conjunt (un set de python) amb els noms dels seus fills comuns. En el graf de l'exemple,
>>> import ex3
>>> ex3.fills_comuns(g, 'Maria', 'Joan') == {'Pere', 'Anna'}
True
>>> ex3.fills_comuns(g, 'Carla', 'Joan') == {'Josep'}
True
>>> ex3.fills_comuns(g, 'Pere', 'Carla') == set()
True
Per a resoldre aquest exercici, es recomana utilitzar l'operació d'intersecció (intersection) entre conjunts. Deseu la funció al fitxer ex3.py.
Es disposa d'una llista de noms i es vol crear de forma automàtica seqüències de noms de la llista de longitud donada i sense repeticions.
Dissenyeu la funció generadora creaCamins(noms, long) que, donada una llista de noms i un enter positiu, retorni un iterador de totes les seqüències de long noms que es poden formar a partir de noms, sense que hi hagi repeticions i tals que tots els noms d'una seqüència comencin amb la mateixa lletra. Vegeu per exemple:
>>> from ex4 import creaCamins
>>> l = ['Albert', 'Andreu', 'Anna', 'Jordi', 'Josep', 'Liliana']
>>> list(creaCamins(l, 4))
[]
>>> for e in creaCamins(l, 3):
... print(e, end='-')
...
('Albert', 'Andreu', 'Anna')-('Albert', 'Anna', 'Andreu')-('Andreu', 'Albert', 'Anna')-('Andreu', 'Anna', 'Albert')-('Anna', 'Albert', 'Andreu')-('Anna', 'Andreu', 'Albert')-
>>> len(list(creaCamins(l, 2)))
8
>>> a = creaCamins(l, 1)
>>> next(a)
('Albert',)
>>> next(a)
('Andreu',)
>>> next(a)
('Anna',)
>>> next(a)
('Jordi',)
Deseu la funció al mòdul ex4.py.
Es vol modificar el joc de tetris implementat a classe, fent que ara els blocs siguin rectangles bicolors (vegeu la figura adjunta).
Dissenyeu la classe NouBloc que hereta de la classe pygame.sprite.Sprite. Aquesta classe representa sprites rectangulars formats per dues franges horitzontals d'igual alçada i de color diferent. La classe ha de tenir quatre atributs: image i rect i, a més, el color de la part superior (color_sup) i el color de la part inferior (color_inf). Implementeu el mètode __init__(self, color_sup, color_inf, mides, pos) que té com a paràmetres els dos colors, les mides del rectangle i la posició del tauler on el bloc s'ha d'enganxar.
Disposeu del programa principal prova.py per provar la classe NouBloc.