#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi LCD dengan alamat I2C 0x27
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Definisi karakter khusus untuk dinosaurus dan rintangan
byte dino[8] = {
0b00100,
0b01110,
0b10101,
0b00100,
0b01110,
0b00100,
0b00100,
0b00100
};
byte cactus[8] = {
0b00100,
0b00100,
0b01110,
0b11111,
0b01110,
0b00100,
0b00100,
0b00100
};
// Variabel permainan Dino
int posisiDino = 0;
int posisiRintangan = 15;
bool sedangMelompat = false;
int hitungLompatan = 0;
const int pinTombol = 2;
bool statusTombol = HIGH;
void setup() {
// Inisialisasi LCD dan tombol
lcd.init();
lcd.backlight();
pinMode(pinTombol, INPUT_PULLUP);
// Buat karakter khusus di LCD
lcd.createChar(0, dino);
lcd.createChar(1, cactus);
// Tampilkan layar awal
lcd.clear();
lcd.setCursor(posisiDino, 1);
lcd.write(byte(0)); // Tampilkan dinosaurus
lcd.setCursor(posisiRintangan, 1);
lcd.write(byte(1)); // Tampilkan rintangan
}
void loop() {
// Periksa apakah tombol ditekan
if (digitalRead(pinTombol) == LOW && statusTombol == HIGH) {
sedangMelompat = true;
statusTombol = LOW;
}
if (digitalRead(pinTombol) == HIGH) {
statusTombol = HIGH;
}
// Gerakkan rintangan ke kiri
posisiRintangan--;
// Tangani lompatan dino
if (sedangMelompat) {
if (hitungLompatan < 2) {
lcd.setCursor(posisiDino, 1);
lcd.print(" "); // Hapus posisi sebelumnya
lcd.setCursor(posisiDino, 0);
lcd.write(byte(0)); // Tampilkan dinosaurus melompat
hitungLompatan++;
} else {
sedangMelompat = false;
hitungLompatan = 0;
lcd.setCursor(posisiDino, 0);
lcd.print(" "); // Hapus posisi lompatan
}
} else {
lcd.setCursor(posisiDino, 1);
lcd.write(byte(0)); // Kembali ke tanah
}
// Tampilkan rintangan
lcd.setCursor(posisiRintangan, 1);
lcd.write(byte(1)); // Tampilkan rintangan
// Periksa tabrakan
if (posisiRintangan == posisiDino && !sedangMelompat) {
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("Game Over!");
while (true); // Hentikan permainan
}
// Reset rintangan saat keluar dari layar
if (posisiRintangan < 0) {
posisiRintangan = 15;
}
// Penundaan untuk kecepatan gerakan
delay(200);
// Hapus posisi sebelumnya dari rintangan
lcd.setCursor(posisiRintangan + 1, 1);
lcd.print(" ");
}