#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int waiting;
int obst1_pos = 16;
int obst2_pos = 24;
int button = 8;
int prev_state;
int player_pos = 1;
int jump_length = 1;
int curr_sprite = 0;
byte player_run1[8] = {
B00100,
B01010,
B00101,
B01110,
B10100,
B00111,
B00101,
B01000
};
byte player_run2[8] = {
B00100,
B01010,
B10100,
B01110,
B00101,
B00100,
B11010,
B00010
};
byte obstacle1[8] = {
B10101,
B01110,
B01110,
B11111,
B01110,
B01110,
B11111,
B01110
};
byte obstacle2[8] = {
B00010,
B00000,
B00100,
B01110,
B11110,
B10111,
B11011,
B01110
};
void setup() {
//initialize lcd screen
lcd.init();
// turn on the backlight
lcd.backlight();
lcd.createChar(0, player_run1);
lcd.createChar(1, player_run2);
lcd.createChar(2, obstacle1);
lcd.createChar(3, obstacle2);
pinMode(8, INPUT_PULLUP);
prev_state = digitalRead(button);
}
void gameover()
{
lcd.clear();
lcd.setCursor(6, 0);
lcd.print("GAME");
lcd.setCursor(6, 1);
lcd.print("OVER");
delay(2000);
lcd.clear();
player_pos = 1;
obst1_pos = 16;
obst2_pos = 24;
}
void collision()
{
if ((obst1_pos == 0 && player_pos == 1) || (obst2_pos == 0 && player_pos == 1))
{
gameover();
}
}
//
void jump()
{
if (jump_length <= 0)
{
player_pos = 1;
}
if (!digitalRead(button) && prev_state == HIGH) {
prev_state = digitalRead(button);
player_pos = 0;
jump_length = 1;
}
}
void moveObstacles()
{
if (obst1_pos < 0)
{
obst1_pos = 16;
}
if (obst2_pos < 0)
{
obst2_pos = obst1_pos + 8;
}
lcd.setCursor(obst1_pos, 1);
lcd.write(byte(2));
lcd.setCursor(obst2_pos, 1);
lcd.write(byte(3));
obst1_pos--;
obst2_pos--;
}
void loop() {
moveObstacles();
lcd.setCursor(0, player_pos);
lcd.write(byte(curr_sprite));
// wait before changing display
waiting = millis() + 200;
while (waiting > millis())
{
jump();
}
collision();
// run sprite choice
switch(curr_sprite) {
case 1:
curr_sprite = 0;
break;
case 0:
curr_sprite = 1;
break;
default:
break;
}
prev_state = digitalRead(button);
jump_length--;
lcd.clear();
}