#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Definisi pin
const int redLED = 2;
const int yellowLED = 6;
const int greenLED = 11;
const int blueLED = 8;
const int redButton = 3;
const int yellowButton = 7;
const int greenButton = 12;
const int blueButton = 9;
const int buzzer = 5;
// Variabel permainan
int sequence[100]; // Menyimpan urutan warna
int playerInput[100]; // Menyimpan input pemain
int level = 0; // Level saat ini
bool gameOver = false; // Status game
// Array pujian
const char* pujian[] = {
"KAMU HEBAT", "SEMANGAT YA", "KEREN BANGET", "LUAR BIASA", "MANTAP BRO",
"JAGO BANGET", "SIAP PUH", "MENYALA BANG", "TUTOR BANG", "AMPUN PUH", "KELAS KING"
};
void setup() {
// Inisialisasi pin
pinMode(redLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(blueLED, OUTPUT);
pinMode(redButton, INPUT_PULLUP);
pinMode(yellowButton, INPUT_PULLUP);
pinMode(greenButton, INPUT_PULLUP);
pinMode(blueButton, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
Serial.begin(9600); // Untuk debugging
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Memory Test Game ");
delay(2000); // Tampilkan pesan awal
// Mulai game
startGame();
}
void loop() {
if (!gameOver) {
playSequence(); // Mainkan urutan warna
if (!getPlayerInput()) { // Periksa input pemain
endGame();
} else {
delay(500); // Tunggu sebelum level berikutnya
}
} else {
delay(1500); // Tunggu sebelum restart
startGame();
}
}
void startGame() {
level = 1;
gameOver = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Level: 1");
// Indikator awal
digitalWrite(redLED, HIGH);
digitalWrite(yellowLED, HIGH);
digitalWrite(greenLED, HIGH);
digitalWrite(blueLED, HIGH);
tone(buzzer, 1000, 500);
delay(500);
digitalWrite(redLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(greenLED, LOW);
digitalWrite(blueLED, LOW);
randomSeed(analogRead(A0)); // Seed untuk random
delay(500);
}
void playSequence() {
sequence[level - 1] = random(1, 5); // Tambahkan warna ke urutan
for (int i = 0; i < level; i++) {
lightUpLED(sequence[i]);
delay(300);
}
}
bool getPlayerInput() {
for (int i = 0; i < level; i++) {
bool inputReceived = false;
while (!inputReceived) {
if (digitalRead(redButton) == LOW) {
playerInput[i] = 1;
lightUpLED(1);
inputReceived = true;
} else if (digitalRead(yellowButton) == LOW) {
playerInput[i] = 2;
lightUpLED(2);
inputReceived = true;
} else if (digitalRead(greenButton) == LOW) {
playerInput[i] = 3;
lightUpLED(3);
inputReceived = true;
} else if (digitalRead(blueButton) == LOW) {
playerInput[i] = 4;
lightUpLED(4);
inputReceived = true;
}
}
if (playerInput[i] != sequence[i]) {
return false;
}
delay(200);
}
level++;
// Pilih pujian secara acak
int indexPujian = random(0, 10);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Level: ");
lcd.print(level);
lcd.setCursor(0, 1);
lcd.print(pujian[indexPujian]); // Tampilkan pujian
return true;
}
void endGame() {
gameOver = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Game Over!");
lcd.setCursor(0, 1);
lcd.print("Level: ");
lcd.print(level);
for (int i = 0; i < 5; i++) {
digitalWrite(redLED, HIGH);
digitalWrite(yellowLED, HIGH);
digitalWrite(greenLED, HIGH);
digitalWrite(blueLED, HIGH);
tone(buzzer, 1000, 300);
delay(200);
digitalWrite(redLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(greenLED, LOW);
digitalWrite(blueLED, LOW);
delay(200);
}
}
void lightUpLED(int color) {
switch (color) {
case 1:
digitalWrite(redLED, HIGH);
tone(buzzer, 500, 300);
break;
case 2:
digitalWrite(yellowLED, HIGH);
tone(buzzer, 600, 300);
break;
case 3:
digitalWrite(greenLED, HIGH);
tone(buzzer, 700, 300);
break;
case 4:
digitalWrite(blueLED, HIGH);
tone(buzzer, 800, 300);
break;
}
delay(300);
digitalWrite(redLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(greenLED, LOW);
digitalWrite(blueLED, LOW);
}