Ваш электронный адрес не будет опубликован. Обязательные поля помечены *

#включают
#включают
#включают
#включают

#define SCREEN_WIDTH 128 // Ширина дисплея OLED, в пикселях
#define SCREEN_HEIGHT 64 // Высота дисплея OLED в пикселях
#define OLED_RESET 4 // Сбросить вывод № (или -1, если используется вывод сброса Arduino)

Дисплей Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, & Wire, OLED_RESET); // Объявление для дисплея SSD1306, подключенного к I2C (выводы SDA, SCL)

int resolution [2] = {SCREEN_WIDTH, SCREEN_HEIGHT}
, ball [2] = {20, (разрешение [1] / 2)};
const int PIXEL_SIZE = 8
, WALL_WIDTH = 4
, PADDLE_WIDTH = 4
, BALL_SIZE = 4
СКОРОСТЬ = 3;
int playerScore = 0
, aiScore = 0
, playerPos = 0
aiPos = 0;
char ballDirectionHori = 'R'
, ballDirectionVerti = 'S';
логическое значение inProgress = true;

// Prototipo das funcoes
void movePlayer ();
void moveAi ();
void drawScore ();
void eraseScore ();
void drawNet ();
void drawPixel (размеры int posX, int posY, int);
void erasePixel (размеры int posX, int posY, int);
void drawPlayerPaddle (int row);

instagram viewer

void erasePlayerPaddle (int row);
void drawAiPaddle (int row);
void eraseAiPaddle (int row);
void drawBall (int x, int y);
void eraseBall (int x, int y);

void setup () {
Serial.begin (9600);

// SSD1306_SWITCHCAPVCC = создать напряжение на дисплее от 3,3 В внутри
if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Адрес 0x3D для 128x64
Serial.println (F («Ошибка выделения SSD1306»));
за (;;); // Не продолжай, цикл навсегда
}
display.display ();
задержка (2000 год); // Пауза на 2 секунды

// Очистить буфер
display.clearDisplay ();
}

void loop () {
if (aiScore> 3 || playerScore> 3) {// проверить состояние игры
inProgress = false;

// кто-то победил
display.clearDisplay ();
display.setTextSize (4);
display.setTextColor (WHITE);
display.setCursor (0, 0); // выясним кто
if (aiScore> playerScore)
display.println («ВЫ ПОТЕРЯЕТЕ!»);
еще if (playerScore> aiScore)
display.println («ВЫ ВЫИГРЫВАЕТЕ!»);
}

if (inProgress) {
eraseScore ();
eraseBall (ball [0], ball [1]);

if (ballDirectionVerti == 'U') // переместить шар вверх по диагонали
шар [1] = шар [1] - СКОРОСТЬ;

if (ballDirectionVerti == 'D') // переместить шар вниз по диагонали
шар [1] = шар [1] + СКОРОСТЬ;

if (ball [1] = resolution [1]) // отскок мяча от дна
ballDirectionVerti = 'U';

if (ballDirectionHori == 'R') {
ball [0] = ball [0] + SPEED; // переместить мяч
if (ball [0]> = (resolution [0] - 6)) {// шар находится на краю AI экрана
if ((aiPos + 12)> = ball [1] && (aiPos - 12) (aiPos + 2)) // отклонить шар вниз
ballDirectionVerti = 'D';
else if (ball [1] ballDirectionVerti = 'U';
еще // отклонить мяч прямо
ballDirectionVerti = 'S';

ballDirectionHori = 'L'; // изменить направление мяча
} else {// ЦЕЛЬ!
шар [0] = 6; // переместить мяч на другую сторону экрана
ballDirectionVerti = 'S'; // сбросить шар в прямое движение
шар [1] = разрешение [1] / 2; // переместить мяч в середину экрана
++ playerScore; // увеличить счет игрока
}
}
}

if (ballDirectionHori == 'L') {
ball [0] = ball [0] - SPEED; // переместить мяч
if (ball [0] = ball [1] && (playerPos - 12) (playerPos + 2)) // отклоняем шар вниз
ballDirectionVerti = 'D';
еще if (ball [1] aiPos)
++ aiPos;
иначе если (ball [1] --aiPos;

drawAiPaddle (aiPos);
}

void drawScore () {// Нарисовать AI и очки игроков
display.setTextSize (2);
display.setTextColor (WHITE);
display.setCursor (45, 0);
display.println (playerScore);

display.setCursor (75, 0);
display.println (aiScore);
}

void eraseScore () {// Стереть ИИ и результаты игрока
display.setTextSize (2);
display.setTextColor (BLACK);
display.setCursor (45, 0);
display.println (playerScore);

display.setCursor (75, 0);
display.println (aiScore);
}

void drawNet () {// Рисуем поле линии
для (int i = 0; я drawPixel (((разрешение [0] / 2) - 1), i * (WALL_WIDTH) + (WALL_WIDTH * i), WALL_WIDTH);
}

void drawPixel (размеры int posX, int posY, int) {// Рисуем группу пикселей
для (int x = 0; х для (int y = 0; у display.drawPixel ((posX + x), (posY + y), WHITE);
}

void erasePixel (размеры int posX, int posY, int) {// Удалить группу пикселей
для (int x = 0; х для (int y = 0; у display.drawPixel ((posX + x), (posY + y), ЧЕРНЫЙ);
}

void drawPlayerPaddle (int row) {
drawPixel (0, строка - (PADDLE_WIDTH * 2), PADDLE_WIDTH);
drawPixel (0, строка - PADDLE_WIDTH, PADDLE_WIDTH);
drawPixel (0, строка, PADDLE_WIDTH);
drawPixel (0, строка + PADDLE_WIDTH, PADDLE_WIDTH);
drawPixel (0, строка + (PADDLE_WIDTH + 2), PADDLE_WIDTH);
}

void erasePlayerPaddle (int row) {
erasePixel (0, строка - (PADDLE_WIDTH * 2), PADDLE_WIDTH);
erasePixel (0, строка - PADDLE_WIDTH, PADDLE_WIDTH);
erasePixel (0, строка, PADDLE_WIDTH);
erasePixel (0, строка + PADDLE_WIDTH, PADDLE_WIDTH);
erasePixel (0, строка + (PADDLE_WIDTH + 2), PADDLE_WIDTH);
}

void drawAiPaddle (int row) {
столбец int = разрешение [0] - PADDLE_WIDTH;
drawPixel (столбец, строка - (PADDLE_WIDTH * 2), PADDLE_WIDTH);
drawPixel (столбец, строка - PADDLE_WIDTH, PADDLE_WIDTH);
drawPixel (столбец, строка, PADDLE_WIDTH);
drawPixel (столбец, строка + PADDLE_WIDTH, PADDLE_WIDTH);
drawPixel (столбец, строка + (PADDLE_WIDTH * 2), PADDLE_WIDTH);
}

void eraseAiPaddle (int row) {
столбец int = разрешение [0] - PADDLE_WIDTH;
erasePixel (столбец, строка - (PADDLE_WIDTH * 2), PADDLE_WIDTH);
erasePixel (столбец, строка - PADDLE_WIDTH, PADDLE_WIDTH);
erasePixel (столбец, строка, PADDLE_WIDTH);
erasePixel (столбец, строка + PADDLE_WIDTH, PADDLE_WIDTH);
erasePixel (столбец, строка + (PADDLE_WIDTH * 2), PADDLE_WIDTH);
}

void drawBall (int x, int y) {
display.drawCircle (x, y, BALL_SIZE, WHITE);
}

void eraseBall (int x, int y) {
display.drawCircle (x, y, BALL_SIZE, BLACK);
}