136 lines
5.0 KiB
Python
136 lines
5.0 KiB
Python
|
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, ]
|