Simon: Zufällige Sequenz
Teil des Abschnitts Projekte der Arduino-Journey von Coddy. Lektion 14 von 24.
Jetzt ist das Board an der Reihe. Sobald eine Taste zum ersten Mal losgelassen wird, beginnt das Spiel: Das Board wählt vier zufällige Farben aus, speichert sie in einem Array und spielt sie ab.
random(4) ergibt 0, 1, 2 oder 3: eine Farbe. Eine for-Schleife füllt das Array. Wie beim Reaktionsspiel wird beim Drücken mit micros() der Startwert gesetzt, sonst spielt jedes Spiel dieselben Farben:
randomSeed(micros());
for (int i = 0; i < 4; i++) {
sequence[i] = random(4);
}Eine zweite for-Schleife spielt das Muster ab: Sie schaltet eine Farbe mit ihrem Ton ein, wartet, schaltet sie aus und wartet erneut. Die zweite Wartezeit ist wichtig, wenn eine Farbe zweimal hintereinander kommt: Ohne sie sieht Rot, Rot wie ein einziges langes Rot aus. Der Spieler schaut jetzt nur zu, daher ist delay() in Ordnung.
for (int i = 0; i < 4; i++) {
lightOn(sequence[i]);
delay(400);
lightOff(sequence[i]);
delay(200);
}Ein bool namens playing merkt sich, dass das Spiel begonnen hat, sodass nur der erste Tastendruck es startet.
Aufgabe
MittelLass das Board ein Muster abspielen:
- füge
int sequence[4];undbool playing = false;hinzu - wenn eine Taste losgelassen wird und
playingfalseist: initialisiere den Zufallszahlengenerator, fülle das Array mitrandom(4), setzeplayingauftrueund spiele das Muster ab - das Muster: warte 500 ms, dann jede Farbe mit ihrem Ton für 400 ms und danach 200 ms Stille
Danach leuchten die Tasten auf und spielen wie zuvor. Drücke Run, drücke eine Taste 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
// Schalte Farbe i ein und spiele ihren Ton.
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);
}
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);
}
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
Übe selbstständig: Arduino-Playground