lehrkraefte:blc:informatik:glf24:laby:wegfindentodo

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
lehrkraefte:blc:informatik:glf24:laby:wegfindentodo [2025/05/13 18:22] – created Ivo Blöchligerlehrkraefte:blc:informatik:glf24:laby:wegfindentodo [2025/06/19 07:48] (current) Ivo Blöchliger
Line 18: Line 18:
   * Führen Sie das Programm aus.   * Führen Sie das Programm aus.
   * Studieren Sie das Programm und versuchen Sie, seine Funktionsweise zu verstehen.   * Studieren Sie das Programm und versuchen Sie, seine Funktionsweise zu verstehen.
-  * Warum und wie findet der mit '#' markierte «Punkt» wieder den Weg an den Anfang zurück? 
     * Führen Sie das Programm in einem 2x2-Labyrinth von Hand aus. Führen Sie die todo-Liste nach.     * Führen Sie das Programm in einem 2x2-Labyrinth von Hand aus. Führen Sie die todo-Liste nach.
  
Line 36: Line 35:
 </code> </code>
   * Damit kann die Bildinformation von jeder Zelle angefragt werden.   * Damit kann die Bildinformation von jeder Zelle angefragt werden.
-  * Fügen Sie folgende Funktion (nach den import-Zeilen) ein, um eine Startzelle mit Bildwert 1 (schwarz) zu finden:+  * Importieren Sie zusätzliche die Klasse ''Zelle'' indem Sie folgende Zeile am Anfang vom Programm hinzufügen: 
 +<code python> 
 +from zelle import Zelle 
 +</code> 
 +  * Fügen Sie folgende Funktion (nach den «''from ... import ...''»-Zeilen) ein, um eine Startzelle mit Bildwert 1 (schwarz) zu finden:
 <code python> <code python>
 def findStart(l:Laby)->Zelle: def findStart(l:Laby)->Zelle:
Line 48: Line 51:
 start = findStart(l) start = findStart(l)
 </code> </code>
-  * Kommentieren Sie die ''sleep'' Anweisungen (und evtl. die ''print''-Anweisungen) im in der while-Schlaufe aus.+  * Kommentieren Sie die ''sleep'' Anweisungen (und evtl. die ''print''-Anweisungen) in der while-Schlaufe aus.
   * In der while-Schleife, im for-loop, wo überprüft wird, ob der Nachbar existiert und noch frei ist, fügen Sie die zusätzliche Bedingung hinzu, dass der entsprechende Pixel schwarz ist, mit ''nb.bild==0''.   * In der while-Schleife, im for-loop, wo überprüft wird, ob der Nachbar existiert und noch frei ist, fügen Sie die zusätzliche Bedingung hinzu, dass der entsprechende Pixel schwarz ist, mit ''nb.bild==0''.
   * Testen Sie das Programm.   * Testen Sie das Programm.
  
 +
 +===== Aufgabe 9 =====
 +<WRAP info>
 +Es geht darum, zwei möglichst weit voneinander entfernte Startzellen am Rand vom Bild zu bestimmen.
 +
 +Die Grundidee ist folgende:
 +  * Man erstellt eine Liste von allen Zellen, die am Rand sind und schwarzen Pixeln entsprechen.
 +  * Für jedes mögliche Paar dieser Zellen wird die Entfernung mit der «Manhattan Distance» bestimmt.
 +  * Das Paar mit der grössten Distanz wird als Start- und Endpunkt des Labyrinths verwendet.
 +</WRAP>
 + 
 +  * Immer noch im Verzeichnis ''labyrinth'', speichern Sie die Datei {{lehrkraefte:blc:informatik:glf24:laby:startzielpaar.py}}
 +  * Studieren Sie die Funktion in der Datei ''startzielpaar.py'' und vervollständigen Sie sie.
 +  * Zurück in der Datei ''aufgabe7.py'', fügen Sie folgenden import hinzu:
 +<code python>
 +from startzielpaar import startzielpaar
 +</code>
 +  * Ganz am Schluss, unmittelbar vor der Ausgabe, markieren Sie das Start/Ziel-Paar wie folgt:
 +<code python>
 +p = startzielpaar(l)
 +p[0].mark = "S"
 +p[1].mark = "Z"
 +</code>
 +
 +===== Aufgabe 10 =====
 +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:
 +  * immer, wenn ein neuer Nachbar besucht wird, wird der Nachbar mit der Richtung markiert, in der man zurück kommt.
 +  * Dann kann man mit diesen Markierungen von der Zielzelle (von jeder Zelle!) zurück zur Startzelle finden.
 +
 +Damit ist es Zeit, das Hauptprogramm ''main.py'' zu beginnen. Von dort werden alle Funktionen aufgerufen.
 +
 +  * Speichern Sie die Datei {{lehrkraefte:blc:informatik:glf24:laby:main.py}} im Verzeichnis ''labyrinth''.
 +  * Studieren und kommentieren Sie den Code in der Datei ''main.py''. Ausführbar ist der Code aber noch nicht:
 +  * Speichern Sie die Datei {{lehrkraefte:blc:informatik:glf24:laby:wegaufbild.py}} ebenfalls im Verzeichnis ''labyrinth''.
 +  * Studieren Sie den Code der Datei ''wegaufbild.py''.
 +    * Der erste Teil der Funktion ''wegaufbild'' findet alle Wege.
 +    * Der zweite Teil bestimmt den Weg vom Ziel zum Start und macht eine Liste aus allen Zellen (in der korrekten Reihenfolge).
 +  * Führen Sie jetzt ''main.py'' aus. Eventuell müssen/können Sie den Namen der .pnm-Datei anpassen.
 +  * Der Weg soll jetzt noch markiert werden und alle Wände, ausser jenen für den Weg, geschlossen werden.
 +  * Fügen Sie dazu folgende Funktion nach den imports in der Datei ''wegaufbild.py'' hinzu:
 +<code python>
 +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
 +</code>
 +  * In der Datei ''wegaufbild.py'', zu unterst, untermittelbar vor dem ''return'', rufen Sie die Funktion wie folgt auf:
 +<code python>
 +    labyrinthNurMitWeg(laby, weg)
 +</code>
 +  * In der Datei ''main.py'', fügen Sie als letzte Zeile ''print(laby)'' hinzu, um das Labyrinth auszugeben.
 +  * Testen Sie das Programm ''main.py''.
 +  * Als letztes sollen noch die Wände von Start- und Zielzelle nach aussen geöffnet werden. Fügen Sie die beiden folgenden Funktionen in der Datei ''wegaufbild.py'' nach den imports hinzu:
 +<code python>
 +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"
 +</code>
 +  * Rufen Sie die Funktion in der Datei ''wegaufbild.py'' zuunterst, unmittelbar vor dem ''return'' auf:
 +<code python>
 +    raenderOeffnen(paar)
 +</code>
 +  * Testen Sie das Programm ''main.py''.
  • lehrkraefte/blc/informatik/glf24/laby/wegfindentodo.1747160554.txt.gz
  • Last modified: 2025/05/13 18:22
  • by Ivo Blöchliger