Simon: Das vollständige Spiel
Teil des Abschnitts Projekte der Arduino-Journey von Coddy. Lektion 16 von 24.
Ein echtes Simon beginnt klein und wird immer länger. In Runde 1 wird eine Farbe abgespielt. Jedes Mal, wenn du eine Runde richtig wiederholst, bleiben die Farben auf dem Spielbrett gleich und am Ende kommt eine hinzu, bis du einen Fehler machst.
Das Array muss Platz für ein langes Spiel bieten und eine Variable length speichern, wie viel davon verwendet wird. Eine Farbe hinzuzufügen, sind zwei Zeilen:
sequence[length] = random(4);
length++;Setze den Seed einmal, wenn das Spiel beginnt. playSequence() spielt jetzt length Farben statt vier ab, und eine Runde ist vorbei, wenn step length erreicht.
Ein Fehler beendet das Spiel mit einem Ton, der eindeutig kein Ton der Melodie ist: 110 Hz für eine Sekunde. Außerdem wird der Punktestand ausgegeben: die abgeschlossenen Runden, length - 1, da die verlorene Runde nicht zählt.
Das Array hat 20 Plätze, und der Sketch darf niemals über sein Ende hinaus schreiben. Wer also 20 Farben richtig wiederholt, gewinnt.
Aufgabe
SchwerMach daraus das vollständige Spiel:
const int MAX_STEPS = 20;,int sequence[MAX_STEPS];undint length = 0;- Ein Spiel beginnt mit einer Farbe; jede richtig wiederholte Runde fügt eine hinzu und spielt alle ab
- Ein Fehler: 110 Hz für 1000 ms, dann
Game over! Score:und den Punktestand ausgeben und das Spiel beenden - 20 richtig wiederholte Farben:
You win!ausgeben und das Spiel beenden
Drücke Run, schau, wie weit du kommst, 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 Zustand jeder Taste
int sequence[4]; // die Farben, die das Board abspielt
bool playing = false; // false, bis ein Tastendruck das Spiel startet
int step = 0; // wie viele Farben der Spieler wiederholt hat
// Farbe i aufleuchten lassen und ihren Ton spielen.
void lightOn(int i) {
digitalWrite(ledPins[i], HIGH);
tone(buzzerPin, notes[i]);
}
// Farbe i ausschalten und den Ton stoppen.
void lightOff(int i) {
digitalWrite(ledPins[i], LOW);
noTone(buzzerPin);
}
// Die Sequenz abspielen: 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);
}
}
// Eine neue zufällige Sequenz auswählen und abspielen.
void startGame() {
randomSeed(micros());
for (int i = 0; i < 4; i++) {
sequence[i] = random(4);
}
playing = true;
step = 0;
playSequence();
}
// Der Spieler hat Farbe i losgelassen: Ist sie die nächste in der Sequenz?
void checkPress(int i) {
if (i != sequence[step]) {
Serial.println("Wrong!");
playing = false;
return;
}
step++;
if (step == 4) {
Serial.println("Well done!");
playing = false;
}
}
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(ledPins[i], OUTPUT);
pinMode(buttonPins[i], INPUT_PULLUP);
}
Serial.begin(9600);
}
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();
} else {
checkPress(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
4Simon
Simon: Tasten und TöneSimon: Zufällige SequenzSimon: Wiederhole das MusterSimon: Das vollständige SpielÜbe selbstständig: Arduino-Playground