Uebungsaufgaben/Semester3/Python/Kaestchen.py
2024-12-19 23:55:07 +01:00

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, ]