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)
}