const int ledPins[] = {2, 3, 4, 5}; // LED pins
const int buttonPins[] = {6, 7, 8, 9}; // Button pins
const int buzzerPin = 10; // Buzzer pin
int sequence[100]; // Array to store the sequence
int level = 0; // Current level of the game
const int notes[] = {262, 294, 330, 349}; // Notes corresponding to each LED
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(ledPins[i], OUTPUT); // Set LED pins as OUTPUT
pinMode(buttonPins[i], INPUT_PULLUP);// Set button pins as INPUT with internal pull-up resistors
}
pinMode(buzzerPin, OUTPUT); // Set buzzer pin as OUTPUT
randomSeed(analogRead(0)); // Seed random number generator
newSequence(); // Generate the first sequence
}
void loop() {
showSequence(); // Show the current sequence
if (playerTurn()) { // Check player's input
level++; // Increase level if correct
delay(1000); // Wait before next level
newSequence(); // Generate a new sequence
} else {
level = 0; // Reset game if wrong
delay(1000); // Wait before restart
newSequence(); // Generate a new sequence
}
}
void newSequence() {
for (int i = 0; i <= level; i++) {
sequence[i] = random(4); // Generate a random number between 0 and 3
}
}
void showSequence() {
for (int i = 0; i <= level; i++) {
int led = sequence[i];
digitalWrite(ledPins[led], HIGH); // Turn on LED
tone(buzzerPin, notes[led], 200); // Play corresponding tone
delay(500); // Wait
digitalWrite(ledPins[led], LOW); // Turn off LED
delay(500); // Wait
}
}
bool playerTurn() {
for (int i = 0; i <= level; i++) {
bool buttonPressed = false;
while (!buttonPressed) {
for (int j = 0; j < 4; j++) {
if (digitalRead(buttonPins[j]) == LOW) { // Check if button is pressed
buttonPressed = true;
if (j != sequence[i]) {
tone(buzzerPin, 200, 500); // Play error tone
return false; // If the wrong button is pressed, return false
}
tone(buzzerPin, notes[j], 200); // Play corresponding tone for correct press
delay(300); // Debounce delay
while (digitalRead(buttonPins[j]) == LOW); // Wait for button release
delay(300); // Debounce delay
}
}
}
}
return true; // If all buttons are pressed correctly, return true
}