// Dinosaur Game
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(32,16,2);
int button = 13;
int buttonValue = 0;
int tLED[] = {2, 3, 4, 5, 6};
int bLED[] = {11, 10, 9, 8, 7};
int screenLen = 5;
int highScore = 0;
int score = 0;
int scoreIncrement = 5;
bool gameOver = false;
int tickSpeed = 10;
int playerPos = 0;
int jumpTime = 1000;
int jumpTimeC = 0;
int jump = false;
int spikeChance = 10;
int topChance = 4;
int lastSpike = 0;
int moveTime = 500;
int moveTimeC = 0;
int spike1 = 0;
int spike1state = -1;
int spike2 = 0;
int spike2state = -1;
int spike3 = 0;
int spike3state = -1;
void setup() {
lcd.begin(16,2);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.print("Score: 0");
lcd.setCursor(0, 1);
lcd.print("Highest: 0");
for (int i = 0; i < screenLen; i++) {
pinMode(tLED[i], OUTPUT);
pinMode(bLED[i], OUTPUT);
}
pinMode(button, INPUT);
gameRestart();
}
void loop() {
delay(tickSpeed);
updateGame();
if (gameOver) {
gameRestart();
}
}
void updateGame() {
// Update Player
jump = false;
int newButtonValue = digitalRead(button);
if(newButtonValue != buttonValue) {
buttonValue = newButtonValue;
if(buttonValue == 1) {
jump = true;
}
}
if (playerPos == 0) {
if (jump) {
if (digitalRead(tLED[0])) {
gameOver = true;
return;
}
playerPos = 1;
digitalWrite(tLED[0], HIGH);
digitalWrite(bLED[0], LOW);
}
} else {
jumpTimeC += tickSpeed;
if (jumpTimeC >= jumpTime) {
if (digitalRead(bLED[0])) {
gameOver = true;
return;
}
jumpTimeC = 0;
playerPos = 0;
digitalWrite(tLED[0], LOW);
digitalWrite(bLED[0], HIGH);
}
}
// Update Spikes
moveTimeC += tickSpeed;
if (moveTimeC >= moveTime) {
moveTimeC -= moveTime;
score += scoreIncrement;
lastSpike += 1;
updateSpike(&spike1, &spike1state);
updateSpike(&spike2, &spike2state);
updateSpike(&spike3, &spike3state);
lcd.setCursor(7, 0);
lcd.print(String(score));
}
}
void updateSpike(int* spike, int* spikeState) {
*spike -= 1;
switch (*spikeState) {
case 0:
if (*spike == -1) {
*spikeState = -1;
digitalWrite(bLED[0], LOW);
} else {
digitalWrite(bLED[*spike + 1], LOW);
digitalWrite(bLED[*spike], HIGH);
if ((*spike == 0) && (playerPos == 0)) {
gameOver = true;
}
}
break;
case 1:
if (*spike == -1) {
*spikeState = -1;
digitalWrite(tLED[0], LOW);
} else {
digitalWrite(tLED[*spike + 1], LOW);
digitalWrite(tLED[*spike], HIGH);
if ((*spike == 0) && (playerPos == 1)) {
gameOver = true;
}
}
break;
default:
*spike = screenLen - 1;
if (lastSpike < 2) {
return;
}
if (random(10 - lastSpike) == 0) {
lastSpike = 0;
int spawnPos = random(topChance);
if (random(topChance)) {
digitalWrite(bLED[screenLen - 1], HIGH);
*spikeState = 0;
} else {
digitalWrite(tLED[screenLen - 1], HIGH);
*spikeState = 1;
}
}
}
}
void gameRestart() {
gameOver = false;
if (highScore < score) {
highScore = score;
lcd.setCursor(9, 1);
lcd.print(String(highScore));
}
score = 0;
playerPos = 0;
jumpTimeC = 0;
moveTimeC = 0;
spike1state = -1;
spike2state = -1;
spike3state = -1;
for (int j = 0; j < 3; j++) {
for (int k = 0; k < screenLen; k++) {
digitalWrite(tLED[k], HIGH);
digitalWrite(bLED[k], HIGH);
}
delay(500);
for (int k = 0; k < screenLen; k++) {
digitalWrite(tLED[k], LOW);
digitalWrite(bLED[k], LOW);
}
delay(500);
}
lcd.setCursor(7, 0);
lcd.print("0 ");
digitalWrite(bLED[0], HIGH);
}