Vaš e-poštni naslov ne bo objavljen. Obvezna polja so označena *
#include
#include
#include
#include
#define SCREEN_WIDTH 128 // OLED širina zaslona, v slikovnih pikah
#define SCREEN_HEIGHT 64 // OLED višina zaslona, v slikovnih pikah
#define OLED_RESET 4 // Ponastavite pin # (ali -1, če delite pin za ponastavitev Arduino)
Zaslon Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, & Wire, OLED_RESET); // Izjava za zaslon SSD1306, priključen na I2C (SDA, SCL zatiči)
int ločljivost [2] = {SCREEN_WIDTH, SCREEN_HEIGHT}
, kroglica [2] = {20, (ločljivost [1] / 2)};
const int PIXEL_SIZE = 8
, WALL_WIDTH = 4
, PADDLE_WIDTH = 4
, BALL_SIZE = 4
, HITROST = 3;
int playerScore = 0
, aiScore = 0
, playerPos = 0
, aiPos = 0;
char ballDirectionHori = 'R'
, ballDirectionVerti = 'S';
boolov inProgress = res;
// Prototipo das funcoes
void movePlayer ();
nična potezaAi ();
neveljaven izvleček ();
neveljaven eraseScore ();
void drawNet ();
void drawPixel (int posX, int posY, int mere);
void erasePixel (int posX, int posY, int mere);
void drawPlayerPaddle (int vrstica);
void erasePlayerPaddle (vrstica int);
void drawAiPaddle (int vrstica);
void eraseAiPaddle (int vrstica);
void drawBall (int x, int y);
void eraseBall (int x, int y);
nična namestitev () {
Serial.begin (9600);
// SSD1306_SWITCHCAPVCC = ustvari prikazno napetost od 3.3V znotraj
if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Naslov 0x3D za 128x64
Serial.println (F ("dodelitev SSD1306 ni uspela"));
za (;;); // Ne nadaljujte, zanke večno
}
display.display ();
zamuda (2000); // Premor 2 sekundi
// Počistite medpomnilnik
display.clearDisplay ();
}
void loop () {
če (aiScore> 3 || playerScore> 3) {// preverite stanje igre
inProgress = napačno;
// nekdo je zmagal
display.clearDisplay ();
display.setTextSize (4);
display.setTextColor (WHITE);
display.setCursor (0, 0); // ugotoviti, kdo
če (aiScore> playerScore)
display.println ("VAS IZGUBI!");
drugače če (playerScore> aiScore)
display.println ("DOBIŠ!");
}
če (inProgress) {
eraseScore ();
eraseBall (kroglica [0], kroglica [1]);
if (ballDirectionVerti == 'U') // premaknite kroglico diagonalno
kroglica [1] = kroglica [1] - HITROST;
če (ballDirectionVerti == 'D') // premakne žogo diagonalno
kroglica [1] = kroglica [1] + HITROST;
če (žoga [1] = ločljivost [1]) // odbije žogo s spodnje strani
ballDirectionVerti = 'U';
če (ballDirectionHori == 'R') {
žoga [0] = žoga [0] + HITROST; // premakniti žogo
če (kroglica [0]> = (ločljivost [0] - 6)) {// krogla je na AI robu zaslona
če ((aiPos + 12)> = kroglica [1] && (aiPos - 12) (aiPos + 2)) // odkloni žogo navzdol
ballDirectionVerti = 'D';
sicer, če (kroglica [1] ballDirectionVerti = 'U';
drugo // odbiti žogo naravnost
ballDirectionVerti = 'S';
ballDirectionHori = 'L'; // spremeni smer kroglice
} else {// CILJ!
žoga [0] = 6; // premaknite žogo na drugo stran zaslona
ballDirectionVerti = 'S'; // ponastavite kroglico na ravno vožnjo
kroglica [1] = ločljivost [1] / 2; // premakni žogo na sredino zaslona
++ playerScore; // povečati rezultat igralca
}
}
}
če (ballDirectionHori == 'L') {
žoga [0] = žoga [0] - HITROST; // premakniti žogo
if (žoga [0] = žoga [1] && (playerPos - 12) (playerPos + 2)) // odkloni žogo navzdol
ballDirectionVerti = 'D';
drugače če (kroglica [1] aiPos)
++ aiPos;
drugače če (kroglica [1]
drawAiPaddle (aiPos);
}
void drawScore () {// Izžreba AI in rezultate igralcev
display.setTextSize (2);
display.setTextColor (WHITE);
prikaz.setCursor (45, 0);
display.println (playerScore);
prikaz.setCursor (75, 0);
display.println (aiScore);
}
void eraseScore () {// Izbriši AI in rezultate igralcev
display.setTextSize (2);
display.setTextColor (ČRNI);
prikaz.setCursor (45, 0);
display.println (playerScore);
prikaz.setCursor (75, 0);
display.println (aiScore);
}
void drawNet () {// Polje za risanje črte
za (int i = 0; i drawPixel ((((ločljivost [0] / 2) - 1), i * (WALL_WIDTH) + (WALL_WIDTH * i), WALL_WIDTH);
}
void drawPixel (int posX, int posY, int dimenzije) {// Narišite skupino pik
za (int x = 0; x
}
void erasePixel (int posX, int posY, int dimenzije) {// Izbriši skupino pik
za (int x = 0; x
}
void drawPlayerPaddle (int vrstica) {
drawPixel (0, vrstica - (PADDLE_WIDTH * 2), PADDLE_WIDTH);
drawPixel (0, vrstica - PADDLE_WIDTH, PADDLE_WIDTH);
drawPixel (0, vrstica, PADDLE_WIDTH);
drawPixel (0, vrstica + PADDLE_WIDTH, PADDLE_WIDTH);
drawPixel (0, vrstica + (PADDLE_WIDTH + 2), PADDLE_WIDTH);
}
void erasePlayerPaddle (int vrstica) {
erasePixel (0, vrstica - (PADDLE_WIDTH * 2), PADDLE_WIDTH);
erasePixel (0, vrstica - PADDLE_WIDTH, PADDLE_WIDTH);
erasePixel (0, vrstica, PADDLE_WIDTH);
erasePixel (0, vrstica + PADDLE_WIDTH, PADDLE_WIDTH);
erasePixel (0, vrstica + (PADDLE_WIDTH + 2), PADDLE_WIDTH);
}
void drawAiPaddle (int vrstica) {
int stolpec = ločljivost [0] - PADDLE_WIDTH;
drawPixel (stolpec, vrstica - (PADDLE_WIDTH * 2), PADDLE_WIDTH);
drawPixel (stolpec, vrstica - PADDLE_WIDTH, PADDLE_WIDTH);
drawPixel (stolpec, vrstica, PADDLE_WIDTH);
drawPixel (stolpec, vrstica + PADDLE_WIDTH, PADDLE_WIDTH);
drawPixel (stolpec, vrstica + (PADDLE_WIDTH * 2), PADDLE_WIDTH);
}
void eraseAiPaddle (int vrstica) {
int stolpec = ločljivost [0] - PADDLE_WIDTH;
erasePixel (stolpec, vrstica - (PADDLE_WIDTH * 2), PADDLE_WIDTH);
erasePixel (stolpec, vrstica - PADDLE_WIDTH, PADDLE_WIDTH);
erasePixel (stolpec, vrstica, PADDLE_WIDTH);
erasePixel (stolpec, vrstica + PADDLE_WIDTH, PADDLE_WIDTH);
erasePixel (stolpec, vrstica + (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);
}