Menu
CoddyTech

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ı.

challenge icon

Görev

Orta

Erken basışları yakalayın:

  • WAITING durumunda bir basış, Too soon! mesajını yazdırır ve LED'i yakmadan READY durumuna 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;
  }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Arduino playground