Falls noch jemand mein bisheriger Simon Says code Sehen und ev. Korrigieren möchte
:
/*
Simon Says Spiel für ein Geocache
Simon Says Anleitung:
Simon Says ist ein Reaktions- und Gedächtnisspiel, bei dem eine Abfolge von blinkenden LEDs gezeigt wird.
Der Spieler muss diese Reihenfolge durch Tastendrücke korrekt wiederholen.
Mit jeder Runde wird die Sequenz länger und dadurch schwieriger.
*/
//Eingänge
const int StartButton = A6; //Button der ein Versuch startet
const int InputButtons[] = {A0, A1, A2, A3}; //Buttons welche vom Benutzer anhand der LED Abfolge gedrückt werden müssen
//Ausgänge
const int LEDs[] = {0, 1, 2, 3}; //LED's welche die Abfolge welche der Benutzer nachmachen muss Visualisiert sowie Visualisiert welchen Button gedrückt wurde
const int RightLED = 4; //LED welche am Ende jeder Runde Visualisiert, dass die Runde erfolgreich abgeschlossen wurde
const int FalseLED = 5; //LED welche Visualisiert das ein Fehler gemacht wurde
const int Buzzer = 6; //Passiver Buzzer der Passend einen Ton macht
//Konstante Merker
const int NumberOfRounds = 8; //Anzahl der Runden
const int Time = 500; //Verzögerung LED Ein/Aus
const int Tones[4] = {261, 329, 392, 523}; //Tonhöhen bei bestimmten LED's bzw Buttons
//Merker
int Step; //Variable für Schrittkette
int PressedButton; //Index des Letzten Gedrückten Buttons
int InputCount; //Anzahl der Gedrücken Buttons Innerhalb einer Runde
int Round; //Aktuelle Runde
int SavedSequence[NumberOfRounds]; //Array um die Reihenfolge der LED's zu Speichern
//Setup wird nur beim Start einmal ausgeführt
void setup()
{
//Eingänge / Ausgänge definieren
pinMode(StartButton, INPUT_PULLUP);
pinMode(RightLED , OUTPUT);
pinMode(FalseLED , OUTPUT);
pinMode(Buzzer , OUTPUT);
for (int i = 0; i < 4; i++)
{
pinMode(InputButtons[i], INPUT_PULLUP);
pinMode(LEDs[i], OUTPUT);
}
//Ausgänge Initialisieren
digitalWrite(RightLED, LOW);
digitalWrite(FalseLED, LOW);
digitalWrite(Buzzer, LOW);
for (int i = 0; i < 4; i++)
{
digitalWrite(LEDs[i], LOW);
}
//Merker Initialisieren
Step = 0;
Round = 0;
PressedButton = 0;
InputCount = 0;
for (int i = 0; i < NumberOfRounds; i++)
{
SavedSequence[i] = 0;
}
//Zufallsgenerator Initialisieren
randomSeed(analogRead(A7));
}
//Loop wird immer wieder wiederholt
void loop() {
//Srittkette
switch (Step) {
case 0: //Initialisieren vor dem Start
//Ausgänge Initialisieren
digitalWrite(RightLED, HIGH);
digitalWrite(FalseLED, LOW);
digitalWrite(Buzzer, LOW);
for (int i = 0; i < 4; i++)
{
digitalWrite(LEDs[i], LOW);
}
//Merker Initialisieren
Round = 0;
PressedButton = 0;
InputCount = 0;
for (int i = 0; i < NumberOfRounds; i++)
{
SavedSequence[i] = 0;
}
if (digitalRead(StartButton) == LOW)
{
digitalWrite(RightLED, LOW);
delay(Time);
Step = 1;
}
//Schritt beenden
break;
case 1: //Bisher Gespeicherte Abfolge Abspielen
//Variable InputCount Initialisieren
InputCount = 0;
//Bisher Gespeicherte Abfolge Abspielen
for (int i = 0; i < Round; i++)
{
digitalWrite(LEDs[SavedSequence[i] - 1], HIGH);
tone(Buzzer, Tones[SavedSequence[i] - 1]);
delay(Time);
digitalWrite(LEDs[SavedSequence[i] - 1], LOW);
noTone(Buzzer);
delay(Time);
}
//in Schritt 2 Wechseln
Step = 2;
//Schritt beenden
break;
case 2: //Neue Zufalls-LED Aufleuchten und Speichern lassen
//Zufallszahl Speichern
SavedSequence[Round] = random(1, 5);
//Zuffällige LED Anzeigen anhand des oben Gespeicherten Wertes
digitalWrite(LEDs[SavedSequence[Round] - 1], HIGH);
tone(Buzzer, Tones[SavedSequence[Round] - 1]);
delay(Time);
digitalWrite(LEDs[SavedSequence[Round] - 1], LOW);
noTone(Buzzer);
//in Schritt 2 Wechseln
Step = 3;
//Schritt beenden
break;
case 3: //Überprüfen welcher Button vom Spieler gedrückt wurde und die Entsprechende LED Aufleuchten lassen
for (int i = 0; i < 4; i++)
{
if (digitalRead(InputButtons[i]) == LOW)
{
PressedButton = i + 1;
InputCount = InputCount + 1;
digitalWrite(LEDs[i], HIGH);
tone(Buzzer, Tones[i]);
delay(Time);
digitalWrite(LEDs[i], LOW);
noTone(Buzzer);
//Entprellen
while (digitalRead(InputButtons[i]) == LOW)
{
delay(10);
}
delay(50);
//in Schritt 4 Wechseln
Step = 4;
}
}
//Schritt beenden
break;
case 4: //Überprüfen ob der Spieler den Richtigen Button gedrückt hat und demensprechend handeln
//Falls der Richtige Button gedrückt wurde und die Anzahl der Gedrückten Buttons innerhalb der Runde der Anzahl gespielten Runden entspricht dann Leuchtet die Grüne LED kurz auf und eine neue Runde Startet
if (PressedButton == SavedSequence[InputCount - 1])
{
if (InputCount >= Round + 1)
{
delay(Time / 2);
digitalWrite(RightLED, HIGH);
Round = Round + 1;
//Falls die Gewünschte Anzahl Runden Erreicht ist und der Spieler bis hier erfolgreich war, wird eine Melodie gespielt und das Logbuch freigegeben
if (Round >= NumberOfRounds)
{
int Melody[] = {523, 659, 784, 523, 523, 659, 784, 1047};
int Duration[] = {200, 200, 200, 400, 200, 200, 200, 600};
for (int i = 0; i < 8; i++)
{
tone(Buzzer, Melody[i]);
delay(Duration[i]);
noTone(Buzzer);
delay(50);
}
digitalWrite(RightLED, LOW);
delay(Time / 2);
Step = 5;
}
//Falls die Gewünschte Anzahl Runden noch nicht erreicht ist, wir eine kurze Melodie gespielt und eine Neue Runde Startet
else
{
//Melodie Abspielen für Richtige Runde
int Melody[] = {587, 698, 880};
for (int i = 0; i < 3; i++)
{
tone(Buzzer, Melody[i]);
delay(200);
noTone(Buzzer);
delay(50);
}
digitalWrite(RightLED, LOW);
delay(Time / 2);
Step = 1;
}
}
//Falls der Richtige Button gedrückt wurde, aber die Anzahl der Gedrückten Buttons innerhalb der Runde der Anzahl gespielten Runden nicht entspricht dann wird auf eine weitere Tasteneingabe gewartet
else
{
Step = 3;
}
}
//Falls der Falsche Button gedrückt wird dann muss das Spiel nochmal ganz von neu gestartet werden
else
{
delay(Time / 2);
digitalWrite(FalseLED, HIGH);
//Melodie Abspielen für Falsche Runde
int melody[] = {196, 130, 98};
for (int i = 0; i < 3; i++)
{
tone(Buzzer, melody[i]);
delay(300);
noTone(Buzzer);
delay(100);
}
digitalWrite(FalseLED, LOW);
delay(Time);
Step = 0;
}
//Schritt beenden
break;
case 5: //Logbuch Freigabe
Step = 0;
break;
default: //Schrittkette Initialisieren bei enem Fehler
Step = 0;
break;
}
}
Also Step 5 ist noch nicht fertig Programmiert. das wäre dann der Bereich wo das Logbuch freigegeben wird. Eigentlich wollte ich nicht mit delay arbeiten sonder mit millis() aber irgendwie habe ich es nicht geschafft das es so funktioniert wie es soll. Eingang A6 gibt es beim UNO natürlich nicht aber wie gesagt es ist mit dem Nano geplant