Η διεύθυνση email σας δεν θα δημοσιευθεί. τα απαιτούμενα πεδία είναι επισημασμένα *

#περιλαμβάνω
#περιλαμβάνω
#περιλαμβάνω
#περιλαμβάνω

#define SCREEN_WIDTH 128 // OLED πλάτος οθόνης, σε pixel
#define SCREEN_HEIGHT 64 // Ύψος οθόνης OLED, σε pixel
#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';
boolean inProgress = true;

// Prototipo das funcoes
void movePlayer ();
άκυρο moveAi ();
άκυρο drawScore ();
void 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 εσωτερικά
εάν (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Διεύθυνση 0x3D για 128x64
Serial.println (F ("Η εκχώρηση SSD1306 απέτυχε"));
Για (;;); // Μην προχωράτε, βρόχο για πάντα
}
display.display ();
καθυστέρηση (2000); // Παύση για 2 δευτερόλεπτα

// Διαγράψτε το buffer
display.clearDisplay ();
}

κενός βρόχος () {
if (aiScore> 3 || playerScore> 3) {// ελέγξτε την κατάσταση του παιχνιδιού
inProgress = false;

// κάποιος έχει κερδίσει
display.clearDisplay ();
display.setTextSize (4);
display.setTextColor (ΛΕΥΚΟ);
display.setCursor (0, 0); // μάθετε ποιος
εάν (aiScore> playerScore)
display.println ("ΧΑΣΕΤΕ!");
αλλιώς εάν (playerScore> aiScore)
display.println ("ΚΕΡΔΙΣΕΤΕ!");
}

εάν (σε εξέλιξη) {
διαγραφή βαθμολογίας ();
eraseBall (μπάλα [0], μπάλα [1]);

if (ballDirectionVerti == 'U') // μετακινήστε τη μπάλα προς τα πάνω διαγώνια
μπάλα [1] = μπάλα [1] - ΤΑΧΥΤΗΤΑ

if (ballDirectionVerti == 'D') // μετακινήστε τη μπάλα προς τα κάτω διαγώνια
μπάλα [1] = μπάλα [1] + SPEED;

if (μπάλα [1] = ανάλυση [1]) // αναπηδήστε την μπάλα από κάτω
ballDirectionVerti = 'U';

εάν (ballDirectionHori == 'R') {
μπάλα [0] = μπάλα [0] + SPEED; // μετακινήστε την μπάλα
if (μπάλα [0]> = (ανάλυση [0] - 6)) {// η μπάλα βρίσκεται στην άκρη AI της οθόνης
if ((aiPos + 12)> = μπάλα [1] && (aiPos - 12) (aiPos + 2)) // εκτροπή της μπάλας
ballDirectionVerti = 'D';
αλλιώς εάν (μπάλα [1] ballDirectionVerti = 'U';
αλλιώς // εκτρέψτε την μπάλα ευθεία
ballDirectionVerti = 'S';

ballDirectionHori = 'L'; // αλλαγή κατεύθυνσης μπάλας
} αλλιώς {// ΣΤΟΧΟΣ!
μπάλα [0] = 6; // μετακινήστε την μπάλα σε άλλη πλευρά της οθόνης
ballDirectionVerti = 'S'; // επαναφορά μπάλας σε ευθεία διαδρομή
μπάλα [1] = ανάλυση [1] / 2; // μετακινήστε τη μπάλα στο μέσο της οθόνης
++ βαθμολογία παίκτη // αύξηση σκορ παίκτη
}
}
}

εάν (ballDirectionHori == 'L') {
μπάλα [0] = μπάλα [0] - SPEED; // μετακινήστε την μπάλα
if (μπάλα [0] = μπάλα [1] && (playerPos - 12) (playerPos + 2)) // εκτροπή της μπάλας προς τα κάτω
ballDirectionVerti = 'D';
αλλιώς εάν (μπάλα [1] aiPos)
++ aiPos;
αλλιώς εάν (μπάλα [1] --aiPos;

drawAiPaddle (aiPos);
}

άκυρο drawScore () {// Draw AI και παίκτες
display.setTextSize (2);
display.setTextColor (ΛΕΥΚΟ);
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 διαστάσεις) {// Σχεδίαση ομάδας pixel
για (int x = 0; x για (int y = 0; y display.drawPixel ((posX + x), (posY + y), ΛΕΥΚΟ);
}

void erasePixel (int posX, int posY, int διαστάσεις) {// Διαγραφή ομάδας pixel
για (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 σειρά) {
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, ΛΕΥΚΟ);
}

void eraseBall (int x, int y) {
display.drawCircle (x, y, BALL_SIZE, ΜΑΥΡΟ);
}