Seu endereço de e-mail não será publicado. Os campos obrigatórios estão marcados *

#incluir
#incluir
#incluir
#incluir

#define SCREEN_WIDTH 128 // largura da tela OLED, em pixels
#define SCREEN_HEIGHT 64 // altura da tela OLED, em pixels
#define OLED_RESET 4 // Redefinir pino nº (ou -1 se estiver compartilhando o pino de redefinição do Arduino)

Exibição Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT e Wire, OLED_RESET); // Declaração para um monitor SSD1306 conectado ao I2C (pinos SDA, SCL)

int resolução [2] = {SCREEN_WIDTH, SCREEN_HEIGHT}
, bola [2] = {20, (resolução [1] / 2)};
const int PIXEL_SIZE = 8
, WALL_WIDTH = 4
, PADDLE_WIDTH = 4
, BALL_SIZE = 4
VELOCIDADE = 3;
int playerScore = 0
, aiScore = 0
, playerPos = 0
, aiPos = 0;
char ballDirectionHori = 'R'
, ballDirectionVerti = 'S';
inProgress booleano = true;

// Protótipo das funcoes
void movePlayer ();
void moveAi ();
voip drawScore ();
void eraseScore ();
void drawNet ();
drawPixel vazio (int posX, int posY, int dimensões);
void erasePixel (int posX, int posY, int dimensões);

instagram viewer

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

configuração nula () {
Serial.begin (9600);

// SSD1306_SWITCHCAPVCC = gera tensão de exibição de 3.3V internamente
if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Endereço 0x3D para 128x64
Serial.println (F ("Falha na alocação do SSD1306"));
para (;;); // Não continue, faça um loop para sempre
}
display.display ();
atraso (2000); // Pausa por 2 segundos

// Limpe o buffer
display.clearDisplay ();
}

loop vazio () {
if (aiScore> 3 || playerScore> 3) {// verifica o estado do jogo
inProgress = false;

// alguém ganhou
display.clearDisplay ();
display.setTextSize (4);
display.setTextColor (BRANCO);
display.setCursor (0, 0); // descobrir quem
if (aiScore> playerScore)
display.println ("VOCÊ PERDE!");
else if (playerScore> aiScore)
display.println ("VOCÊ GANHA!");
}

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

if (ballDirectionVerti == 'U') // move a bola para cima na diagonal
bola [1] = bola [1] - VELOCIDADE;

if (ballDirectionVerti == 'D') // move a bola para baixo na diagonal
bola [1] = bola [1] + VELOCIDADE;

if (bola [1] = resolução [1]) // devolve a bola ao fundo
ballDirectionVerti = 'U';

if (ballDirectionHori == 'R') {
bola [0] = bola [0] + VELOCIDADE; // move ball
if (bola [0]> = (resolução [0] - 6)) {// bola está na borda AI da tela
if ((aiPos + 12)> = ball [1] && (aiPos - 12) (aiPos + 2)) // desvia a bola para baixo
ballDirectionVerti = 'D';
else if (bola [1] ballDirectionVerti = 'U';
else // desviar a bola em linha reta
ballDirectionVerti = 'S';

ballDirectionHori = 'L'; // muda a direção da bola
} mais {// META!
bola [0] = 6; // move a bola para o outro lado da tela
ballDirectionVerti = 'S'; // redefine a bola para o percurso reto
bola [1] = resolução [1] / 2; // move a bola para o meio da tela
++ playerScore; // aumenta a pontuação do jogador
}
}
}

if (ballDirectionHori == 'L') {
bola [0] = bola [0] - VELOCIDADE; // move ball
if (bola [0] = bola [1] && (playerPos - 12) (playerPos + 2)) // desvia a bola para baixo
ballDirectionVerti = 'D';
senão se (bola [1] aiPos)
++ aiPos;
senão se (bola [1] --aiPos;

drawAiPaddle (aiPos);
}

void drawScore () {// Desenhe pontuações de IA e jogador
display.setTextSize (2);
display.setTextColor (BRANCO);
display.setCursor (45, 0);
display.println (playerScore);

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

void eraseScore () {// Apague a pontuação do AI e do jogador
display.setTextSize (2);
display.setTextColor (PRETO);
display.setCursor (45, 0);
display.println (playerScore);

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

void drawNet () {// Draw line field
para (int i = 0; i drawPixel (((resolução [0] / 2) - 1), i * (WALL_WIDTH) + (WALL_WIDTH * i), WALL_WIDTH);
}

void drawPixel (int posX, int posY, int dimension) {// Desenha o grupo de pixels
para (int x = 0; x para (int y = 0; y display.drawPixel ((posX + x), (posY + y), BRANCO);
}

void erasePixel (int posX, int posY, int dimension) {// Apagar grupo de pixels
para (int x = 0; x para (int y = 0; y display.drawPixel ((posX + x), (posY + y), PRETO);
}

void drawPlayerPaddle (linha int) {
drawPixel (0, linha - (PADDLE_WIDTH * 2), PADDLE_WIDTH);
drawPixel (0, linha - PADDLE_WIDTH, PADDLE_WIDTH);
drawPixel (0, linha, PADDLE_WIDTH);
drawPixel (0, linha + PADDLE_WIDTH, PADDLE_WIDTH);
drawPixel (0, linha + (PADDLE_WIDTH + 2), PADDLE_WIDTH);
}

void erasePlayerPaddle (linha int) {
erasePixel (0, linha - (PADDLE_WIDTH * 2), PADDLE_WIDTH);
erasePixel (0, linha - PADDLE_WIDTH, PADDLE_WIDTH);
erasePixel (0, linha, PADDLE_WIDTH);
erasePixel (0, linha + PADDLE_WIDTH, PADDLE_WIDTH);
erasePixel (0, linha + (PADDLE_WIDTH + 2), PADDLE_WIDTH);
}

void drawAiPaddle (linha int) {
int coluna = resolução [0] - PADDLE_WIDTH;
drawPixel (coluna, linha - (PADDLE_WIDTH * 2), PADDLE_WIDTH);
drawPixel (coluna, linha - PADDLE_WIDTH, PADDLE_WIDTH);
drawPixel (coluna, linha, PADDLE_WIDTH);
drawPixel (coluna, linha + PADDLE_WIDTH, PADDLE_WIDTH);
drawPixel (coluna, linha + (PADDLE_WIDTH * 2), PADDLE_WIDTH);
}

void eraseAiPaddle (linha int) {
int coluna = resolução [0] - PADDLE_WIDTH;
erasePixel (coluna, linha - (PADDLE_WIDTH * 2), PADDLE_WIDTH);
erasePixel (coluna, linha - PADDLE_WIDTH, PADDLE_WIDTH);
erasePixel (coluna, linha, PADDLE_WIDTH);
erasePixel (coluna, linha + PADDLE_WIDTH, PADDLE_WIDTH);
erasePixel (coluna, linha + (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);
}