Arduino-WS (5)

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