This is an old revision of the document!
Klassen Laby und Zelle
Klassen
Klassen sind Teil eines verbreiteten und sehr nützlichen Programmierkonzepts.
Für unsere Zwecke sind Klassen eine Zusammenfassung von Daten (Variablen, genannt Attribute) und Funktionen (gennant Methoden), die mit diesen Attributen interagieren.
Diese Einheit erlaubt es sicherzustellen, dass die Daten immer konsistent sind.
Z.B. im Falle unseres Labyrinths stellen die Klassen sicher, dass wenn die Mauer von einer Zelle zur anderen geöffnet wird, dass das auch automatisch in umgekehrter Richtung geschieht.
Einrichten
- Legen Sie einen neuen Ordner an (z.B. mit dem Namen labyrinth), wo dann alle diesbezüglichen Programme gespeichert werden.
- Speichern Sie die beiden folgenden Dateien im neuen Ordner (Rechtslick → Ziel speichern unter oder so ähnlich, nicht öffnen und kopieren bitte!)
Hello Laby
- Mit VS-Code, öffnen Sie den neuen Ordner labyrinth mit File → Open Folder. (Das ist der Ordner, der die beiden Dateien
laby.pyundzelle.pyenthält). - Legen Sie dort eine neue Datei
hello.pyan.
- hello.py
from laby import Laby from zelle import Zelle l = Laby(5,3) print(l)
Die imports und die Initialisierung des Labyrinths l = Laby(5,3) sind in den folgenen Codes der Übersichtlichkeit halber weggelassen.
Zellen markieren
l[2,1].mark = 'Z' print(l) print(f"Zelle (2,1) ist mit {l[2,1].mark} markiert")
Mauern öffnen/schliessen
Der erste Parameter gibt die Richtung an, in welche die Mauer geöffnet werden soll (0 rechts, 1 unten, 2 links, 3 oben).
l[1,1].oeffneMauer(0) l[2,1].oeffneMauer(1)
Ist der zweite, optionale Parameter False, wird die Mauer geschlossen:
l[2,1].oeffneMauer(1, False)
Labyrinthe speichern und einlesen
Beispiellabyrinthe gibt es hier: labs.zip. Entpacken Sie die Dateien ins gleiche Verzeichnis, wo sich ihre Programme und die Klassen befinden.
Von Datei laden
from laby import Laby from zelle import Zelle l = Laby.load("10x07-06.txt") print(l)
In Datei speichern
# l enthält eine Instanz der Klasse Laby l.save("meineloesung.txt")
Aufgaben
Die Aufgaben (ohne Zusatzaufgaben) sollten von allen gelöst werden.
Die Zusatzaufgaben sind dazu da, damit sich jene mit mehr Übung nicht langweilen
Kreuz
Programmieren Sie in Labyrinth das wie folgt aussieht:
+---+---+---+---+---+ | | | | | | +---+---+ +---+---+ | | | | | | +---+---+ +---+---+ | | +---+---+ +---+---+ | | | | | | +---+---+ +---+---+ | | | | | | +---+---+---+---+---+
Zusatzaufgabe: Schreiben Sie ein Programm so, dass es für alle Labyrinthgrössen funktioniert. Hinweise:
breite = l.breite # Anzahl Zellen horizontal hoehe = l.hoehe # Anzahl Zellen vertikal print(7//2) # Ganzzahldivision, wird immer abgerundet, ergibt also 3 (und nicht 3.5)
Heizkörper
Produzieren Sie folgendes Labyrinth:
+---+---+---+---+---+---+---+---+ | | +---+---+---+---+---+---+---+ + | | + +---+---+---+---+---+---+---+ | | +---+---+---+---+---+---+---+ + | | + +---+---+---+---+---+---+---+ | | +---+---+---+---+---+---+---+---+
Hinweis:
- Überprüfen ob eine Zahl
ygerade ist:if y%2 == 0:
Zusatzaufgabe: Programm funktioniert für beliebige Labyrinthgrössen.
Text
Programmieren Sie folgende Ausgabe:
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | | | | P | r | o | g | r | a | m | m | i | e | r | e | n | | | | | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | | | | | | | | m | a | c | h | t | | | | | | | | | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | | | | | | | | S | p | a | s | s | | | | | | | | | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Hinweis:
mit for buchstabe in "blabla": kann etwas für jeden Buchstaben wiederholt werden.
Zusatzaufgabe: Das Programm funktioniert mit beliebigen Texten als einzige Vorgabe
# Vorgegebener Text text = "Das geht auch voll automatisiert" # Der Rest ist automatisch woerter = text.split(" ") # Text nach Leerschlägen aufteilen und als Liste speichern. anzahlWoerter = len(woerter) # Anzahl Wörter lmax = max([len(w) for w in woerter]) # Anzahl Buchstaben im längsten Wort # ... for index, wort in enumerate(woerter): # Wiederhole für jedes Wort, inkl. index pass # Tu erst mal nix