#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Karakter
byte orangLidi[] = {
B00100,
B01010,
B00100,
B01110,
B10101,
B00100,
B01010,
B01010
};
byte apel[] = {
B00010,
B00100,
B00100,
B01110,
B10001,
B10001,
B10001,
B01110,
};
byte nyawaKosong[] = {
B00000,
B01010,
B10101,
B10001,
B10001,
B01010,
B00100,
B00000
};
byte nyawaFull[] = {
B00000,
B01010,
B11111,
B11111,
B11111,
B01110,
B00100,
B00000
};
byte duar[] = {
B00010,
B00100,
B01110,
B11111,
B11111,
B11111,
B01110,
B00000
};
byte selLeft[] = {
B00011,
B00111,
B01111,
B11111,
B11111,
B01111,
B00111,
B00011
};
byte selRight[] = {
B11000,
B11100,
B11110,
B11111,
B11111,
B11110,
B11100,
B11000
};
byte panahKiri[] = {
B00001,
B00010,
B00100,
B01000,
B01000,
B00100,
B00010,
B00001
};
// Deklarasi Variabel
int X;
int Y;
int buah;
int nyawa;
int nyawaMax;
int Skor;
int menu;
int Menang;
int maxSkor;
int panahPilih;
int Kalah;
int Bom;
// Sound
void sound1() {
tone(9, 523, 70);
delay(70);
tone(9, 392, 70);
delay(70);
delay(90);
tone(9, 523, 70);
delay(70);
tone(9, 392, 70);
delay(70);
};
void sound2() {
tone(9, 262, 70);
delay(70);
delay(90);
tone(9, 262, 70);
delay(70);
};
void sound3() {
tone(9, 392, 200);
delay(200);
tone(9, 330, 200);
delay(200);
tone(9, 262, 600);
delay(600);
}
void sound4() {
tone(9, 523, 80);
delay(80);
tone(9, 392, 80);
delay(80);
}
// Sistem
void jumlahNyawa() {
lcd.setCursor(0, 1);
for (int i = 0; i < nyawaMax; i++) {
if (i < nyawa) {
lcd.write(4);
} else {
lcd.write(3);
};
};
};
void GameMenu() {
int selectUpLeft = 6;
int selectUpRight = 9;
int angkaUp = 7;
int selectDownLeft = 8;
int selectDownRight = 12;
int angkaDown = 9;
lcd.clear();
lcd.setCursor(14, panahPilih);
lcd.write(8);
lcd.setCursor(0, 0);
lcd.print("Nyawa:");
lcd.setCursor(selectUpLeft, 0);
lcd.write(7);
lcd.setCursor(angkaUp, 0);
lcd.print(nyawaMax);
lcd.setCursor(selectUpRight, 0);
lcd.write(6);
lcd.setCursor(0, 1);
lcd.print("MaxSkor:");
lcd.setCursor(selectDownLeft, 1);
lcd.write(7);
lcd.setCursor(angkaDown, 1);
lcd.print(maxSkor);
lcd.setCursor(selectDownRight, 1);
lcd.write(6);
}
void Win() {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Kamu Menang");
lcd.setCursor(2, 1);
lcd.print("klik restart");
sound1();
}
void kalah() {
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("Game Over");
lcd.setCursor(2, 1);
lcd.print("klik restart");
nyawa = -1;
Kalah = 1;
}
void InGame() {
lcd.clear();
lcd.setCursor(buah, 0);
lcd.write(2);
lcd.setCursor(Bom, 0);
lcd.write(5);
lcd.setCursor(X, Y);
lcd.write(1);
}
// Setup
void setup() {
pinMode(9, OUTPUT);
pinMode(13, INPUT_PULLUP);
pinMode(12, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
lcd.init();
lcd.backlight();
lcd.createChar(1, orangLidi);
lcd.createChar(2, apel);
lcd.createChar(3, nyawaKosong);
lcd.createChar(4, nyawaFull);
lcd.createChar(5, duar);
lcd.createChar(6, selRight);
lcd.createChar(7, selLeft);
lcd.createChar(8, panahKiri);
panahPilih = 0;
maxSkor = 10;
Menang = 0;
Kalah = 0;
menu = 0;
Skor = 0;
X = 0;
Y = 1;
nyawaMax = 4;
nyawa = 4;
buah = random(0, 16);
do {
Bom = random(0, 16);
} while (Bom == X || Bom == buah);
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Stickman Games");
delay(3000);
InGame();
}
// Loop
void loop() {
// Kanan
if (digitalRead(13) == LOW && digitalRead(12) != LOW && nyawa != -1 && menu == 0 && Menang == 0) {
if (X < 15) {
X += 1;
}
InGame();
delay(200);
}
//Kiri
if (digitalRead(12) == LOW && digitalRead(13) != LOW && nyawa != -1 && menu == 0 && Menang == 0) {
if (X > 0) {
X -= 1;
}
InGame();
delay(200);
}
// Lompat
if (digitalRead(11) == LOW && digitalRead(12) != LOW && digitalRead(13) != LOW && nyawa != -1 && menu == 0 && Menang == 0) {
Y --;
lcd.clear();
lcd.setCursor(X, Y);
lcd.write(1);
// Jika Terkena buah
if (X == buah) {
buah = random(0, 16);
do {
Bom = random(0, 16);
} while (Bom == X || Bom == buah);
Skor++;
jumlahNyawa();
lcd.setCursor(13, 1);
lcd.print(Skor);
sound1();
} else if (X == Bom) {
// Jika Terkena Bom
nyawa = 0;
sound3();
} else if (X != Bom || X != buah) {
// Jika tidak mengenai apapun
nyawa--;
lcd.setCursor(Bom, 0);
lcd.write(5);
jumlahNyawa();
lcd.setCursor(13, 1);
lcd.print(Skor);
if (nyawa == 0) {
sound3();
} else {
sound2();
}
}
lcd.setCursor(Bom, 0);
lcd.write(5);
lcd.setCursor(buah, 0);
lcd.write(2);
Y ++;
delay(500);
InGame();
delay(200);
}
// Jika Nyawa habis
if (nyawa == 0) {
kalah();
}
// Restart Setelah kalah
if (nyawa == -1 && digitalRead(11) == LOW && menu == 0 && Menang == 0 && Kalah == 1) {
sound4();
setup();
}
// Setting
if (digitalRead(13) == LOW && digitalRead(12) == LOW && menu == 0 && Menang == 0 && Kalah == 0) {
delay(80);
sound4();
menu = 1;
if (menu == 1) {
GameMenu();
}
}
// Keluar dari setting
if (digitalRead(13) == LOW && digitalRead(12) == LOW && menu == 1 && Menang == 0 && Kalah == 0) {
delay(80);
lcd.clear();
sound4();
menu = 0;
loop();
InGame();
}
// Menang
if (Skor == maxSkor && Menang == 0) {
Menang = 1;
if (Menang == 1) {
Win();
}
}
// Restart setelah menang
if (digitalRead(11) == LOW && menu == 0 && Menang == 1) {
sound4();
setup();
}
// Di dalam Menu
if (menu == 1 && Kalah == 0 && Menang == 0) {
if (digitalRead(11) == LOW && panahPilih == 0) {
delay(200);
panahPilih = 1;
GameMenu();
}
if (digitalRead(13) == LOW && digitalRead(12) != LOW && panahPilih == 0) {
delay(200);
if (nyawaMax < 10) {
nyawa ++;
nyawaMax ++;
}
GameMenu();
}
if (digitalRead(12) == LOW && digitalRead(13) != LOW && panahPilih == 0) {
delay(200);
if (nyawaMax > 1) {
nyawa --;
nyawaMax --;
}
GameMenu();
}
if (digitalRead(11) == LOW && panahPilih == 1) {
delay(200);
panahPilih = 0;
GameMenu();
}
if (digitalRead(13) == LOW && digitalRead(12) != LOW && panahPilih == 1) {
delay(200);
if (maxSkor < 999) {
maxSkor ++;
}
GameMenu();
}
if (digitalRead(12) == LOW && digitalRead(13) != LOW && panahPilih == 1) {
delay(200);
if (maxSkor > 1) {
maxSkor --;
}
GameMenu();
}
}
}