Tepki Oyunu: Erken Başlangıç
Coddy'nin Arduino Journey'sinin Projeler bölümünün bir parçası. Ders 7 / 24.
Şu anda kurnaz bir oyuncu hile yapabilir: beklerken tekrar tekrar basar ve basışlardan biri ışık yandıktan hemen sonra gelir. Yarışlarda bunun için bir kural vardır: sinyalden önce hareket etmek erken çıkış sayılır ve yarış iptal edilir.
Durum makinesi, oyuncunun ne zaman erken davrandığını zaten biliyor: WAITING durumunda yapılan her basış. Saati kontrol etmeden önce burada kontrol et:
case WAITING:
if (pressed) {
Serial.println("Too soon!");
state = READY;
} else if (millis() - waitStart >= waitTime) {
// önceki gibi LED'i yak
}
break;READY durumuna geri dönmek turu bitirir: LED hiç yanmaz ve sonraki basış yeni ve rastgele bir bekleme süresiyle yeni bir oyun başlatır. delay(waitTime) kullanıldığında kart bu basışı hiç algılayamazdı.
Görev
OrtaErken basışları yakalayın:
WAITINGdurumunda bir basış,Too soon!mesajını yazdırır ve LED'i yakmadanREADYdurumuna geri döner- diğer her şey aynı kalır: sonraki basış yeni bir tur başlatır
Çalıştır'a basın, art arda iki kez basmayı deneyin, ardından Kontrol Et'e basın.
Kendin dene
const int ledPin = 12;
const int buttonPin = 2;
// Bir turun üç durumu
enum State { READY, WAITING, LIT };
State state = READY;
int lastButton = HIGH; // butonun son okunan değeri
unsigned long waitStart = 0; // beklemenin başladığı an
unsigned long waitTime = 0; // bu beklemenin ne kadar süreceği
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 (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