#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // Адреса I2C та розміри матриці
int playerRow = 2; // Початкове положення гравця (середина верхнього ряду)
int playerCol = 0; // Стовпець гравця (ліва сторона)
int obstacleCol = 19; // Стовпець першої перешкоди (права сторона)
int obstacleCol2 = 19; // Стовпець другої перешкоди (права сторона)
int obstacleRow; // Рядок першої перешкоди
int obstacleRow2; // Рядок другої перешкоди
int score = 0;
boolean gameStarted = false; // Додаємо змінну стану для визначення, чи гра розпочата
void setup() {
lcd.init(); // Ініціалізація LCD
lcd.backlight(); // Вмикаємо підсвічування LCD
lcd.clear();
randomSeed(analogRead(0)); // Ініціалізуємо генератор випадкових чисел
pinMode(2, INPUT_PULLUP); // Кнопка "Вгору"
pinMode(3, INPUT_PULLUP); // Кнопка "Вниз"
}
void loop() {
if (!gameStarted) {// Перевірка, чи гра не розпочата
lcd.setCursor(0, 0);
lcd.print("Press Up Button");//Натискаєио кнопку "Вверх" для старту гри
lcd.setCursor(4, 1);
lcd.print("to start"); //Після натиску показує повідомлення "Start"
if (digitalRead(2) == LOW) {// Очікування натискання кнопки "Вгору" для старту гри
gameStarted = true;
lcd.clear();
}
} else {// Обробка руху гравця вгору та вниз
if (digitalRead(2) == LOW && playerRow > 0) {
playerRow--;
delay(200); // Затримка для уникнення подвійного руху при утриманні кнопки
} else if (digitalRead(3) == LOW && playerRow < 3) {
playerRow++;
delay(200); // Затримка для уникнення подвійного руху при утриманні кнопки
}
lcd.clear();
lcd.setCursor(playerCol, playerRow);
lcd.print("Х");
lcd.setCursor(obstacleCol, obstacleRow); // Очищення екрану та вивід гравця та перешкід на LCD
lcd.print("O");
lcd.setCursor(obstacleCol2, obstacleRow2);
lcd.print("O");
obstacleCol--;// Рух перешкід вліво
obstacleCol2--;
if (obstacleCol < 0) {// Перевірка та переміщення перешкід, якщо вони вийшли за лівий край
obstacleCol = 19;
obstacleRow = random(0, 3);
}
if (obstacleCol2 < 0) {
obstacleCol2 = 19;
obstacleRow2 = random(0, 3);
}
if ((obstacleCol == playerCol && obstacleRow == playerRow) || (obstacleCol2 == playerCol && obstacleRow2 == playerRow)) {
lcd.clear();
lcd.setCursor(4, 0); // Перевірка зіткнень з гравцем та оновлення гри в разі потрібності
lcd.print("Game Over");
lcd.setCursor(2, 1);
lcd.print("Press Up btn to restart");
while (digitalRead(2) == HIGH) {
// Чекаємо, поки кнопка "Вгору" не буде натиснута
}
gameStarted = false;// Скидання параметрів для нової гри
playerRow = 2;
obstacleCol = 19;
obstacleCol2 = 19;
score = 0;
lcd.clear();
}
// Вивід рахунку гри та оновлення його
lcd.setCursor(0, 3);
lcd.print("Score: ");
lcd.print(score);
score++;
delay(50);// Затримка для керування швидкістю гри
}
}