Das fertige NachspielSpiel
// Aus Franks Workshop am 3.6.2106 // (in der Sitzung am Beamer entwickelt) // Das NachspielSpiel: Muster wird vorgespielt und // man spielt das nach. Bei Erfolg wird das Muster länger. const int MAX_MUSTER_LEN = 10; int muster[MAX_MUSTER_LEN]; // Speicher fürs Muster (die Sequenz) int anfangslaenge = 3; int akt_muster_len = anfangslaenge; // aktuelle Musterlänge (<=MAX_MUSTER_LEN !) const int LEDs = 4; const int LEDPINs[LEDs] = { 2, 3, 4, 5 }; const int TasterPINs[LEDs] = { 8, 9, 10, 11 }; void setup() { for (int j=0; j<LEDs; j++) { pinMode( LEDPINs[j], OUTPUT ); pinMode( TasterPINs[j], INPUT_PULLUP ); // laut Doku pinMode( TasterPINs[j], INPUT ); // so geht's doch bei manchen Board oder IDEs besser... digitalWrite( TasterPINs[j], HIGH ); // ... überflüssig, wenn _PULLUP-Variante benutzt wird } randomSeed(analogRead(A0)); // An A0 ist nix dran, also zufällige Spannung } void loop() { for (int i=0; i<akt_muster_len; i++) { muster[i] = random(LEDs); } // Vorspielen des Musters for (int i=0; i<akt_muster_len; i++) { for (int j=0; j<LEDs; j++) { digitalWrite( LEDPINs[j], (muster[i]==j ? HIGH : LOW) ); } delay(800); // 800 ms (0.8s) warten digitalWrite( LEDPINs[muster[i]], LOW ); delay(100); // 100 ms (0.1s) warten } // Alle aus for (int j=0; j<LEDs; j++) { digitalWrite( LEDPINs[j], LOW ); } // Warte auf Taste gedrueckt for (int i=0; i<akt_muster_len; i++) { int gedrueckt = -1; while(gedrueckt==-1) { for (int j=0; j<LEDs; j++) // Taster durchgehen { if ( ! digitalRead( TasterPINs[j] )) // Taster j gedrückt? { gedrueckt = j; } } } if (muster[i]==gedrueckt) { // Taste ok digitalWrite( LEDPINs[gedrueckt], HIGH ); // gedrückte LED anzeigen delay(100); // warten für Entprellung und zum Aufleuchten der LED while(! digitalRead( TasterPINs[gedrueckt] )) // warten auf Taste losgelassen { // nix (solange Taste gedrückt) } delay(100); // warten für Entprellung und zum Aufleuchten der LED digitalWrite( LEDPINs[gedrueckt], LOW ); // gedrückte LED ausmachen } else { // Taste falsch // Animation VERLOREN abspielen for (int j=0; j<LEDs; j++) // Alles an { digitalWrite( LEDPINs[j], HIGH ); } delay(4000); // 4 s for (int j=0; j<LEDs; j++) // Alles aus { digitalWrite( LEDPINs[j], LOW ); } delay(600); // noch kurz auslassen, damit man neue Sequenz danach besser sehen kann akt_muster_len=anfangslaenge; // Zurück zur Anfängerlänge return; // Zurück zum Start } } // Bei Erfolg // Animation GEWONNEN abspielen for (int i=0; i<akt_muster_len; i++) // akt_muster_len mal { for (int j=0; j<LEDs; j++) // Lauflicht { digitalWrite( LEDPINs[j], HIGH ); delay(100); // 0.1 s digitalWrite( LEDPINs[j], LOW ); } } delay(600); akt_muster_len++; // schwerer machen if (akt_muster_len>=MAX_MUSTER_LEN) // Array zuende? Dann endgültig gewonnen { akt_muster_len=anfangslaenge; // Zurück zur Anfängerlänge als Signal für endgültig gewonnen } // return; // Zurück zum Start (return am Ende de Funktion kann man weglassen) }