Table of Contents

Einheit 4: Komplette Wegfindungsalgorithmen

Die Grundideen sind folgende:

Wir werden folgende Listen-Operationen verwenden:

  • l=[7,23,42] # Liste mit Elementen initialisieren
  • print(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ürfeln

Aufgabe 7

Aufgabe 8

In dieser Aufgabe soll ein Weg nur innerhalb jener Zellen gefunden werden, die im Bild einem schwarzen Pixel entsprechen.

from pnmbild import PNMBild
bild = PNMBild("herz.pnm")
l = Laby(bild.breite, bild.hoehe)
l.importBild(bild)
print(l)
l.clearMarks()
from zelle import Zelle
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)

Aufgabe 9

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.
from startzielpaar import startzielpaar
p = startzielpaar(l)
p[0].mark = "S"
p[1].mark = "Z"

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:

Damit ist es Zeit, das Hauptprogramm main.py zu beginnen. Von dort werden alle Funktionen aufgerufen.

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
    labyrinthNurMitWeg(laby, weg)
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"
    raenderOeffnen(paar)