#include <U8g2lib.h> // Библиотека для OLED
U8g2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// Параметры игры
int ballX = 64, ballY = 32; // Позиция мяча
int ballSpeedX = 1, ballSpeedY = 1; // Скорость мяча
int player1Y = 32, player2Y = 32; // Позиции ракеток
const int paddleHeight = 16, paddleWidth = 2;
int player1Score = 0, player2Score = 0;
bool gamePaused = true;
void setup() {
u8g2.begin();
pinMode(A0, INPUT); // Джойстик для игрока 1
pinMode(2, INPUT_PULLUP); // Кнопка паузы
randomSeed(analogRead(A1)); // Для случайного старта мяча
}
void loop() {
// Управление
if (digitalRead(2) == LOW) { // Кнопка паузы
gamePaused = !gamePaused;
delay(200);
}
if (!gamePaused) {
player1Y = map(analogRead(A0), 0, 1023, 0, 64 - paddleHeight); // Джойстик -> ракетка
// Движение мяча
ballX += ballSpeedX;
ballY += ballSpeedY;
// Отскок от стен
if (ballY <= 0 || ballY >= 63) ballSpeedY = -ballSpeedY;
// Отскок от ракеток
if (ballX <= 3 && ballY >= player1Y && ballY <= player1Y + paddleHeight) {
ballSpeedX = -ballSpeedX;
tone(3, 500, 50); // Звук удара
}
if (ballX >= 125 && ballY >= player2Y && ballY <= player2Y + paddleHeight) {
ballSpeedX = -ballSpeedX;
tone(3, 500, 50);
}
// ИИ для второго игрока (простой алгоритм)
if (ballY > player2Y + paddleHeight / 2) player2Y += 1;
else if (ballY < player2Y + paddleHeight / 2) player2Y -= 1;
// Гол
if (ballX < 0) {
player2Score++;
resetBall();
}
if (ballX > 127) {
player1Score++;
resetBall();
}
}
// Отрисовка
u8g2.clearBuffer();
u8g2.drawBox(0, player1Y, paddleWidth, paddleHeight); // Ракетка 1
u8g2.drawBox(126, player2Y, paddleWidth, paddleHeight); // Ракетка 2
u8g2.drawDisc(ballX, ballY, 2); // Мяч
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.setCursor(32, 10);
u8g2.print(player1Score);
u8g2.setCursor(96, 10);
u8g2.print(player2Score);
if (gamePaused) {
u8g2.setFont(u8g2_font_8x13B_tr);
u8g2.setCursor(40, 40);
u8g2.print("PAUSE");
}
u8g2.sendBuffer();
delay(10); // Задержка для плавности
}
void resetBall() {
ballX = 64;
ballY = random(10, 54);
ballSpeedX = (random(0, 2) == 0) ? 1 : -1; // Случайное направление
ballSpeedY = (random(0, 2) == 0) ? 1 : -1;
delay(500);
}