const int greenLEDs[] = {2, 4, 6, 8};
const int redLEDs[] = {3, 5, 7, 9};
const int buttons[] = {10, 11, 12, 13};
int currentGreenLED = -1;
int level = 1;
int successCount = 0;
unsigned long ledOnTime = 0; // Initial time the green LED stays on
bool gameStarted = false;
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(greenLEDs[i], OUTPUT);
pinMode(redLEDs[i], OUTPUT);
pinMode(buttons[i], INPUT_PULLUP);
digitalWrite(greenLEDs[i], LOW); // Ensure all green LEDs are off at the start
digitalWrite(redLEDs[i], LOW); // Ensure all red LEDs are off at the start
}
randomSeed(analogRead(0));
flashAllLEDs(); // Flash all LEDs at the start
}
void loop() {
if (!gameStarted) {
if (digitalRead(buttons[0]) == LOW) {
ledOnTime += 1000; // Each press of button 1 adds 1 second
delay(300); // Debounce delay
}
if (digitalRead(buttons[1]) == LOW) {
gameStarted = true;
delay(300); // Debounce delay
}
return;
}
if (ledOnTime == 0) { ledOnTime = 2000; } // Ensure ledOnTime is set
if (currentGreenLED == -1) {
for (int i = 0; i < 4; i++) {
digitalWrite(greenLEDs[i], LOW);
}
currentGreenLED = random(0, 4);
digitalWrite(greenLEDs[currentGreenLED], HIGH);
unsigned long startTime = millis();
while (millis() - startTime < ledOnTime) {
for (int i = 0; i < 4; i++) {
if (digitalRead(buttons[i]) == LOW) {
if (i == currentGreenLED) {
successCount++;
flashLED(greenLEDs[i]);
if (successCount >= 10) {
levelUp();
}
} else {
gameOver(i);
return;
}
resetGame();
return;
}
}
}
digitalWrite(greenLEDs[currentGreenLED], LOW);
flashLED(redLEDs[currentGreenLED]);
gameOver(currentGreenLED);
resetGame();
}
}
void flashLED(int ledPin) {
for (int i = 0; i < 3; i++) {
digitalWrite(ledPin, HIGH);
delay(ledOnTime / 6); // Adjusted to flash for ledOnTime duration
digitalWrite(ledPin, LOW);
delay(ledOnTime / 6); // Adjusted to flash for ledOnTime duration
}
}
void levelUp() {
level++;
successCount = 0;
ledOnTime = (ledOnTime * 80) / 100; // Decrease the time by 20% for each level
flashGreenLEDs(); // Only flash green LEDs
}
void flashGreenLEDs() {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 4; j++) {
digitalWrite(greenLEDs[j], HIGH);
}
delay(200);
for (int j = 0; j < 4; j++) {
digitalWrite(greenLEDs[j], LOW);
}
delay(200);
}
}
void flashAllLEDs() {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 4; j++) {
digitalWrite(greenLEDs[j], LOW);
digitalWrite(redLEDs[j], LOW);
}
delay(200);
for (int j = 0; j < 4; j++) {
digitalWrite(greenLEDs[j], HIGH);
digitalWrite(redLEDs[j], HIGH);
}
delay(200);
}
for (int j = 0; j < 4; j++) {
digitalWrite(greenLEDs[j], LOW);
}
}
void gameOver(int mistakeLED) {
// Flash the red LED corresponding to the mistake
flashLED(redLEDs[mistakeLED]);
// Reset the game
level = 1;
successCount = 0;
ledOnTime = 0;
gameStarted = false;
flashAllLEDs(); // Flash all LEDs at the start
resetGame();
}
void resetGame() {
for (int i = 0; i < 4; i++) {
digitalWrite(greenLEDs[i], LOW);
digitalWrite(redLEDs[i], HIGH);
}
currentGreenLED = -1;
}