Die Grundideen sind folgende:
Wir werden folgende Listen-Operationen verwenden:
l=[7,23,42] # Liste mit Elementen initialisierenprint(len(l)) # Anzahl Element (hier 3)print(l[2]) # Drittes Element (also 42) (Erstes Element ist l[0])l.append(107) # Element hinten anfügen, danach ist die Liste [7,23,42,107]a = l.pop() # Letztes Element entfernen (a ist 107, die Liste wieder [7,23,42]shuffle(l) # Liste verwürfelnIn dieser Aufgabe soll ein Weg nur innerhalb jener Zellen gefunden werden, die im Bild einem schwarzen Pixel entsprechen.
aufgabe7.py fügen Sie am Anfang folgende Zeile hinzu:from pnmbild import PNMBild
herz.pnm oder Ihr eigenes) wie folgt:bild = PNMBild("herz.pnm") l = Laby(bild.breite, bild.hoehe) l.importBild(bild) print(l) l.clearMarks()
Zelle indem Sie folgende Zeile am Anfang vom Programm hinzufügen:from zelle import Zelle
from … import …»-Zeilen) ein, um eine Startzelle mit Bildwert 1 (schwarz) zu finden:def findStart(l:Laby)->Zelle: for y in range(l.hoehe): for x in range(l.breite): if l[x,y].bild==0: # Schwarzer Pixel? return l[x,y]
start = findStart(l)
sleep Anweisungen (und evtl. die print-Anweisungen) in der while-Schlaufe aus.nb.bild==0.Es geht darum, zwei möglichst weit voneinander entfernte Startzellen am Rand vom Bild zu bestimmen.
Die Grundidee ist folgende:
labyrinth, speichern Sie die Datei startzielpaar.pystartzielpaar.py und vervollständigen Sie sie.aufgabe7.py, fügen Sie folgenden import hinzu:from startzielpaar import startzielpaar
p = startzielpaar(l) p[0].mark = "S" p[1].mark = "Z"
Bis jetzt haben wir Labyrinthe erzeugt, aber den Weg zwischen zwei Punkten nicht gespeichert, bzw. nicht bestimmt.
Eine einfache Möglichkeit dafür ist folgende:
Damit ist es Zeit, das Hauptprogramm main.py zu beginnen. Von dort werden alle Funktionen aufgerufen.
labyrinth.main.py. Ausführbar ist der Code aber noch nicht:labyrinth.wegaufbild.py.wegaufbild findet alle Wege.main.py aus. Eventuell müssen/können Sie den Namen der .pnm-Datei anpassen.wegaufbild.py hinzu:def labyrinthNurMitWeg(laby:Laby, weg:list[Zelle]) -> None: # Alle Markierungen löschen laby.clearMarks() # Alle Wände schliessen laby.closeAll() # Weg-Zellen mit # markieren for zelle in weg: zelle.mark = "#" # Wände auf dem weg öffnen for i in range(len(weg)-1): # Vom ersten bis vorletztem Weg-Element d = weg[i].dirTo(weg[i+1]) # Richtung des Wegs an Stelle i weg[i].zustand(d, True) # Wand in diese Richtung öffnen
wegaufbild.py, zu unterst, untermittelbar vor dem return, rufen Sie die Funktion wie folgt auf:labyrinthNurMitWeg(laby, weg)
main.py, fügen Sie als letzte Zeile print(laby) hinzu, um das Labyrinth auszugeben.main.py.wegaufbild.py nach den imports hinzu:def randWandAuf(zelle:Zelle) -> None: if zelle.y==0: zelle.zustand(3, True) elif zelle.y==zelle.laby.hoehe-1: zelle.zustand(1, True) elif zelle.x==0: zelle.zustand(2, True) elif zelle.x==zelle.lab.breite-1: zelle.zustand(0, True) def raenderOeffnen(paar: list[Zelle]) -> None: randWandAuf(paar[0]) randWandAuf(paar[1]) paar[0].mark="S" paar[1].mark="Z"
wegaufbild.py zuunterst, unmittelbar vor dem return auf:raenderOeffnen(paar)
main.py.