El tema es que en el refactoring hice algunos cambios en los cuales se
agregaba estado a las fichas (ahora no recuerdo bien, pero por ejemplo
si se habian movido o cosas asi para evaluar luego si un enroque es
valido, etc.). Esto por un lado esta bueno porque el codigo queda mas
claro e intuitivo (en mi opinion), pero por otro lado generar tableros
hipoteticos es mas complicado/costoso porque implica hacer copias 'en
profundidad' de las piezas, y no solamente copiar su posicion (como era
antes). En definitiva, me dejo pensando si fue una buena idea agregar
estado a las piezas en lugar de dejarlo en el tablero. Ademas, tengo la
sensacion que la posibilidad de hacer tableros hipoteticos es bastante
util, mas alla del caso de jaque mate...
def king_is_checkmated(self, owner):
moves = self.get_all_moves(owner)
for move in moves:
move.perform(self)
checked = self.king_is_checked(owner)
move.undo(self)
if not checked:
return False
return True
O al menos pasa el caso de prueba de checkmate que antes no pasaba ;) (y
lo detecta en un jaque pastor).
Igual imagino que eso agrega otro problema (que era para lo que creo que
se usaba el flag 'hipotetical' en alguna version pasada), y es recursion
cuando se quiere filtrar movimientos. Alternativamente, se podria
filtrar movimientos para asegurarse de que no dejen al rey en jaque
(haciendo el movimiento, chequeando por jaque, y deshaciendolo) y luego
determinar si es jaque mate si no quedan movimientos validos. No deberia
ser dificil.
Imagino que hacer el movimiento y deshacerlo es mas eficiente que copiar
el tablero N veces para determinar si cada posible movimiento termina en
jaque.
saludos!