Menu
CoddyTech

Reaktionsspiel: Bestzeit

Teil des Abschnitts Projekte der Arduino-Journey von Coddy. Lektion 8 von 24.

Der Sketch speichert die beste (niedrigste) Zeit in einer Variablen und gibt sie nach jeder Runde aus.

Zu Beginn gibt es noch keine beste Zeit. Verwende den Wert 0, den keine echte Runde erreichen kann, als Bedeutung für „noch keine“. Nach jeder Runde gilt: Wenn es noch keine beste Zeit gibt oder diese Runde besser war, ist diese Runde die neue Bestzeit.

if (best == 0 || reaction < best) {
  best = reaction;
}
Serial.print("Best: ");
Serial.print(best);
Serial.println(" ms");

Füge dies in den Zustand LIT ein, in dem eine Runde mit einer echten Zeit endet. Ein Fehlstart erreicht diesen Code nie und wird daher nie zum Rekord.

Die Bestzeit befindet sich im Speicher (RAM) des Boards, der beim Ausschalten gelöscht wird: Der Rekord bleibt erhalten, bis du erneut auf Run drückst.

challenge icon

Aufgabe

Mittel

Führe Buch darüber:

  • eine Variable best, zu Beginn 0
  • nach jeder gemessenen Runde: Wenn best 0 ist oder die Runde schneller war, speichere die Runde als neuen Bestwert
  • gib ihn nach jeder Runde aus als Best: 250 ms
  • Fehlstarts ändern nichts

Klicke auf Run, versuche, deinen Bestwert zu übertreffen, und klicke dann auf Check.

Probier es selbst

const int ledPin = 12;
const int buttonPin = 2;

// Die drei Zustände einer Runde
enum State { READY, WAITING, LIT };
State state = READY;

int lastButton = HIGH;       // der zuletzt gemessene Zustand des Tasters
unsigned long waitStart = 0; // wann die Wartezeit begann
unsigned long waitTime = 0;  // wie lange diese Wartezeit dauert
unsigned long litAt = 0;     // wann die LED aufleuchtete

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println("Press the button to start");
}

void loop() {
  int button = digitalRead(buttonPin);
  bool pressed = (button == LOW && lastButton == HIGH);  // gerade gedrückt
  lastButton = button;
  unsigned long now = millis();

  switch (state) {
    case READY:
      if (pressed) {
        randomSeed(micros());  // der Zeitpunkt des Drückens ist nie zweimal gleich
        waitTime = random(1000, 3001);
        waitStart = now;
        state = WAITING;
      }
      break;
    case WAITING:
      if (pressed) {
        // Vor dem Aufleuchten gedrückt: ein Fehlstart.
        Serial.println("Too soon!");
        state = READY;
      } else if (now - waitStart >= waitTime) {
        digitalWrite(ledPin, HIGH);
        litAt = now;
        state = LIT;
      }
      break;
    case LIT:
      if (pressed) {
        digitalWrite(ledPin, LOW);
        unsigned long reaction = now - litAt;
        Serial.print("Reaction: ");
        Serial.print(reaction);
        Serial.println(" ms");
        state = READY;
      }
      break;
  }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Projekte

Übe selbstständig: Arduino-Playground