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

Dieses Thema existiert noch nicht

Sie sind einem Link zu einer Seite gefolgt, die noch nicht existiert. Sie können die Seite mit dem Knopf Seite anlegen selbst anlegen und mit Inhalt füllen.