1
2
3
4
5
6
7
8
9 import pilas
10 import random
11
12
13 -class Piezas(pilas.escena.Base):
14 """Representa la escena de rompecabezas.
15
16 La escena comienza con una imagen que se descompone en muchos
17 actores Pieza.
18 """
19
20 - def __init__(self, ruta_a_la_imagen="fondos/noche.jpg", filas=4, columnas=4, al_terminar=None):
21 pilas.escena.Base.__init__(self)
22 self.ruta_a_la_imagen = ruta_a_la_imagen
23 self.filas = filas
24 self.columnas = columnas
25 self.al_terminar = al_terminar
26
40
42 "Genera todas las piezas en base al tamaño del constructor."
43 self.piezas = []
44 self.grupos = {}
45
46 for x in range(filas * columnas):
47 self.grupos[x] = set([x])
48 pieza = Pieza(self, grilla, x, filas, columnas)
49 self.piezas.append(pieza)
50 pieza.x = random.randint(-200, 200)
51 pieza.y = random.randint(-200, 200)
52
53
62
68
70 if self.pieza_en_movimiento:
71 self.pieza_en_movimiento.x += evento.dx
72 self.pieza_en_movimiento.y += evento.dy
73
75 a = pieza_a.numero
76 b = pieza_b.numero
77
78
79 if a in self.grupos[b]:
80
81 return
82
83 """Inicialmente comienzo con::
84
85
86 0: [0, 1, 2]
87 1: [0, 1, 2]
88 2: [0, 1, 2]
89 3: [3]
90
91 ¿y si conecto la pieza 3 con la 2?
92
93 - tendría que obtener todas las piezas que conoce 2.
94
95 - iterar en ese grupo y decirle a cada pieza que sume a 3 en su grupo::
96
97 0: [0, 1, 2, 3]
98 1: [0, 1, 2, 3]
99 2: [0, 1, 2, 3]
100
101 - luego solo me falta tomar a uno de esos grupos actualizados
102 y decirle a 3 que ese será su grupo::
103
104 3: [0, 1, 2, 3]
105 """
106
107 grupo_nuevo = set(self.grupos[a]).union(self.grupos[b])
108
109 for pieza in grupo_nuevo:
110 self.grupos[pieza] = grupo_nuevo
111
112 self.piezas_desconectadas -= 1
113
114 if self.piezas_desconectadas < 1:
115 if self.al_terminar:
116 self.al_terminar()
117
118 self.sonido_tick.reproducir()
119
120 -class Pieza(pilas.actores.Animado):
121 """Representa una pieza del rompecabezas.
122
123 Esta pieza se puede arrastrar con el mouse y cuando se suelta
124 intentará conectarse con las demás."""
125
126 - def __init__(self, escena_padre, grilla, cuadro, filas, columnas):
139
141 "Guarda el numero de las piezas que se pueden conectar en sus bordes."
142 self.numero_arriba = cuadro - columnas
143 self.numero_abajo = cuadro + columnas
144
145 if cuadro % columnas == 0:
146 self.numero_izquierda = -1
147 else:
148 self.numero_izquierda = cuadro - 1
149
150 if cuadro % columnas == columnas -1:
151 self.numero_derecha = -1
152 else:
153 self.numero_derecha = cuadro + 1
154
156 for numero in self.escena_padre.grupos[self.numero]:
157 pieza = self.escena_padre.piezas[numero]
158 pieza.soltar()
159
167
171
200
201
203 self.escena_padre.conectar(self, otra_pieza)
204
205
208
209
211 "A diferencia de los actores normales, las piezas tienen que mover a todo su grupo."
212 dx = x - self.x
213
214 for numero in self.escena_padre.grupos[self.numero]:
215 try:
216 pieza = self.escena_padre.piezas[numero]
217 pieza.definir_posicion(pieza.x + dx, pieza.y)
218 except IndexError:
219 pass
220
222 "A diferencia de los actores normales, las piezas tienen que mover a todo su grupo."
223 dy = y - self.y
224
225 for numero in self.escena_padre.grupos[self.numero]:
226 try:
227 pieza = self.escena_padre.piezas[numero]
228 pieza.definir_posicion(pieza.x, pieza.y + dy)
229 except IndexError:
230 pass
231
235
239
240 x = property(get_x, set_x, doc="Define la posición horizontal.")
241 y = property(get_y, set_y, doc="Define la posición vertical.")
242
244 for numero in self.escena_padre.grupos[self.numero]:
245 pieza = self.escena_padre.piezas[numero]
246 pieza.z = -1
247
249 for numero in self.escena_padre.grupos[self.numero]:
250 pieza = self.escena_padre.piezas[numero]
251 pieza.z = 0
252