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().
Aufgabe
SchwerLass den Spieler antworten:
- ein
int step = 0;, instartGame()wieder auf 0 gesetzt - wenn eine Taste losgelassen wird und das Spiel
playingist,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;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Projekte
4Simon
Simon: Tasten und TöneSimon: Zufällige SequenzSimon: Wiederhole das MusterSimon: Das vollständige SpielÜbe selbstständig: Arduino-Playground