כתובת האימייל שלך לא תפורסם. שדות חובה מסומנים *
# כלול
# כלול
# כלול
# כלול
# הגדר SCREEN_WIDTH 128 // רוחב תצוגה של OLED, בפיקסלים
# הגדר SCREEN_HEIGHT 64 // גובה התצוגה של OLED, בפיקסלים
# הגדר 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
, מהירות = 3;
int playerScore = 0
, aiScore = 0
, playerPos = 0
, aiPos = 0;
char ballDirectionHori = 'R'
, ballDirectionVerti = 'S';
inProgress בוליאני = נכון;
// פרוטוטיפו דאס פונקציות
void movePlayer ();
move voiAi ();
void drawScore ();
void eraseScore ();
void drawNet ();
פיקסל חלל ריק (int posX, int posY, int מימדים);
void erasePixel (int posX, int posY, int ממדים);
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.3 וולט באופן פנימי
אם (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// כתובת 0x3D עבור 128x64
Serial.println (F ("הקצאת SSD1306 נכשלה"));
ל (;;); // אל תמשיך, לולאה לנצח
}
display.display ();
עיכוב (2000); // עצרו למשך 2 שניות
// נקה את המאגר
display.clearDisplay ();
}
לולאת חלל () {
אם (aiScore> 3 || playerScore> 3) {// בדוק את מצב המשחק
inProgress = שקר;
// מישהו ניצח
display.clearDisplay ();
display.setTextSize (4);
display.setTextColor (לבן);
display.set סמן (0, 0); // להבין מי
אם (aiScore> playerScore)
display.println ("אתה מאבד!");
אחר אם (playerScore> aiScore)
display.println ("אתה מנצח!");
}
אם (inProgress) {
למחוקcore ();
למחוק את הכדור (כדור [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'; // לשנות כיוון כדור
} עוד {// יעד!
כדור [0] = 6; // העבר כדור לצד השני של המסך
ballDirectionVerti = 'S'; // לאפס את הכדור לנסיעות ישר
כדור [1] = רזולוציה [1] / 2; // העבר כדור לאמצע המסך
++ playerScore; // הגדלת ציון השחקן
}
}
}
אם (ballDirectionHori == 'L') {
כדור [0] = כדור [0] - מהירות; // להזיז כדור
אם (כדור [0] = כדור [1] && (playerPos - 12) (playerPos + 2)) // להסיט את הכדור למטה
ballDirectionVerti = 'D';
אחר אם (כדור [1] aiPos)
++ aiPos;
אחר אם (כדור [1]
drawAiPaddle (aiPos);
}
void drawScore () {// Draw AI וציוני שחקן
display.setTextSize (2);
display.setTextColor (לבן);
display.set סמן (45, 0);
display.println (playerScore);
תצוגה.סמן (75, 0);
display.println (aiScore);
}
void eraseScore () {// מחק AI וציוני שחקנים
display.setTextSize (2);
display.setTextColor (שחור);
display.set סמן (45, 0);
display.println (playerScore);
תצוגה.סמן (75, 0);
display.println (aiScore);
}
void drawNet () {// Draw field line
עבור (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.draw פיקסל ((posX + x), (posY + y), לבן);
}
void erasePixel (int posX, int posY, int מימדים) {// מחק קבוצת פיקסלים
עבור (int x = 0; x עבור (int y = 0; y display.draw פיקסל ((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 (שורה בשורה) {
למחוק פיקסל (0, שורה - (PADDLE_WIDTH * 2), PADDLE_WIDTH);
מחק פיקסל (0, שורה - PADDLE_WIDTH, PADDLE_WIDTH);
למחוק פיקסל (0, שורה, PADDLE_WIDTH);
למחוק פיקסל (0, שורה + PADDLE_WIDTH, PADDLE_WIDTH);
למחוק פיקסל (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;
למחוק פיקסל (עמודה, שורה - (PADDLE_WIDTH * 2), PADDLE_WIDTH);
למחוק פיקסל (עמודה, שורה - PADDLE_WIDTH, PADDLE_WIDTH);
למחוק פיקסל (עמודה, שורה, PADDLE_WIDTH);
למחוק פיקסל (עמודה, שורה + PADDLE_WIDTH, PADDLE_WIDTH);
למחוק פיקסל (עמודה, שורה + (PADDLE_WIDTH * 2), PADDLE_WIDTH);
}
חלל ריק מאזן (int x, int y) {
display.draw מעגל (x, y, BALL_SIZE, לבן);
}
void eraseBall (int x, int y) {
display.draw מעגל (x, y, BALL_SIZE, שחור);
}