const int buttonPins[] = {9, 8, 7, 6};
const int ledPins[] = {13, 12, 11, 10};
int sequence[100];
int level = 1;
int sequenceLength = 0;
int playerInput = 0;
const int buttonDebounce = 200;
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
for (int i = 0; i < 4; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW);
}
randomSeed(analogRead(0));
startGame();
}
void loop() {
showSequence();
waitForPlayerInput();
level++;
delay(1000);
}
void startGame() {
level = 1;
sequenceLength = 0;
generateSequence();
for (int i = 0; i < 3; i++) {
allLedsOn();
delay(200);
allLedsOff();
delay(200);
}
}
void generateSequence() {
for (int i = 0; i < 100; i++) {
sequence[i] = random(0, 4);
}
sequenceLength = level;
}
void showSequence() {
allLedsOff();
delay(500);
for (int i = 0; i < level; i++) {
int ledIndex = sequence[i];
digitalWrite(ledPins[ledIndex], HIGH);
delay(600);
digitalWrite(ledPins[ledIndex], LOW);
delay(300);
}
}
void waitForPlayerInput() {
playerInput = 0;
while (playerInput < level) {
for (int i = 0; i < 4; i++) {
if (digitalRead(buttonPins[i]) == LOW) {
buttonPressed(i);
if (sequence[playerInput] != i) {
gameOver();
return;
}
playerInput++;
delay(buttonDebounce);
if (playerInput == level) {
allLedsOn();
delay(2000);
allLedsOff();
sequenceLength = level + 1;
return;
}
}
}
delay(10);
}
}
void buttonPressed(int buttonIndex) {
digitalWrite(ledPins[buttonIndex], HIGH);
delay(300);
digitalWrite(ledPins[buttonIndex], LOW);
}
void gameOver() {
for (int i = 0; i < 3; i++) {
allLedsOn();
delay(200);
allLedsOff();
delay(200);
}
delay(2000);
startGame();
}
void allLedsOn() {
for (int i = 0; i < 4; i++) {
digitalWrite(ledPins[i], HIGH);
}
}
void allLedsOff() {
for (int i = 0; i < 4; i++) {
digitalWrite(ledPins[i], LOW);
}
}