#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Настройки дисплея
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Пины
const int buttonPin = 15;
// Физика игры
int dinoY = 45; // Высота динозавра
int velocity = 0; // Скорость прыжка
int gravity = 2; // Гравитация
bool isJumping = false;
int obstacleX = 128; // Позиция кактуса
int score = 0;
void setup() {
Serial.begin(115200);
pinMode(buttonPin, INPUT_PULLUP); // Кнопка с внутренней подтяжкой
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("OLED не найден"));
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
}
void loop() {
// 1. INPUT (Вход)
if (digitalRead(buttonPin) == LOW && !isJumping) {
velocity = -12; // Импульс прыжка вверх
isJumping = true;
}
// 2. PROCESS (Обработка)
// Логика прыжка
if (isJumping) {
dinoY += velocity;
velocity += gravity;
if (dinoY >= 45) {
dinoY = 45;
isJumping = false;
}
}
// Движение кактуса
obstacleX -= 6;
if (obstacleX < -10) {
obstacleX = 128;
score++;
}
// Проверка столкновения (упрощенная)
if (obstacleX > 15 && obstacleX < 25 && dinoY > 35) {
gameOver();
}
// 3. OUTPUT (Выход)
drawGame();
delay(30); // Ограничение FPS
}
void drawGame() {
display.clearDisplay();
// Рисуем землю
display.drawLine(0, 55, 128, 55, WHITE);
// Рисуем Динозавра (квадратик для простоты в 1 части)
display.fillRect(20, dinoY, 10, 10, WHITE);
// Рисуем кактус
display.fillRect(obstacleX, 45, 6, 10, WHITE);
// Рисуем счет
display.setCursor(0,0);
display.print("Score: ");
display.print(score);
display.display();
}
void gameOver() {
display.clearDisplay();
display.setCursor(30, 25);
display.setTextSize(2);
display.print("GAME OVER");
display.display();
delay(2000);
score = 0;
obstacleX = 128;
}