#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
//Verbindung I2C
//GND to GND
//VCC to 5V
//SDA to A4
//SCL to A5
#define BUTTON_PIN 2
#define BUZZER_PIN 11
// BITMAPS
byte dino1[8] = {
0b00000,0b00111,0b00111,0b10110,0b11111,0b01010,0b01010,0b00000
};
byte dino2[8] = {
0b00000,0b00111,0b00111,0b10110,0b11111,0b00100,0b01010,0b00000
};
byte cacti[8] = {
0b00100,0b00101,0b10101,0b10101,0b10111,0b11100,0b00100,0b00000
};
byte bird1[8] = {
0b00000,0b00100,0b01100,0b11110,0b00111,0b00110,0b00100,0b00000
};
byte bird2[8] = {
0b00000,0b00100,0b11110,0b01100,0b00111,0b00100,0b00100,0b00000
};
bool gameRunning = false;
int dinoY = 1;
bool jumping = false;
unsigned long jumpStart = 0;
int obstacleX = 15;
int obstacleY = 1;
int obstacleType = 0;
int prevObstacleX = 15;
int prevObstacleY = 1;
unsigned long lastMove = 0;
int speedDelay = 300;
unsigned long score = 0;
bool dinoFrame = false;
bool birdFrame = false;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
lcd.init();
lcd.backlight();
lcd.createChar(0, dino1);
lcd.createChar(1, dino2);
lcd.createChar(2, cacti);
lcd.createChar(3, bird1);
lcd.createChar(4, bird2);
lcd.setCursor(0, 0);
lcd.print("Dino Game");
delay(1500);
lcd.clear();
}
void loop() {
if (!gameRunning) {
waitForStart();
return;
}
handleInput();
updateGame();
drawGame();
delay(10);
}
void waitForStart() {
lcd.setCursor(0, 0);
lcd.print("Press to start");
if (digitalRead(BUTTON_PIN) == LOW) {
delay(200);
resetGame();
lcd.clear();
gameRunning = true;
}
}
void handleInput() {
if (digitalRead(BUTTON_PIN) == LOW && !jumping) {
jumping = true;
jumpStart = millis();
tone(BUZZER_PIN, 1000, 80);
}
if (jumping && millis() - jumpStart > 400) {
jumping = false;
}
dinoY = jumping ? 0 : 1;
}
void updateGame() {
int currentSpeed = speedDelay;
if (obstacleType == 1) currentSpeed = speedDelay - 40;
if (millis() - lastMove > currentSpeed) {
lastMove = millis();
prevObstacleX = obstacleX;
prevObstacleY = obstacleY;
obstacleX--;
dinoFrame = !dinoFrame;
birdFrame = !birdFrame;
if (obstacleX < 0) {
lcd.setCursor(0, prevObstacleY);
lcd.print(" ");
obstacleX = 15;
obstacleType = random(0, 2);
if (obstacleType == 0) {
obstacleY = 1;
} else {
obstacleY = 0;
}
prevObstacleX = obstacleX;
prevObstacleY = obstacleY;
score++;
if (score % 4 == 0 && speedDelay > 100) {
speedDelay -= 25;
}
}
checkCollision();
}
}
void checkCollision() {
if (obstacleX == 1) {
if (obstacleType == 0 && dinoY == 1) gameOver();
if (obstacleType == 1 && dinoY == 0) gameOver();
}
}
void gameOver() {
tone(BUZZER_PIN, 200, 300);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("GAME OVER");
lcd.setCursor(0, 1);
lcd.print("Score:");
lcd.print(score);
gameRunning = false;
}
void resetGame() {
lcd.clear();
score = 0;
obstacleX = 15;
obstacleY = 1;
prevObstacleX = 15;
prevObstacleY = 1;
speedDelay = 300;
}
void drawGame() {
lcd.setCursor(prevObstacleX, prevObstacleY);
lcd.print(" ");
lcd.setCursor(obstacleX, obstacleY);
if (obstacleType == 0) {
lcd.write(byte(2));
} else {
if (birdFrame)
lcd.write(byte(3));
else
lcd.write(byte(4));
}
lcd.setCursor(1, 0); lcd.print(" ");
lcd.setCursor(1, 1); lcd.print(" ");
lcd.setCursor(1, dinoY);
if (dinoFrame)
lcd.write(byte(0));
else
lcd.write(byte(1));
lcd.setCursor(10, 0);
lcd.print(" ");
lcd.setCursor(10, 0);
lcd.print(score);
}