#include "Wire.h"
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C LCD(0x27, 20, 2);
#define BUZZER 10 // пин подключения зуммера
#define BUTTON 8 // пин подключения кнопки
// динозаврик
byte dino[8] = {
0b01110, 0b11011, 0b11111, 0b11100, 0b11111, 0b01100, 0b10010, 0b11011
};
// дерево
byte tree[8] = {
0b00000, 0b00000, 0b00000, 0b11011, 0b11011, 0b11011, 0b01100, 0b01100
};
// камень
byte stone[8] = {
0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b11111
};
// птица
byte bird[8] = {
0b00100, 0b00101, 0b01111, 0b11111, 0b10100, 0b00100, 0b00000, 0b00000
};
bool buttonWasUp = true;
bool buttonIsUp;
int level = 1;
int pause = 400;
byte p = 0;
void setup() {
pinMode(BUZZER, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
LCD.begin(20, 2);
LCD.backlight();
LCD.createChar(0, dino);
LCD.createChar(1, tree);
LCD.createChar(2, stone);
LCD.createChar(3, bird);
LCD.setCursor(7, 0);
LCD.print("GO!");
delay(400);
tone(BUZZER, 600);
delay(100);
noTone(BUZZER);
LCD.clear();
randomSeed(analogRead(0)); // Инициализация случайных чисел
}
void loop() {
byte d = 1; // Позиция динозаврика (0 - прыжок, 1 - на земле)
byte x = 15; // Позиция препятствия по горизонтали
byte y = 1; // Позиция препятствия по вертикали
byte i = random(1, 4); // Тип препятствия (1 - дерево, 2 - камень, 3 - птица)
if (i == 3) y = 0; // Птица на верхней строке
else y = 1; // Дерево или камень на нижней строке
while (x > 0) {
LCD.clear();
LCD.setCursor(0, 0);
LCD.print(level);
// Проверка нажатия кнопки с подавлением дребезга
buttonIsUp = digitalRead(BUTTON);
if (buttonWasUp && !buttonIsUp) {
delay(10);
buttonIsUp = digitalRead(BUTTON);
if (!buttonIsUp) d = 0; // Прыжок при нажатии
}
buttonWasUp = buttonIsUp;
if (p > 3) d = 1; // Завершение прыжка после 4 кадров
LCD.setCursor(4, d);
LCD.print(char(0)); // Отображение динозаврика
LCD.setCursor(x, y);
tone(BUZZER, 50); // Звук препятствия
LCD.print(char(i)); // Отображение препятствия
noTone(BUZZER); // Выключение звука
// Проверка столкновения
if (x == 4 && y == d) {
delay(400);
tone(BUZZER, 50);
delay(100);
noTone(BUZZER);
delay(100);
tone(BUZZER, 20);
delay(300);
noTone(BUZZER);
LCD.clear();
delay(200);
LCD.setCursor(3, 0);
LCD.print("GAME OVER!");
delay(600);
LCD.clear();
delay(400);
LCD.setCursor(3, 0);
LCD.print("GAME OVER!");
delay(600);
LCD.clear();
LCD.setCursor(3, 1);
LCD.print("LEVEL: ");
LCD.print(level);
delay(400);
LCD.setCursor(3, 0);
LCD.print("GAME OVER!");
delay(3000);
LCD.clear();
LCD.setCursor(7, 0);
LCD.print("GO!");
delay(400);
tone(BUZZER, 600);
delay(100);
noTone(BUZZER);
LCD.clear();
level = 0;
pause = 400;
p = 0;
y = 1;
x = 0;
break;
}
// Звук прыжка
if (d == 0) {
tone(BUZZER, 200);
delay(100);
noTone(BUZZER);
} else {
delay(100);
}
delay(pause); // Скорость игры
x = x - 1; // Движение препятствия влево
p = p + 1; // Счётчик длительности прыжка
if (p > 4) p = 0;
}
tone(BUZZER, 800); // Звук завершения уровня
delay(20);
noTone(BUZZER); // Выключение звука
level = level + 1;
pause = pause - 20; // Увеличение скорости
if (pause < 0) pause = 0;
}