#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 in PCF8574 by NXP and Set to 0x3F in PCF8574A by Ti
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte dino1[] = {
B01110,
B01011,
B01111,
B00110,
B01111,
B11110,
B00100,
B00110
};
byte dino2[] = {
B01110,
B01011,
B01111,
B00110,
B01111,
B11110,
B01100,
B00000
};
byte cactus[] = {
B00010,
B00110,
B10110,
B10111,
B11111,
B00110,
B01110,
B00110
};
// variables
int cact_cords[3];
bool injump = false;
int jump_counter = 0;
int dist = 0;
int y = 1;
int per = 150;
unsigned long time_now = 0;
void setup() {
// LCD
lcd.init();
lcd.backlight();
lcd.createChar(0, dino1);
lcd.createChar(1, dino2);
lcd.createChar(2, cactus);
lcd.home();
// PINS
pinMode(2, INPUT);
// OTHER
randomSeed(analogRead(A0));
define_cords();
}
// Drawing
void draw_sprite(int i, int x, int y) {
lcd.setCursor(x,y);
lcd.write(i);
}
// Cactuses functions [init cords / update]
void define_cords() {
for (int i = 0; i < 3; i++) {
if (i == 0) {
cact_cords[i] = 15 + random(8);
} else {
cact_cords[i] = cact_cords[i-1] + random(2, 10);
}
}
}
void update_cactuses() {
for (int i = 0; i < 3; i++) {
if (cact_cords[i] < 0) {
cact_cords[i] = 15 + random(0, 15);
} else {
draw_sprite(2, cact_cords[i], 1);
cact_cords[i] = cact_cords[i]-1;
}
}
}
// dino functions [jump / collision]
void update_dino() {
int sprite = 0;
if (dist % 2 == 1) {sprite = 1;}
if (injump && jump_counter < 3) {
y = 0;
jump_counter++;
} else {
jump_counter = 0;
injump = false;
y = 1;
}
draw_sprite(sprite, 0, y);
}
bool collision() {
for (int i = 0; i < 3; i++) {
if (cact_cords[i] == 0 && y == 1) {
return true;
}
}
return false;
}
// text function [end game text / dist?]
void print_score() {
lcd.setCursor(8, 0);
lcd.print("DIST:");
lcd.setCursor(13, 0);
lcd.print(dist);
}
void loop() {
//delay(350);
if (millis() - time_now >= per) {
lcd.clear();
print_score();
dist++;
time_now = millis();
update_cactuses();
update_dino();
if (collision()) {
lcd.setCursor(2, 0);
dist = 0;
y = 1;
define_cords();
lcd.print("GAME OVER!");
delay(4000);
}
}
if (digitalRead(2) == 1) {
injump = true;
}
}