#include "LiquidCrystal_I2C.h"
#define LCD_ADDRESS 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
#define BUZZER 6
#define LEVELS_IN_GAME 10
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
int buttons[] = {2, 3, 4, 5};
int leds[] = {9, 10, 11, 12};
int simonSaid[100];
int userSequence[100];
boolean lost;
int game_play, level, stage;
void setup() {
Serial.begin(9600);
for (int i = 0; i < 4; i++) {
pinMode(buttons[i], INPUT_PULLUP);
pinMode(leds[i], OUTPUT);
}
pinMode(BUZZER, OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(" Welcome To ");
lcd.setCursor(0, 1);
lcd.print("> Memory Game <");
delay(2000);
lcd.clear();
randomSeed(analogRead(0));
}
void loop() {
switch (stage) {
case 0:
lcd.setCursor(0, 0);
lcd.print("Press Red Button");
lcd.setCursor(0, 1);
lcd.print(" to Start Game ");
if (digitalRead(buttons[0]) == LOW) {
level = 1;
game_play = 1;
stage = 1;
delay(200);
}
break;
case 1:
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("Level: ");
lcd.print(level);
lcd.setCursor(0, 1);
lcd.print(" -- Memorize --");
delay(1500);
for (int i = 1; i <= level; i++) {
simonSaid[i] = leds[random(0, 4)];
digitalWrite(simonSaid[i], HIGH);
playBuzzer(simonSaid[i] - 8);
delay(400);
digitalWrite(simonSaid[i], LOW);
delay(400);
}
delay(500);
stage = 2;
break;
case 2:
lcd.setCursor(0, 1);
lcd.print(" -- Play -- ");
stage = 3;
break;
case 3:
for (int i = 0; i < 4; i++) {
if (digitalRead(buttons[i]) == LOW) {
userSequence[game_play] = leds[i];
digitalWrite(leds[i], HIGH);
playBuzzer(i + 1);
while (digitalRead(buttons[i]) == LOW);
delay(50);
digitalWrite(leds[i], LOW);
game_play++;
if (game_play - 1 == level) {
game_play = 1;
stage = 4;
break;
}
}
}
delay(10);
break;
case 4:
lcd.setCursor(0, 1);
lcd.print(" Verification ");
delay(1000);
lost = false;
for (int i = 1; i <= level; i++) {
if (simonSaid[i] != userSequence[i]) {
lost = true;
break;
}
}
stage = lost ? 5 : 6;
break;
case 5:
lcd.setCursor(0, 1);
lcd.print(" !! You Lost !! ");
tone(BUZZER, 350);
for (int i = 0; i < 4; i++) digitalWrite(leds[i], HIGH);
delay(1000);
lcd.setCursor(0, 1);
lcd.print(" !! GAME OVER !! ");
noTone(BUZZER);
delay(1000);
for (int i = 0; i < 4; i++) digitalWrite(leds[i], LOW);
level = 1;
stage = 0;
break;
case 6:
lcd.setCursor(0, 1);
lcd.print(" ** You Win ** ");
delay(1000);
if (level == LEVELS_IN_GAME) {
lcd.setCursor(0, 0);
lcd.print("Congratulation");
lcd.setCursor(0, 1);
lcd.print(" Level Complete ");
delay(1000);
lcd.clear();
level = 1;
} else {
level++;
}
stage = 1;
break;
}
}
void playBuzzer(int x) {
tone(BUZZER, 650 + (x * 100));
delay(300);
noTone(BUZZER);
}