Tepki Oyunu: En İyi Süre
Coddy'nin Arduino Journey'sinin Projeler bölümünün bir parçası. Ders 8 / 24.
Eskiz, en iyi (en düşük) süreyi bir değişkende tutar ve her turdan sonra yazdırır.
Başlangıçta henüz en iyi süre yoktur. “Henüz yok” anlamına gelmesi için hiçbir gerçek turun sahip olamayacağı bir değer olan 0'ı kullan. Her turdan sonra: henüz en iyi süre yoksa veya bu tur onu geçerse, bu tur yeni en iyi süredir.
if (best == 0 || reaction < best) {
best = reaction;
}
Serial.print("Best: ");
Serial.print(best);
Serial.println(" ms");Bunu, turun gerçek bir süreyle sona erdiği LIT durumuna koy. Erken başlama bu koda asla ulaşmaz; bu yüzden rekor hâline de gelmez.
En iyi süre kartın belleğinde (RAM) tutulur; güç kapatıldığında bellek silinir: rekor, Run'a yeniden basana kadar kalır.
Görev
OrtaBir kayıt tut:
- başlangıçta 0 olan bir
bestdeğişkeni - her süre tutulan turdan sonra,
best0 ise veya tur daha hızlıysa, turu yeni en iyi süre olarak kaydet - her turdan sonra
Best: 250 msolarak yazdır - erken basışlar hiçbir şeyi değiştirmez
Run'a bas, en iyi süreni geçmeye çalış, sonra Check'e bas.
Kendin dene
const int ledPin = 12;
const int buttonPin = 2;
// Bir turun üç durumu
enum State { READY, WAITING, LIT };
State state = READY;
int lastButton = HIGH; // düğmenin en son okunan durumu
unsigned long waitStart = 0; // beklemenin başladığı an
unsigned long waitTime = 0; // bu beklemenin ne kadar sürdüğü
unsigned long litAt = 0; // LED'in yandığı an
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); // az önce basıldı
lastButton = button;
unsigned long now = millis();
switch (state) {
case READY:
if (pressed) {
randomSeed(micros()); // basılma zamanı hiçbir zaman iki kez aynı olmaz
waitTime = random(1000, 3001);
waitStart = now;
state = WAITING;
}
break;
case WAITING:
if (pressed) {
// Işık yanmadan önce basıldı: hatalı başlangıç.
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;
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Projeler bölümündeki tüm dersler
2Tepki Oyunu
Tepki Oyunu: Rastgele BeklemeTepki Oyunu: ZamanlayıcıTepki Oyunu: Erken BaşlangıçTepki Oyunu: En İyi SüreKendi başına pratik yap: Arduino playground