Menu
CoddyTech

Simon: Deseni Tekrarla

Coddy'nin Arduino Journey'sinin Projeler bölümünün bir parçası. Ders 15 / 24.

Pano oynadıktan sonra sıra sende: dört rengi aynı sırayla tekrarla. Taslakta, şimdiye kadar kaç rengi tekrarladığını sayan step adında bir sayıya daha ihtiyaç var. Sırada basman gereken renk sequence[step].

Bir basışı, oyunun başlangıçta yaptığı gibi, düğme bırakıldığında say. O zamana kadar ışığı ve nota sönmüş olur; böylece taslak sorunsuzca tepki verebilir:

void checkPress(int i) {
  if (i != sequence[step]) {
    Serial.println("Wrong!");
    playing = false;
    return;
  }
  step++;
  if (step == 4) {
    Serial.println("Well done!");
    playing = false;
  }
}

return işlevden hemen çıkar; bu yüzden yanlış bir renkten sonra altındaki hiçbir şey çalışmaz. playing değerini yeniden false yapmak oyunu bitirir ve bir sonraki basış yeni bir oyun başlatır.

Her yeni oyun saymaya en baştan başlamalıdır: startGame() içinde step = 0 ayarla.

challenge icon

Görev

Zor

Oyuncunun yanıt vermesini sağlayın:

  • bir int step = 0;; startGame() içinde 0'a sıfırlanır
  • bir düğme bırakıldığında ve oyun playing durumundayken checkPress(i) çağrılır
  • yanlış bir renk Wrong! yazdırır ve oyunu bitirir
  • dört doğru renkten sonra Well done! yazdırır ve oyunu bitirir

setup() içinde Serial'ı başlatın. Run'a basın, izleyin, deseni tekrarlayın, ardından Check'e basın.

Kendin dene

// Her renk için bir giriş: kırmızı, yeşil, mavi, sarı
const int ledPins[4] = {9, 10, 11, 12};
const int buttonPins[4] = {2, 3, 4, 5};
const int notes[4] = {262, 330, 392, 523};  // C, E, G ve tiz C
const int buzzerPin = 8;

int lastState[4] = {HIGH, HIGH, HIGH, HIGH};  // her düğmenin son okunan değeri

int sequence[4];       // kartın çaldığı renkler
bool playing = false;  // bir basış oyunu başlatana kadar false

// i rengini yak ve notasını çal.
void lightOn(int i) {
  digitalWrite(ledPins[i], HIGH);
  tone(buzzerPin, notes[i]);
}

// i rengini söndür ve sesi durdur.
void lightOff(int i) {
  digitalWrite(ledPins[i], LOW);
  noTone(buzzerPin);
}

// Diziyi çal: her renk 400 ms, ardından 200 ms sessizlik.
void playSequence() {
  delay(500);
  for (int i = 0; i < 4; i++) {
    lightOn(sequence[i]);
    delay(400);
    lightOff(sequence[i]);
    delay(200);
  }
}

// Yeni ve rastgele bir dizi seçip çal.
void startGame() {
  randomSeed(micros());
  for (int i = 0; i < 4; i++) {
    sequence[i] = random(4);
  }
  playing = true;
  playSequence();
}

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(ledPins[i], OUTPUT);
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
}

void loop() {
  for (int i = 0; i < 4; i++) {
    int state = digitalRead(buttonPins[i]);
    if (state == LOW && lastState[i] == HIGH) {  // basıldı
      lightOn(i);
    }
    if (state == HIGH && lastState[i] == LOW) {  // bırakıldı
      lightOff(i);
      if (playing == false) {
        startGame();
      }
    }
    lastState[i] = state;
  }
}
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