//#include <Arduino.h>
#include <Bounce2.h> //library für den "Bounce-Effekt" des Button's
#include <TM1637.h> //library für 4 Digit display
int leds[] = {2, 3, 4, 5}; // Pins für die LEDs
int buttons[] = {8, 9, 10, 11}; // Pins für die Tasten
int* sequence = nullptr; // Zeiger auf die aktuelle Sequenz
unsigned int sequenceLength = 0; // Länge der aktuellen Sequenz
const int CLK = 12;
const int DIO = 13;
TM1637 tm(CLK, DIO); //4-Digit
Bounce debouncers[4]; // Entprell-Objekte für die Tasten
//Bei den LEDs wird ein Vorwiederstand von 220 Ohm benötigt um den Diodenstrom
//auf unter 20mA zu bringen, sodass sie an eine 5V Spannung-Quelle angeschlossen werden können
void setup() {
//Es wird ein Zufallsgenerator initialsisiert
//(anhand des Abtastens des A0 Pins wird ein Startwert ermittelt)
randomSeed(analogRead(A0));
// Initialisierung der LEDs, Tasten und Entprell-Objekte
for (int i = 0; i < 4; i++) {
pinMode(leds[i], OUTPUT);
pinMode(buttons[i], INPUT_PULLUP);
debouncers[i].attach(buttons[i], INPUT_PULLUP);
debouncers[i].interval(25);
}
tm.init(); //setup für das 4 -Digit display
tm.set(BRIGHT_TYPICAL);
Serial.begin(9600);
// Spiel initialisieren
startGame();
}
void loop() {
displayScore(sequenceLength - 1);
// Warte auf Benutzereingabe und vergleiche mit der Sequenz
for (int i = 0; i < sequenceLength; i++) {
int button = waitForButton();
if (button == sequence[i]) {
// Richtiges Knopfdrücken: LED anzeigen und dann ausschalten
playLED(button);
delay(500);
turnOffLED(button);
} else {
// Falsches Knopfdrücken: Spiel verloren
gameOver();
break;
}
}
// Füge ein weiteres Element zur Sequenz hinzu und spiele sie ab
int newButton = random(0, 4);
addToList(newButton);
playSequence();
}
void startGame() {
sequenceLength = 0;
addToList(random(0, 4)); // Erste zufällige Sequenz hinzufügen
playSequence();
}
void addToList(int value) {
// Erstelle temporären Zeiger für die erweiterte Sequenz
int* tempList = new int[sequenceLength + 1];
for (int i = 0; i < sequenceLength; i++) {
tempList[i] = sequence[i];
}
// Füge neues Element hinzu
tempList[sequenceLength] = value;
// Lösche alte Sequenz und aktualisiere den Zeiger
delete[] sequence;
sequence = tempList;
sequenceLength++;
}
void playSequence() {
// Spiele die gesamte Sequenz ab
for (int i = 0; i < sequenceLength; i++) {
playLED(sequence[i]);
delay(500);
turnOffLED(sequence[i]);
delay(200);
}
}
int waitForButton() {
// Warte auf Tastendruck und gib den Index des gedrückten Buttons zurück
while (true) {
for (int i = 0; i < 4; i++) {
debouncers[i].update();
if (debouncers[i].fell()) {
return i;
}
}
}
}
void playLED(int led) {
// Schalte die angegebene LED ein
digitalWrite(leds[led], HIGH);
}
void turnOffLED(int led) {
// Schalte die angegebene LED aus
digitalWrite(leds[led], LOW);
}
void gameOver() {
// Zeige das Ende des Spiels und die erreichte Punktzahl
Serial.println("Game Over!");
Serial.print("Your Score is: ");
Serial.print(sequenceLength - 1); // Abzüglich 1, da die letzte Sequenz falsch war
while (true) {
// Endlosschleife bei Spielverlust
}
}
void displayScore(int score) {
tm.display(0, (score / 1000) % 10);
tm.display(1, (score / 100) % 10);
tm.display(2, (score / 10) % 10);
tm.display(3, score % 10);
}