Ein schönes Beispiel, klingt sehr einfach, hat es aber in sich. Mal so grob geplant mit 2 LEDs und 2 Tastern.

Statusaufteilung:
- Idle: Warte auf Key1Up, um das Spiel zu starten
- Started: Blinke 3x mit LED1, wobei das Erlöschen des 3. Blinkzyklus den Spielstart signalisiert (das 3. Blinken kann man fieserweise noch mit einem leichten Random verzögern)
- Measure: Messe die Zeit bis zum Key2Down und entscheide anhand der Reaktionszeit zwischen Success oder Fail
- Success: Gebe Erfolgsmeldung LED1/2 blinken 10 mal im Wechseltakt.
- Fail: Nur einmal blinken
Success und Fail wechseln zurück zu Idle.
Obacht bei "Started". Wer hier schon vor dem Startsignal wild auf Key2 herumtippt, wird mit Spielabbruch "bestraft".
Ein Timeoverflow in "Measure" sollte das System nach 10s in den "Idle" zurücksetzen

spinnerte Erweiterungsmöglichkeiten:
- Highscore in EEPROM speichern
- Tendenzen besser/schlechter erfassen (also mit vorhergehendem Ergebnis vergleichen)
- Schwierigeres Startverhalten bei guten Ergebnissen (Startblinken wird schneller oder wilder mit mehr Random)

Was uns in den einzelnen States interessiert:
- KeyUp/KeyDown
- Timerzyklus für statusinternen Zähler
Diese Funktionen würde ich jedem Status optional zur Verfügung stellen, egal, ob sie gebraucht werden oder nicht. Zusätzlich bekommt jeder Status eine Init-Funktion, in der er sich entsprechend (erst einmal ganz abstrakt ausgedrückt) am System anmeldet und seine internen Variablen initialisiert.


Aktoren:
- LEDs
- optionale statische Variablen für vorhergehende Ergebnisse
- optional EEPROM für Highscore
Diese "Aktoren" kommen in separate Module, quasi als "globale Funktionen".

Aber bevor ich jetzt codemäßig anfange loszuwirbeln, erst einmal Dein Kommentar. Weiter geht es also nach der nächsten Maus.