#include <LiquidCrystal.h>
const int red = 3;
const int yellow = 2;
const int green = 4;
const int blue = 5;
const int buzz = 13;
const int buttonR = 9;
const int buttonB = 11;
const int buttonY = 10;
const int buttonG = 12;
const int buttonW = 8;
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int sequence[100];
int input[100];
int level = 0;
bool gameOver = false;
void setup() {
pinMode(red, OUTPUT);
pinMode(blue, OUTPUT);
pinMode(green, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(buzz, OUTPUT);
pinMode(buttonR, INPUT_PULLUP);
pinMode(buttonG, INPUT_PULLUP);
pinMode(buttonY, INPUT_PULLUP);
pinMode(buttonW, INPUT_PULLUP);
pinMode(buttonB, INPUT_PULLUP);
lcd.begin(20, 4);
lcd.print("Simon Game");
randomSeed(analogRead(0));
generateSequence();
}
void loop() {
if (!gameOver) {
playSequence();
getPlayerInput();
if (checkInput()) {
level++;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Good job!");
delay(1000);
} else {
gameOver = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Again...");
delay(1000);
gameOverSequence();
}
} else {
resetGame();
lcd.clear();
lcd.print("Simon Game");
delay(1000);
}
}
void generateSequence() {
for (int i = 0; i < 100; i++) {
sequence[i] = random(1, 5);
}
}
void playSequence() {
for (int i = 0; i <= level; i++) {
lightUp(sequence[i]);
delay(500);
lightOff(sequence[i]);
delay(500);
}
}
void lightUp(int color) {
switch (color) {
case 1: digitalWrite(red, HIGH); tone(buzz, 100, 250); break;
case 2: digitalWrite(yellow, HIGH); tone(buzz, 200, 250); break;
case 3: digitalWrite(green, HIGH); tone(buzz, 300, 250); break;
case 4: digitalWrite(blue, HIGH); tone(buzz, 400, 250); break;
}
}
void lightOff(int color) {
switch (color) {
case 1: digitalWrite(red, LOW); break;
case 2: digitalWrite(yellow, LOW); break;
case 3: digitalWrite(green, LOW); break;
case 4: digitalWrite(blue, LOW); break;
}
}
void getPlayerInput() {
for (int i = 0; i <= level; i++) {
bool inputReceived = false;
while (!inputReceived) {
if (digitalRead(buttonR) == LOW) {
input[i] = 1;
lightUp(1);
delay(250);
lightOff(1);
inputReceived = true;
} else if (digitalRead(buttonY) == LOW) {
input[i] = 2;
lightUp(2);
delay(250);
lightOff(2);
inputReceived = true;
} else if (digitalRead(buttonG) == LOW) {
input[i] = 3;
lightUp(3);
delay(250);
lightOff(3);
inputReceived = true;
} else if (digitalRead(buttonB) == LOW) {
input[i] = 4;
lightUp(4);
delay(250);
lightOff(4);
inputReceived = true;
}
}
delay(500);
}
}
bool checkInput() {
for (int i = 0; i <= level; i++) {
if (input[i] != sequence[i]) {
return false;
}
}
return true;
}
void gameOverSequence() {
for (int i = 0; i < 3; i++) {
digitalWrite(red, HIGH);
digitalWrite(yellow, HIGH);
digitalWrite(green, HIGH);
digitalWrite(blue, HIGH);
tone(buzz, 100, 500);
delay(500);
digitalWrite(red, LOW);
digitalWrite(yellow, LOW);
digitalWrite(green, LOW);
digitalWrite(blue, LOW);
delay(500);
}
}
void resetGame() {
level = 0;
gameOver = false;
generateSequence();
delay(1000);
}