Вашият имейл адрес няма да бъде публикуван. Задължителните полета са маркирани *

#include
#include
#include
#include

#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 разделителна способност [2] = {SCREEN_WIDTH, SCREEN_HEIGHT}
, топка [2] = {20, (разделителна способност [1] / 2)};
const int PIXEL_SIZE = 8
, WALL_WIDTH = 4
, PADDLE_WIDTH = 4
, BALL_SIZE = 4
, SPEED = 3;
int playerScore = 0
, aiScore = 0
, playerPos = 0
, aiPos = 0;
char ballDirectionHori = 'R'
, ballDirectionVerti = 'S';
булева inProgress = вярно;

// Prototipo das funcoes
void movePlayer ();
void moveAi ();
невалиден drawScore ();
невалиден eraseScore ();
void drawNet ();
void drawPixel (int posX, int posY, int размери);
void erasePixel (int posX, int posY, int размери);

instagram viewer

void drawPlayerPaddle (int ред);
void erasePlayerPaddle (int ред);
void drawAiPaddle (int ред);
void eraseAiPaddle (int ред);
void drawBall (int x, int y);
void eraseBall (int x, int y);

настройка за невалидност () {
Serial.begin (9600);

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

// Изчистване на буфера
display.clearDisplay ();
}

void loop () {
ако (aiScore> 3 || playerScore> 3) {// проверете състоянието на играта
inProgress = невярно;

// някой е спечелил
display.clearDisplay ();
display.setTextSize (4);
display.setTextColor (WHITE);
display.setCursor (0, 0); // разбера кой
ако (aiScore> playerScore)
display.println ("ВИ ИЗГУБЯ!");
друго, ако (playerScore> aiScore)
display.println ("ВИ ПЕЧЕЛИ!");
}

ако (inProgress) {
eraseScore ();
eraseBall (топка [0], топка [1]);

ако (ballDirectionVerti == 'U') // движи топката по диагонал
топка [1] = топка [1] - скоростна скорост;

ако (ballDirectionVerti == 'D') // преместете топката надолу по диагонал
топка [1] = топка [1] + скоростна скорост;

ако (топка [1] = разделителна способност [1]) // отскочи топката от дъното
ballDirectionVerti = 'U';

ако (ballDirectionHori == 'R') {
топка [0] = топка [0] + СКОРОСТ; // движеща се топка
ако (топката [0]> = (разделителна способност [0] - 6)) {// топката е в края на AI на екрана
ако ((aiPos + 12)> = топка [1] && (aiPos - 12) (aiPos + 2)) // отклони топката надолу
ballDirectionVerti = 'D';
иначе ако (топка [1] ballDirectionVerti = 'U';
друго // отклонявам топката направо
ballDirectionVerti = 'S';

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

ако (ballDirectionHori == 'L') {
топка [0] = топка [0] - СКОРОСТ; // движеща се топка
if (ball [0] = ball [1] && (playerPos - 12) (playerPos + 2)) // отклони топката надолу
ballDirectionVerti = 'D';
иначе ако (топка [1] aiPos)
++ aiPos;
иначе ако (топка [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 () {// Изтриване на AI и резултатите на играчите
display.setTextSize (2);
display.setTextColor (ЧЕРЕН);
display.setCursor (45, 0);
display.println (playerScore);

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

void drawNet () {// Начертайте поле за линия
за (int i = 0; i drawPixel (((резолюция [0] / 2) - 1), i * (WALL_WIDTH) + (WALL_WIDTH * i), WALL_WIDTH);
}

void drawPixel (int posX, int posY, int размери) {// Начертайте група от пиксели
за (int x = 0; x за (int y = 0; y display.drawPixel ((posX + x), (posY + y), WHITE);
}

void erasePixel (int posX, int posY, int размери) {// Изтриване на група пиксели
за (int x = 0; x за (int y = 0; y display.drawPixel ((posX + x), (posY + y), ЧЕРЕН);
}

void drawPlayerPaddle (int ред) {
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 ред) {
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 ред) {
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);
}

невалиден 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);
}