def verbindungstest(farbe, objektliste): aktuelles_feld = finde_kassi( objektliste) # Wir beginnen unsere Suche auf Kassis aktuellen Feld aktuelles_feld.verbunden = 1 # Dieses ist natuerlich verbunden # Wir finden heraus, welche weissen Felder mit Kassis Feld verbunden sind, die noch nicht als verbunden # erkannt wurden verbundene_felder = suche_verbindungen(objektliste, aktuelles_feld) for feld in verbundene_felder: if farbe: fenster.mach_farbe("light green", feld) # Kassis Feld selbst ist verbunden, dazu alle jetzt neu gefundenen verbundenen Felder anzahl_verbundene = 1 + len(verbundene_felder) # Wir finden heraus wie viele weisse Felder es insgesamt in Quadratien gibt anzahl_weisse = finde_anzahl_weisse_felder(objektliste) # So lange wir noch neue verbundene Felder finden while len(verbundene_felder) != 0: # Liste der Felder, die widerum an die eben schon gefundenen angrenzen neu_gefundene = [] # Fuer jedes der eben gefundenen Felder wird widerum eine Untersuchung auf unbekannte, weisse # Nachbarfelder durchgef�hrt for feld in verbundene_felder: if farbe: fenster.mach_farbe("light green", feld) aktuelles_feld = feld neu_gefundene += suche_verbindungen(objektliste, aktuelles_feld) if farbe: sleep(0.0) anzahl_verbundene += len( neu_gefundene ) # Anzahl der insgesamt verbundenen weissen Felder wird # entsprechend erhoeht verbundene_felder = neu_gefundene # Die neu gefundenen werden wieder zu den verbundenen feldern # und die Suche kann weitergehen # print("Es gibt " + str(anzahl_weisse) + " weisse Felder, davon sind " + str( # anzahl_verbundene) + " miteinander verbunden!") if anzahl_weisse == anzahl_verbundene: if farbe: fenster.zeige_nachricht( "Super!", "Alle weissen Felder sind für Kassi erreichbar.") print(1) return 1 else: if farbe: fenster.zeige_nachricht( "Schade", "Kassi kann leider nicht alle Felder erreichen. :-(") return 0
def verbindungstest(farbe, objektliste): aktuelles_feld = finde_kassi(objektliste) # Wir beginnen unsere Suche auf Kassis aktuellen Feld aktuelles_feld.verbunden = 1 # Dieses ist natuerlich verbunden # Wir finden heraus, welche weissen Felder mit Kassis Feld verbunden sind, die noch nicht als verbunden # erkannt wurden verbundene_felder = suche_verbindungen(objektliste, aktuelles_feld) for feld in verbundene_felder: if farbe: fenster.mach_farbe("light green", feld) # Kassis Feld selbst ist verbunden, dazu alle jetzt neu gefundenen verbundenen Felder anzahl_verbundene = 1 + len(verbundene_felder) # Wir finden heraus wie viele weisse Felder es insgesamt in Quadratien gibt anzahl_weisse = finde_anzahl_weisse_felder(objektliste) # So lange wir noch neue verbundene Felder finden while len(verbundene_felder) != 0: # Liste der Felder, die widerum an die eben schon gefundenen angrenzen neu_gefundene = [] # Fuer jedes der eben gefundenen Felder wird widerum eine Untersuchung auf unbekannte, weisse # Nachbarfelder durchgef�hrt for feld in verbundene_felder: if farbe: fenster.mach_farbe("light green", feld) aktuelles_feld = feld neu_gefundene += suche_verbindungen(objektliste, aktuelles_feld) if farbe: sleep(0.0) anzahl_verbundene += len(neu_gefundene) # Anzahl der insgesamt verbundenen weissen Felder wird # entsprechend erhoeht verbundene_felder = neu_gefundene # Die neu gefundenen werden wieder zu den verbundenen feldern # und die Suche kann weitergehen # print("Es gibt " + str(anzahl_weisse) + " weisse Felder, davon sind " + str( # anzahl_verbundene) + " miteinander verbunden!") if anzahl_weisse == anzahl_verbundene: if farbe: fenster.zeige_nachricht("Super!", "Alle weissen Felder sind für Kassi erreichbar.") print(1) return 1 else: if farbe: fenster.zeige_nachricht("Schade", "Kassi kann leider nicht alle Felder erreichen. :-(") return 0
def einlesen_datei(dateiname): # Datei versuchsweise oeffnen und versuchen, den Inhalt zeilenweise zu lesen # inhalt ist eine Liste von Strings try: datei = open(dateiname, "r") inhalt = datei.readlines() datei.close() # Entferne alle \n for index, line in enumerate(inhalt): inhalt[index] = line.rstrip() return inhalt # Datei wurde nicht gefunden (Vermutlich falscher Name angegeben) except FileNotFoundError: print("Diese Datei kenne ich nicht.") zeige_nachricht("Unbekannte Datei", "Tut mir leid, aber diese Datei gibts nicht!") sleep(3) exit()
def einlesen_datei(dateiname): # Datei versuchsweise oeffnen und versuchen, den Inhalt zeilenweise zu lesen # inhalt ist eine Liste von Strings try: datei = open(dateiname, "r") inhalt = datei.readlines() datei.close() # Entferne alle \n for index, line in enumerate(inhalt): inhalt[index] = line.rstrip() return inhalt # Datei wurde nicht gefunden (Vermutlich falscher Name angegeben) except FileNotFoundError: print("Diese Datei kenne ich nicht.") zeige_nachricht("Unbekannte Datei", "Tut mir leid, aber diese Datei gibts nicht!") sleep(3) exit()
def kassi_finde_weg(objektliste): zustaende = [objektliste] vaterliste = [] kindliste = [] loesungen = [] history = [] for zustandsnr, zustand in enumerate(zustaende): print("STARTE ZUSTAND " + str(zustandsnr)) unverbind(zustand) print("U1 " + str(zustandsnr)) if not verbindungstest(0, zustand): print("U2 " + str(zustandsnr)) print("Kassi hat sich den Weg in Zustand " + str(zustandsnr) + " versperrt.") continue print("U3 " + str(zustandsnr)) unverbind(zustand) print("U4 " + str(zustandsnr)) for item in zustand: item.printinfo() print("U5 " + str(zustandsnr)) moegliche_ziele = suche_verbindungen(zustand, finde_kassi(zustand)) print("U6 " + str(zustandsnr)) for ziel in moegliche_ziele: neuer_zustand = kassi_bewedi(zustand, finde_kassi(zustand), ziel) zustaende.append(neuer_zustand) print("Zustand " + str(zustandsnr) + " (" + str(finde_kassi(zustand).objektkoordinaten) + ")" + " kann nach " + str(ziel.objektkoordinaten)) print("Kind: " + str(len(zustaende) - 1)) print() vaterliste.append(zustandsnr) kindliste.append(len(zustaende) - 1) print(finde_anzahl_weisse_felder(zustand)) if finde_anzahl_weisse_felder(zustand) == 1: print(zustandsnr) print("Keine weissen Felder verbleibend!") print(vaterliste) print(kindliste) print() gesuchte_nummer = zustandsnr gesucht = "kind" #while gesuchte_nummer != 0: for vaternummer, kindnummer in zip(reversed(vaterliste), reversed(kindliste)): if vaternummer == gesuchte_nummer and gesucht == "vater": gesuchte_nummer = kindnummer gesucht = "kind" history.append(vaternummer) if kindnummer == gesuchte_nummer and gesucht == "kind": gesuchte_nummer = vaternummer gesucht = "kind" history.append(kindnummer) loesungen.append(history) for item in zustaende[0]: if item.kassi_steht: letztes_objekt = item for item in objektliste: if item.kassi_steht: fenster.mach_farbe("yellow", item) elif item.farbe == "w": fenster.mach_farbe("light green", item) sleep(0.8) for item in list(reversed(history)): # For zustand im verlauf for thing in zustaende[item]: pass himmelsrichtungen = "" for item in list(reversed(history)): # For zustand im verlauf for thing in zustaende[item]: # For feld in diesem zustand if thing.kassi_steht: fenster.mach_farbe("yellow", thing) fenster.mach_farbe("gray", letztes_objekt) sleep(0.1) if thing.objektkoordinaten == letztes_objekt.nordkords: himmelsrichtungen += " N " elif thing.objektkoordinaten == letztes_objekt.ostkords: himmelsrichtungen += " O " elif thing.objektkoordinaten == letztes_objekt.suedkords: himmelsrichtungen += " S " elif thing.objektkoordinaten == letztes_objekt.westkords: himmelsrichtungen += " W " letztes_objekt = thing fenster.zeige_nachricht( "Himmelsrichtungen", "Der eben gezeigte Loesungsweg verlaeuft so:\n" + himmelsrichtungen) print("Das ist eine Loesung!") print(len(loesungen)) print(himmelsrichtungen) history = [] print("Zustand: " + str(zustandsnr) + " von " + str(len(zustaende) - 1)) print("das ende aller zustaende ist.. erreicht") if not loesungen: fenster.zeige_nachricht( "Das Ende aller Dinge", "Leider gibt es keine Loesungsmoeglichkeit fuer Aufgabenteil B.") else: fenster.zeige_nachricht( "Das Ende aller Dinge", "Sie haben jetzt alle " + str(len(loesungen)) + " Loesungsmoeglichkeiten gesehen.") print(len(loesungen))
def kassi_finde_weg(objektliste): zustaende = [objektliste] vaterliste = [] kindliste = [] loesungen = [] history = [] for zustandsnr, zustand in enumerate(zustaende): print("STARTE ZUSTAND " + str(zustandsnr)) unverbind(zustand) print("U1 " + str(zustandsnr)) if not verbindungstest(0, zustand): print("U2 " + str(zustandsnr)) print("Kassi hat sich den Weg in Zustand " + str(zustandsnr) + " versperrt.") continue print("U3 " + str(zustandsnr)) unverbind(zustand) print("U4 " + str(zustandsnr)) for item in zustand: item.printinfo() print("U5 " + str(zustandsnr)) moegliche_ziele = suche_verbindungen(zustand, finde_kassi(zustand)) print("U6 " + str(zustandsnr)) for ziel in moegliche_ziele: neuer_zustand = kassi_bewedi(zustand, finde_kassi(zustand), ziel) zustaende.append(neuer_zustand) print( "Zustand " + str(zustandsnr) + " (" + str(finde_kassi(zustand).objektkoordinaten) + ")" + " kann nach " + str(ziel.objektkoordinaten) ) print("Kind: " + str(len(zustaende) - 1)) print() vaterliste.append(zustandsnr) kindliste.append(len(zustaende) - 1) print(finde_anzahl_weisse_felder(zustand)) if finde_anzahl_weisse_felder(zustand) == 1: print(zustandsnr) print("Keine weissen Felder verbleibend!") print(vaterliste) print(kindliste) print() gesuchte_nummer = zustandsnr gesucht = "kind" # while gesuchte_nummer != 0: for vaternummer, kindnummer in zip(reversed(vaterliste), reversed(kindliste)): if vaternummer == gesuchte_nummer and gesucht == "vater": gesuchte_nummer = kindnummer gesucht = "kind" history.append(vaternummer) if kindnummer == gesuchte_nummer and gesucht == "kind": gesuchte_nummer = vaternummer gesucht = "kind" history.append(kindnummer) loesungen.append(history) for item in zustaende[0]: if item.kassi_steht: letztes_objekt = item for item in objektliste: if item.kassi_steht: fenster.mach_farbe("yellow", item) elif item.farbe == "w": fenster.mach_farbe("light green", item) sleep(0.8) for item in list(reversed(history)): # For zustand im verlauf for thing in zustaende[item]: pass himmelsrichtungen = "" for item in list(reversed(history)): # For zustand im verlauf for thing in zustaende[item]: # For feld in diesem zustand if thing.kassi_steht: fenster.mach_farbe("yellow", thing) fenster.mach_farbe("gray", letztes_objekt) sleep(0.1) if thing.objektkoordinaten == letztes_objekt.nordkords: himmelsrichtungen += " N " elif thing.objektkoordinaten == letztes_objekt.ostkords: himmelsrichtungen += " O " elif thing.objektkoordinaten == letztes_objekt.suedkords: himmelsrichtungen += " S " elif thing.objektkoordinaten == letztes_objekt.westkords: himmelsrichtungen += " W " letztes_objekt = thing fenster.zeige_nachricht( "Himmelsrichtungen", "Der eben gezeigte Loesungsweg verlaeuft so:\n" + himmelsrichtungen ) print("Das ist eine Loesung!") print(len(loesungen)) print(himmelsrichtungen) history = [] print("Zustand: " + str(zustandsnr) + " von " + str(len(zustaende) - 1)) print("das ende aller zustaende ist.. erreicht") if not loesungen: fenster.zeige_nachricht( "Das Ende aller Dinge", "Leider gibt es keine Loesungsmoeglichkeit fuer Aufgabenteil B." ) else: fenster.zeige_nachricht( "Das Ende aller Dinge", "Sie haben jetzt alle " + str(len(loesungen)) + " Loesungsmoeglichkeiten gesehen." ) print(len(loesungen))