Menu
CoddyTech

Simon: Wiederhole das Muster

Teil des Abschnitts Projekte der Arduino-Journey von Coddy. Lektion 15 von 24.

Nachdem das Spielbrett gespielt hat, bist du an der Reihe: Wiederhole die vier Farben in derselben Reihenfolge. Die Skizze benötigt eine weitere Zahl, step, die zählt, wie viele Farben du bisher wiederholt hast. Die Farbe, die du als Nächstes drücken musst, ist sequence[step].

Zähle einen Tastendruck, wenn die Taste losgelassen wird, so wie es das Spiel bereits beim Start macht. Bis dahin sind das Licht und der Ton ausgeschaltet, und die Skizze kann sauber reagieren:

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 verlässt die Funktion sofort, sodass nach einer falschen Farbe nichts darunter ausgeführt wird. Wenn du playing wieder auf false setzt, endet das Spiel, und der nächste Tastendruck startet ein neues.

Jedes neue Spiel muss wieder von vorne zählen: Setze step = 0 in startGame().

challenge icon

Aufgabe

Schwer

Lass den Spieler antworten:

  • ein int step = 0;, in startGame() wieder auf 0 gesetzt
  • wenn eine Taste losgelassen wird und das Spiel playing ist, checkPress(i) aufrufen
  • bei einer falschen Farbe wird Wrong! ausgegeben und das Spiel beendet
  • nach vier richtigen Farben Well done! ausgeben und das Spiel beenden

Serial in setup() starten. Klicke auf Run, beobachte, wiederhole das Muster und klicke dann auf Check.

Probier es selbst

// Ein Eintrag pro Farbe: Rot, Grün, Blau, Gelb
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 und hohes C
const int buzzerPin = 8;

int lastState[4] = {HIGH, HIGH, HIGH, HIGH};  // der letzte Messwert jedes Tasters

int sequence[4];       // die Farben, die das Board abspielt
bool playing = false;  // false, bis ein Tastendruck das Spiel startet

// Lass Farbe i aufleuchten und spiele ihren Ton ab.
void lightOn(int i) {
  digitalWrite(ledPins[i], HIGH);
  tone(buzzerPin, notes[i]);
}

// Schalte Farbe i aus und stoppe den Ton.
void lightOff(int i) {
  digitalWrite(ledPins[i], LOW);
  noTone(buzzerPin);
}

// Spiele die Sequenz ab: jede Farbe 400 ms lang, danach 200 ms Stille.
void playSequence() {
  delay(500);
  for (int i = 0; i < 4; i++) {
    lightOn(sequence[i]);
    delay(400);
    lightOff(sequence[i]);
    delay(200);
  }
}

// Wähle eine neue zufällige Sequenz und spiele sie ab.
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) {  // gedrückt
      lightOn(i);
    }
    if (state == HIGH && lastState[i] == LOW) {  // losgelassen
      lightOff(i);
      if (playing == false) {
        startGame();
      }
    }
    lastState[i] = state;
  }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Projekte

Übe selbstständig: Arduino-Playground