Erst etwas Theorie, später gibt es etwas zu sehen.
In der 10. Klasse entwirft und programmiert man einfache Zustandsautomaten. Die sehen auf dem Papier gerne mal so aus:

Der Automat (hier ein Fahrstuhl) kann sich in verschiedenen Zuständen befinden. Er beginnt im Zustand Erdgeschoss (deshalb zeigt da ein Pfeil hin). Es gibt noch zwei weitere Zustände, Keller und 1. Stock. Der Automat kann seinen Zustand ändern, das sind die Pfeile zwischen den Zuständen. Wenn der Automat im Zustand „Erdgeschoss“ ist und die Aktion „Pfeil nach oben drücken“ eintritt, dann springt der Automat in den Zustand „1. Stock“.
Es geht aber auch noch komplizierter:

In diesem Automaten geht es um ein Marsmännchen, das im Zustand Mars (Nr. 4) beginnt. Je nach Aktion (j für Jupiter, p für Pluto, w für Weltall und so weiter) springt das Marsmännchen in einen neuen Zustand, wenn dieser Zustandsübergang laut Diagramm möglich ist.
Allerdings gibt es noch zwei Feinheiten:
1. Für manche Zustandsübergänge gibt es eine Bedingung, die erfüllt sein muss. Diese Bedingungen sind in rot angegeben. Das Marsmännchen hat nämlich eine gewisse Sprungkraft, am Anfang 10. Vom Mars zum Jupiter springen kann es nur, wenn (neben der auslösenden Aktion j) seine Kraft mindestens 1 beträgt, sonst wird nichts daraus.
2. Und zuletzt gibt es manchmal, in dunkelgrün angegeben, noch weitere Aktionen, die neben dem Zustandsübergang ausgelöst werden. Im Fall vom Sprung von Mars zu Jupiter steht da etwa, dass sich die Kraft um 1 verringert, beim Sprung vom Weltall (Nr. 7) zum Mars (Nr. 4) sind es sogar 5 Punkte. Manche Reisen sind allerdings umsonst. Auftanken kann man nur auf dem Mond, wenn man den erreicht, wir die Kraft wieder auf 10 gesetzt. Wenn man irgendwo auf einem Planeten festsitzt und nicht genug Kraft hat um wegzukommen, ja, dann hat man Pech gehabt.
Einfacher ist das, wenn man es ausprobiert (Java-Applet, läuft also nicht überall):
Möglich sind die Eingaben: j, p, w (für Weltall), e, n (für Neumond), m und s – aber natürlich führen nicht alle immer zu einem Zustandsübergang.
Programmiert und gezeichnet haben den Marsmännchen-Automaten (abgesehen von der Ausgabe in einem Fenster, dazu später mehr) zwei Schülerinnen aus der 10. Klasse. Entstanden sind aber auch noch andere Automaten:
https://www.youtube.com/watch?v=ExWJaaJYRkU
Weitere Automaten:
Programmiert haben die Schüler dabei nur den Automaten, und da vor allem die Zustandsübergangsmethode. Um die grafische Ausgabe habe ich mich gekümmert, und zwar so (siehe Eintrag zu MVC):

(Das ist kein Klassendiagramm, sondern die BlueJ-Oberfläche, gibt aber einen Eindruck der Verhältnisse wieder.)
- Das Marsmännchen (oder was auch immer) hat eine Methode
aktionEmpfangen(char)
. Je nach empfangener Aktion, abgekürzt durch einen einzelnen Buchstaben, ändert es seinen Zustand und teilt das daraufhin der Welt mit. Das Marsmännchen erbt nämlich vom Automaten auch die Sende-Fähigkeit. - Das Sekretariat (das auch ein Empfänger ist) empfängt die Nachricht über den neuen Zustand und wählt, dem Zustand entsprechend, eine neue Grafik aus, die dargestellt werden soll. Das ist die einzige Klasse, in der Schüler etwas schreiben müssen: die Namen der Grafiken.
- Die Hauptarbeit der Darstellung übernimmt das Fenster. Der Fensterboss ist nur dazu da, damit man ein- und dasselbe Programm sowohl als Applet (also in einer Webseite) wie auch als eigenes Programm ausführen kann. Das Fenster stellt Textfelder und Knöpfe zur Verfügung. Wenn ein Knopf gedrückt wird, die Information und eventuell der Inhalt des Textfelds an die Steuerung.
- Die Steuerung wertet die Eingabe aus. Standardmäßig werden nur Eingaben angenommen, die 1 Zeichen lang sind; alles andere führt zu einer Rückmeldung, dass etwas nicht stimmt. Dieses eine Zeichen wird dann an den Automaten, also das Marsmännchen, weitergeleitet, das daraufhin eventuell seinen Zustand ändert – und immer so weiter. (Man könnte die Steuerung auch zu einem echten Übersetzer machen: dann müsste der Benutzer ganze Wörter eintippen, also etwa „Gehe zum Jupiter“, und die Steuerung würde das in ein ‚j‘ übersetzen und das an den Automaten schicken.
Auf Interfaces (und Beobachtermuster) und Zustandsmodellierung mit eigenen Klassen habe ich verzichtet. Es reicht, wenn die Schüler in der 10. ein bisschen hineinschnuppern. Herunterladen kann man das BlueJ-Projekt hier (neue Version), es ist aber sehr spärlich kommentiert (auch die readme.txt lesen!), und im Fall des Fensters auch eher schlampig. GUIs interessieren mich wenig.
Wenn es nur um einfache Automaten ginge, könnte man den Schülern auch eine Benutzeroberfläche schreiben, wo sie nur ihre Bildernamen speichern und die Übergänge mit Mausklicks auswählen müssen, aber es geht ja auch darum, Programmierung zu üben.
Zustandsautomaten kann man immer mal brauchen. Aus einem Kommentar beim Kollegen embee habe den Hinweis auf die Rolle von Zustandsautomaten bei Comptuerspielen.
Wichtig war mir ansonsten auch, dass die Schüler ihr Produkt in einem kleinen Video vorstellen, auch wenn ich die nicht alle hier veröffentlichen darf.
Schreibe einen Kommentar