Einstieg - Ein Roboter mit Rucksack
Ziegel im Rucksack
Bisher konnte der Roboter beliebig viele Ziegel in die Welt hinlegen (und auch wieder aufheben). Wir werden hier eine Robotervariante betrachten, bei der der Roboter Ziegel in einer Art Rucksack mitschleppt und nur dann einen Ziegel in die Welt legen kann, wenn der Rucksack nicht leer ist. Beim Aufsammeln von Ziegeln werden diese in den Rucksack aufgenommen.
Die Abbildung zeigt einen Rucksackroboter, der aktuell 4 Ziegel in seinem Rucksack hat.
Mehr Gemeinsamkeiten als Unterschiede
Die folgenden Klassendiagramme beschreiben einen herkömmlichen
Roboter und einen Rucksackroboter.
Aufgabe 1
(a) Vergleiche die Klassendiagramme ganz genau und kläre folgende Fragen: Unterscheiden sich die Klassen in den Attributen? Unterscheiden sich die Klassen in den Methoden?
(b) Überleg dir, ob sich sich bestimmte Methoden anders verhalten. Beachte, dass man das nicht den Klassendiagrammen entnehmen kann.
Rucksackroboter als spezieller Roboter
Die oben gezeigten Klassendiagramme weisen mehr Gemeinsamkeiten als Unterschiede auf.
Ein Rucksackroboter kann als spezieller Roboter angesehen werden, der - im Vergleich zu einem
herkömmlichen
Roboter - nur in einigen Bestandteilen abgeändert worden ist. Das folgende Klassendiagramm
soll diesen Zusammenhang verdeutlichen.
Ein Rucksackroboter verfügt über alle Attribute eines Roboters. Hinzu kommt noch ein Attribut
rucksack
zur Verwaltung der aktuellen Anzahl von Ziegeln im Rucksack.
Der Konstruktor __init__
der Klasse Rucksackroboter
unterscheidet sich
vom Konstruktor der Klasse Roboter
. Beim Rucksackroboter wird bei der Erzeugung gleich
die Anzahl der Ziegel im Rucksack festgelegt. Der Konstruktor __init__
der Klasse
Rucksackroboter
sieht hierfür den Parameter anzahl
vor.
Die Methoden ziegelHinlegen
und ziegelAufheben
unterscheiden sich nicht
hinsichtlich ihrer Signaturen. Aber das Verhalten ist bei einem Rucksackroboter etwas anders als bei
einem Roboter.
Die Methoden getZustand
und setZustand
unterscheiden sich dadurch,
dass ein Rucksackroboterzustand auch die Anzahl der Ziegel im Rucksack berücksichtigt.
Ein Rucksackroboter verfügt zusätzlich über die Methoden getRucksack
und
setRucksack
.
Alle anderen Methoden sind bei einem Rucksackroboter genauso festgelegt wie bei einem Roboter.
Implementierung eines Rucksackroboters
Bei der Implementierung des Rucksackroboters gehen wir von der Implementierung eines herkömmlichen
Roboters aus, wie sie in der Datei
roboterwelt.txt (deren Dateiendung man ändern sollte) zu finden ist.
Ergänzt wird sie um eine Deklaration der Klasse Rucksackroboter
.
# Deklaration der Klasse Roboter class Roboter(object): def __init__(self): ... ... # Deklaration der Klasse Rucksackroboter class Rucksackroboter(Roboter): def __init__(self, anzahl): Roboter.__init__(self) self.rucksack = anzahl def getRucksack(self): return self.rucksack def setRucksack(self, anzahl): self.rucksack = anzahl def getZustand(self): return (self.x, self.y, self.r, self.rucksack) def setZustand(self, x, y, r, anzahl): self.x = x self.y = y self.r = r self.rucksack = anzahl def ziegelHinlegen(self): if self.nichtVorWand() and self.rucksack > 0: Roboter.ziegelHinlegen(self) self.rucksack = self.rucksack - 1 def ziegelAufheben(self): if self.nichtVorWand() and self.vorZiegel(): Roboter.ziegelAufheben(self) self.rucksack = self.rucksack + 1 # Deklaration der Klasse Welt class Welt(object): def __init__(self, x, y): ... ...
Aufgabe 2
Analysiere zunächst die Deklaration der Klasse Rucksackroboter
. Kannst du alle Festlegungen
erklären?
Aufgabe 3
Speichere die Klassendeklarationen in einem neuen Modul rucksackroboterwelt.py
ab und teste sie
mit Python-Dialogen der folgenden Art oder entsprechenden Testprogrammen.
>>> welt = Welt(5, 5) >>> rob = Rucksackroboter(4) >>> rob.setWelt(welt) >>> rob.getZustand() (0, 0, 'S', 4) >>> rob.ziegelHinlegen() >>> rob.getZustand() (0, 0, 'S', 3)