import threading class Kaestchen: def __init__(self, xcord, ycord): self.xcord = xcord self.ycord = ycord self.werte = [[[1,2,3,4,5,6,7,8,9] for _ in range(3)] for _ in range(3)] def __str__(self): gesamt = "" gesamt += f"x: {self.xcord}, y: {self.ycord} \n" for i in self.werte: gesamt += str(i) gesamt += "\n" return gesamt def __repr__(self): gesamt = "" gesamt += f"x: {self.xcord}, y: {self.ycord} \n" for i in self.werte: gesamt += str(i) gesamt += "\n" return gesamt def wert_eintragen(self, wert, zeile, spalte): if wert != 0: self.werte[zeile%3][spalte%3] = [wert, ] else: self.werte[zeile%3][spalte%3] = [1,2,3,4,5,6,7,8,9] def loesen(self, sodoku): print(f"Thread {threading.current_thread().name} hat begonnen!") nachbarn_spalte = [ i for sublist in sodoku.alleZellen for i in sublist if i.xcord == self.xcord and i != self ] nachbarn_reihe = [ i for sublist in sodoku.alleZellen for i in sublist if i.ycord == self.ycord and i != self ] alle_tuple = [tup for liste in self.werte for tup in liste] geloest = False while not geloest: self.check_reihe(nachbarn_reihe) self.check_spalte(nachbarn_spalte) self.check_zelle() sodoku.update_screen() if all(map(lambda t: len(t) == 1, alle_tuple)): geloest = True print(f"Thread {threading.current_thread().name} ist fertig!") def check_reihe(self, nachbarn): # Wenn eine Zahl in der Reihe feststeht, # wird sie aus allen anderen Zellen entfernt for zeile in range(3): tuple_nachbarn = [nachbar.werte[zeile] for nachbar in nachbarn] loeschen = None for zelle in tuple_nachbarn: if len(zelle) == 1: loeschen = zelle[0] break for index in range(3): if loeschen in self.werte[zeile][index] and len(self.werte[zeile][index]) != 1 : self.werte[zeile][index].remove(loeschen) # Wenn es nur noch einen möglichen Platz für eine Zahl in der Reihe gibt, # wird sie in die Zelle geschrieben for zahl in range(1, 10): if ([item for tup in tuple_nachbarn for item in tup] + [item for tup in self.werte[zeile] for item in tup]).count(zahl) == 1: for index in range(3): if zahl in self.werte[zeile][index] and len(self.werte[zeile][index]) > 1: self.werte[zeile][index] = [zahl, ] def check_spalte(self, nachbarn): # Wenn eine Zahl in der Spalte feststeht, # wird sie aus allen anderen Zellen entfernt for spalte in range(3): tuple_nachbarn = [liste[spalte] for nachbar in nachbarn for liste in nachbar.werte] loeschen = None for zelle in tuple_nachbarn: if len(zelle) == 1: loeschen = zelle[0] break for index in range(3): if loeschen in self.werte[index][spalte] and len(self.werte[index][spalte]) != 1 : self.werte[index][spalte].remove(loeschen) # Wenn es nur noch einen möglichen Platz für eine Zahl in der Spalte gibt, # wird sie in die Zelle geschrieben for zahl in range(1, 10): if ([item for tup in tuple_nachbarn for item in tup] + [item for tup in [liste[spalte] for liste in self.werte] for item in tup]).count(zahl) == 1: for index in range(3): if zahl in self.werte[index][spalte] and len(self.werte[index][spalte]) > 1: self.werte[index][spalte] = [zahl, ] def check_zelle(self): # Wenn eine Zahl in dem Kästchen feststeht, # wird sie aus allen anderen Zellen entfernt alle_zellen = [tup for liste in self.werte for tup in liste] loeschen = None for zelle in alle_zellen: if len(zelle) == 1: loeschen = zelle[0] break for index in range(9): if len(self.werte[index//3][index%3]) != 1 and loeschen in self.werte[index//3][index%3]: self.werte[index//3][index%3].remove(loeschen) # Wenn es nur noch einen möglichen Platz für eine Zahl in dem Kästchen gibt, # wird sie in die Zelle geschrieben for zahl in range(1, 10): if [item for tup in alle_zellen for item in tup].count(zahl) == 1: for index in range(9): if zahl in self.werte[index//3][index%3] and len(self.werte[index//3][index%3]) > 1: self.werte[index//3][index%3] = [zahl, ]