Eine allgemeine Ampel-Klasse

Zustände zyklisch durchlaufen

Auto- und Fußgängerampeln weisen eine Reihe von Gemeinsamkeiten auf. Beim Weiterschhalten durchlaufen beide zyklisch eine bestimmte Folge von Zuständen.

Autoampel:

Autoampel

Fußgängerampel:

Fußgängerampel

Eine Klasse für beliebige Ampeln

Das Verhalten von Ampeln lässt sich verallgemeinernd mit dem folgenden Klassendiagramm beschreiben:

Klassendiagramm - Ampel allgemein

Hier eine Implementierung zu dieser allgemeinen Ampel-Klasse.

class Ampel(object):
    def __init__(self, pListeZustaende):
        self.listeZustaende = pListeZustaende
        self.indexAktuellerZustand = 0

    def schalten(self):
        if self.indexAktuellerZustand < len(self.listeZustaende)-1:
            self.indexAktuellerZustand = self.indexAktuellerZustand + 1
        else:
            self.indexAktuellerZustand = 0

    def getZustand(self):
        return self.listeZustaende[self.indexAktuellerZustand]

    def setZustand(self, z):
        self.indexAktuellerZustand = self.listeZustaende.index(z)
        

# Test
a = Ampel(['rot', 'rotgelb', 'gruen', 'gelb'])
a.setZustand('rot')
print(a.getZustand())
print()
for i in range(4):
    a.schalten()
    print(a.getZustand())
    print()

Aufgabe 1

(a) Simuliere mit dieser Klasse das Verhalten einer Fußgängerampel.

(b) Autoampeln in anderen Ländern (z.B. in Frankreich) verhalten sich manchmal etwas anders als in Deutschland. Benutze die Klasse Ampel zur Simulation einer solchen Ampel.

Autoampel

Spezielle Ampelklassen

Aus der allgemeinen Ampel-Klasse kann man durch eine Erweiterung Klassen für Auto- und Fußgängerampeln gewinnen.

Klassendiagramm - Ampeln mit Vererbung

Die Klassen AmpelAuto und AmpelFussgaenger sollen dabei sämtliche Attribute und Methoden der Basisklasse Ampel übernehmen (man sagt auch erben) und zusätzlich die im Klassendiagramm aufgeführten neuen Methoden (die Konstruktormethode und die Methode getLampen) vorsehen.

Hier eine Implementierung der beiden Klassen Ampel und AmpelAuto. Beachte den Erweiterungshinweis AmpelAuto(Ampel) bei der Deklaration der Klasse AmpelAuto.

class Ampel(object):
    def __init__(self, pListeZustaende):
        self.listeZustaende = pListeZustaende
        self.indexAktuellerZustand = 0

    def schalten(self):
        if self.indexAktuellerZustand < len(self.listeZustaende)-1:
            self.indexAktuellerZustand = self.indexAktuellerZustand + 1
        else:
            self.indexAktuellerZustand = 0

    def getZustand(self):
        return self.listeZustaende[self.indexAktuellerZustand]

    def setZustand(self, z):
        self.indexAktuellerZustand = self.listeZustaende.index(z)        

class AmpelAuto(Ampel):
    def __init__(self, anfangszustand):
        self.listeZustaende = ['rot', 'rotgelb', 'gruen', 'gelb']
        self.indexAktuellerZustand = self.listeZustaende.index(anfangszustand)
    
    def getLampen(self):
        zustand = self.listeZustaende[self.indexAktuellerZustand]
        if zustand == 'rot':
            lampen = (True, False, False)
        elif zustand == 'rotgelb':
            lampen = (True, True, False)
        elif zustand == 'gruen':
            lampen = (False, False, True)
        elif zustand == 'gelb':
            lampen = (False, True, False)
        return lampen

# Test
a = AmpelAuto('gruen')
print(a.getZustand())
print(a.getLampen())
print()
for i in range(4):
    a.schalten()
    print(a.getZustand())
    print(a.getLampen())
    print()

Aufgabe 2

(a) Führe das Programm selbst aus. Kannst du das Verhalten erklären?

(b) Entwickle analog eine Klasse AmpelFussgaenger und teste sie.

X

Fehler melden

X

Suche