Was ist ein Zustandsautomat?
Ein Zustandsautomat (englisch State Machine) ist ein Modell mit einer festen Liste von Zuständen. Regeln legen fest, wann das Spiel von einem Zustand in einen anderen wechselt. Er hält den Code übersichtlich, weil das Spiel immer in genau einem Zustand ist.
Eine Ampel ist das einfachste Beispiel. Sie zeigt Rot, Rot mit Gelb, Grün oder Gelb, und nie zwei Lichter, die sich widersprechen.
Am Ende dieser Lektion
Notiz
Ich kann ein Spiel mit Zuständen und Übergängen als Zustandsautomat beschreiben.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Zustand | die Lage, in der das Spiel gerade ist | spielt |
| Ereignis | etwas, das passiert und einen Wechsel auslösen kann | pause |
| Übergang | der Wechsel von einem Zustand in einen anderen | |
| Zustandsautomat | ein Modell aus Zuständen, Ereignissen und Übergängen | |
| Eingabe | was Spielende tun: eine Taste drücken, klicken, tippen | |
| Zustandstabelle | eine Tabelle, die für jeden Zustand und jedes Ereignis den nächsten Zustand nennt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Spiel ist immer in genau einem Zustand
Ein Spiel kann bereit sein, laufen, pausiert sein oder vorbei sein. Jeder dieser Zustände verlangt anderen Code: Im Zustand "spielt" bewegt das Update die Figuren, im Zustand "pausiert" tut es nichts.
Ein Ereignis löst einen Übergang aus. Ein Druck auf die Pausetaste führt von "spielt" nach "pausiert". Das Diagramm zeigt ein eigenes Beispiel mit vier Zuständen.
Wechseln Sie den Zustand mit Schaltflächen
<p id="anzeige">Zustand: bereit</p>
<button onclick="ereignis('start')">start</button>
<button onclick="ereignis('pause')">pause</button>
<button onclick="ereignis('verloren')">verloren</button>
<button onclick="ereignis('neustart')">neustart</button>
Die Zustandstabelle sagt, was passiert
Eine Zustandstabelle nennt für jeden Zustand und jedes Ereignis den nächsten Zustand. Steht eine Kombination nicht in der Tabelle, bleibt das Spiel im alten Zustand.
Das ist ein Vorteil: Sie sehen auf einen Blick, was erlaubt ist. Ein Druck auf start im Zustand "vorbei" tut nichts, solange kein Übergang dafür eingetragen ist.
Die Zustandstabelle des Beispiels
| Zustand | Ereignis | Neuer Zustand |
|---|---|---|
| bereit | start | spielt |
| spielt | pause | pausiert |
| spielt | verloren | vorbei |
| pausiert | pause | spielt |
| vorbei | neustart | spielt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eingaben werden gespeichert, die Schleife liest sie
Eine Taste meldet sich nur im Moment des Drückens. Das Spiel braucht aber in jedem Bild die Antwort auf die Frage: Ist die Taste gerade unten?
Deshalb speichert das Spiel die Eingabe. Beim Drücken setzt es einen Merker auf wahr, beim Loslassen auf falsch. Das Update liest nur den Merker und kennt keine Tasten.
Ein häufiger Fehler
Warnung
Viele nehmen für jeden Zustand einen eigenen Schalter, etwa istPause und istVorbei. Dann können beide gleichzeitig wahr sein, und das Spiel ist in einem unmöglichen Zustand. Ein Zustandsautomat hat eine Variable mit einem Wert.
Das Spiel des Labs hat zwei Zustände
"Catch the stars" hat keine Pause und kein Menü. Es kennt nur zwei Zustände: Das Spiel läuft, oder es ist vorbei. Eine Variable gameOver hält das fest.
Das Update endet sofort, wenn gameOver wahr ist. Ein Druck auf die Leertaste oder auf Restart setzt das Spiel zurück. Alles andere in dieser Lektion ist ein eigenes Beispiel.
Die Stellen finden, an denen gameOver wechselt
docker exec jupyter grep -n "gameOver = " game/game.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Zwei Zeilen genügen für zwei Zustände
Das Kommando gibt zwei Zeilen aus. Zeile 48 setzt gameOver auf false: Das passiert in newGame, beim Start und beim Neustart.
Zeile 83 setzt gameOver auf true. Das passiert im Update, sobald das letzte Leben verloren ist. Das ist der ganze Übergang des Spiels.