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.

GUI zur Roboterwelt

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.

Klassendiagramm

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.

Klassendiagramm

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)
X

Fehler melden

X

Suche