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.
Aufgabe
MittelFühre Buch darüber:
- eine Variable
best, zu Beginn 0 - nach jeder gemessenen Runde: Wenn
best0 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;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Projekte
2Reaktionsspiel
Reaktionsspiel: Zufällige WartezeitReaktionsspiel: TimerReaktionsspiel: FehlstartReaktionsspiel: BestzeitÜbe selbstständig: Arduino-Playground