void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
// Pin definitions
const int buttonPins[] = {2, 3, 4, 5}; // Buttons
const int ledPins[] = {8, 9, 10, 11}; // Corresponding LEDs
const int feedbackLed = 13; // Feedback LED (pass/fail)
const int numButtons = 4; // Number of buttons/LEDs
// Game variables
int sequence[10]; // Stores the sequence
int currentLevel = 1; // Current game level
bool gameActive = false; // Game state flag
void setup() {
// Initialize serial for debugging
Serial.begin(9600);
// Set up buttons with pull-up resistors
for (int i = 0; i < numButtons; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
// Set up LEDs
for (int i = 0; i < numButtons; i++) {
pinMode(ledPins[i], OUTPUT);
}
pinMode(feedbackLed, OUTPUT);
// Seed random number generator
randomSeed(analogRead(0));
// Start game
startGame();
}
void loop() {
if (gameActive) {
playSequence();
if (!checkPlayerInput()) {
gameOver();
} else {
levelUp();
}
}
}
void startGame() {
// Generate initial sequence
for (int i = 0; i < 10; i++) {
sequence[i] = random(numButtons);
}
currentLevel = 1;
gameActive = true;
// Visual feedback - game starting
for (int i = 0; i < numButtons; i++) {
digitalWrite(ledPins[i], HIGH);
delay(200);
digitalWrite(ledPins[i], LOW);
}
digitalWrite(feedbackLed, HIGH);
delay(500);
digitalWrite(feedbackLed, LOW);
Serial.println("Game started!");
}
void playSequence() {
// Play the current sequence
for (int i = 0; i < currentLevel; i++) {
digitalWrite(ledPins[sequence[i]], HIGH);
delay(500);
digitalWrite(ledPins[sequence[i]], LOW);
delay(300);
}
}
bool checkPlayerInput() {
// Check if player matches the sequence
for (int i = 0; i < currentLevel; i++) {
bool correctButton = false;
unsigned long startTime = millis();
// Wait for button press with timeout
while (!correctButton && millis() - startTime < 5000) {
for (int j = 0; j < numButtons; j++) {
if (digitalRead(buttonPins[j]) == LOW) {
// Button pressed - light corresponding LED
digitalWrite(ledPins[j], HIGH);
delay(200);
digitalWrite(ledPins[j], LOW);
// Check if correct button
if (j == sequence[i]) {
correctButton = true;
} else {
return false; // Wrong button pressed
}
// Wait for button release
while (digitalRead(buttonPins[j]) == LOW) {
delay(10);
}
}
}
delay(10);
}
if (!correctButton) {
return false; // Timeout
}
}
return true; // All correct
}
void levelUp() {
currentLevel++;
// Success feedback
for (int i = 0; i < 3; i++) {
digitalWrite(feedbackLed, HIGH);
delay(100);
digitalWrite(feedbackLed, LOW);
delay(100);
}
Serial.print("Level up! Now at level ");
Serial.println(currentLevel);
if (currentLevel > 10) {
gameWon();
}
}
void gameOver() {
gameActive = false;
// Failure feedback
for (int i = 0; i < 5; i++) {
digitalWrite(feedbackLed, HIGH);
delay(100);
digitalWrite(feedbackLed, LOW);
delay(100);
}
Serial.print("Game over! Reached level ");
Serial.println(currentLevel);
// Restart game after delay
delay(2000);
startGame();
}
void gameWon() {
gameActive = false;
// Victory sequence
for (int i = 0; i < 3; i++) {
for (int j = 0; j < numButtons; j++) {
digitalWrite(ledPins[j], HIGH);
}
digitalWrite(feedbackLed, HIGH);
delay(200);
for (int j = 0; j < numButtons; j++) {
digitalWrite(ledPins[j], LOW);
}
digitalWrite(feedbackLed, LOW);
delay(200);
}
Serial.println("You won! Congratulations!");
// Restart game after delay
delay(3000);
startGame();
}