Menu
CoddyTech

Simon: Rastgele Dizi

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

Şimdi sıra tahtada. Bir düğme ilk kez bırakıldığında oyun başlar: tahta rastgele dört renk seçer, bunları bir dizide tutar ve oynatır.

random(4), 0, 1, 2 veya 3 değerini verir: bir renk. Bir for döngüsü diziyi doldurur. Tepki oyununda olduğu gibi, tohumu basma anında micros() ile ayarlayın; yoksa her oyun aynı renkleri oynatır:

randomSeed(micros());
for (int i = 0; i < 4; i++) {
  sequence[i] = random(4);
}

İkinci bir for döngüsü deseni oynatır: bir rengi kendi notasıyla yakar, bekler, söndürür ve tekrar bekler. İkinci bekleme önemlidir; bir renk art arda iki kez gelirse, bu bekleme olmadan kırmızı, kırmızı tek bir uzun kırmızı gibi görünür. Oyuncu artık yalnızca izliyor, bu yüzden delay() kullanmak uygundur.

for (int i = 0; i < 4; i++) {
  lightOn(sequence[i]);
  delay(400);
  lightOff(sequence[i]);
  delay(200);
}

playing adlı bir bool, oyunun başladığını hatırlar; böylece oyunu yalnızca ilk basış başlatır.

challenge icon

Görev

Orta

Panonun bir desen çalmasını sağlayın:

  • int sequence[4]; ve bool playing = false; ekleyin
  • bir düğme bırakıldığında ve playing değeri false olduğunda: tohumu ayarlayın, diziyi random(4) ile doldurun, playing değerini true yapın ve deseni çalın
  • desen: 500 ms bekleyin, ardından her rengi notasıyla birlikte 400 ms çalın ve sonrasında 200 ms sessizlik bırakın

Sonrasında düğmeler önceki gibi yanar ve ses çıkarır. Run'a basın, bir düğmeye basın, ardından Check'e basın.

Kendin dene

// Her renk için bir öğe: 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

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

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

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);
    }
    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