#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Подключение LCD дисплея по I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);  // Адрес экрана 0x27, размер 16x2

// Пины для кнопок увеличения числа и подтверждения
const int increaseButtonPin = 6;
const int submitButtonPin = 7;

// Максимальное значение, которое можно ввести (по вашему желанию)
const int maxNumber = 10;

// Переменные для хранения введенного пользователем числа и рандомного числа
int userNumber = 0;
int randomNumber = 0;

bool buttonState = LOW;
bool lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

bool gameEnded = false; // Флаг, указывающий на состояние завершения игры

void setup() {
  // Инициализация LCD дисплея
  lcd.init();
  lcd.backlight();
  lcd.clear();

  // Настройка пинов для кнопок
  pinMode(increaseButtonPin, INPUT);
  pinMode(submitButtonPin, INPUT);

  // Генерация случайного числа от 0 до maxNumber-1
  randomSeed(analogRead(0));
  randomNumber = random(maxNumber);

  // Настройка последовательного порта для вывода в консоль
  Serial.begin(9600);
  Serial.println("Guess the number game!");

  // Вывод правильного ответа в консоль перед началом игры
  Serial.print("Correct answer: ");
  Serial.println(randomNumber);
}

void loop() {
  if (!gameEnded) {
    // Отображение текущего введенного числа на LCD дисплее
    lcd.setCursor(0, 0);
    lcd.print("Your number:");
    lcd.setCursor(0, 1);
    lcd.print(userNumber);

    // Чтение состояния кнопки увеличения числа с антидребезгом
    int reading = digitalRead(increaseButtonPin);
    
    if (reading != lastButtonState) {
      lastDebounceTime = millis();
    }

    if ((millis() - lastDebounceTime) > debounceDelay) {
      if (reading != buttonState) {
        buttonState = reading;

        // Обработка изменения состояния кнопки
        if (buttonState == HIGH) {
          // Увеличиваем число (ограничиваем до максимального значения)
          userNumber = (userNumber + 1) % maxNumber;
        }
      }
    }

    lastButtonState = reading;

    // Обработка кнопки подтверждения
    if (digitalRead(submitButtonPin) == HIGH) {
      // Проверяем число пользователя с фиксированным рандомным числом
      if (userNumber == randomNumber) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Congratulations!");
        lcd.setCursor(0, 1);
        lcd.print("You won!");
        Serial.println("You won!");
      } else {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Sorry, try again!");
      }
      gameEnded = true; // Устанавливаем флаг завершения игры
      delay(1000); // Задержка перед очисткой экрана
    }
  }
}