لن يتم نشر عنوان بريدك الإلكتروني. الحقول المطلوبة معلمة *

#تتضمن
#تتضمن
#تتضمن
#تتضمن

#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}
، ball [2] = {20، (Resolution [1] / 2)} ؛
القيمة الصحيحة 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 = true ؛

// Prototipo das funcoes
movePlayer باطل () ؛
moveAi باطلة () ؛
drawScore باطلة () ؛
eraseScore باطلة () ؛
الفراغ drawNet () ؛
الفراغ drawPixel (int posX ، int posY ، int int) ؛
إفراغ erasePixel (int posX ، int posY ، int int) ؛
إفراغ drawPlayerPaddle (الصف الدولي) ؛
إفراغ erasePlayerPaddle (الصف الدولي) ؛

instagram viewer

الفراغ drawAiPaddle (الصف الدولي) ؛
eraseAiPaddle باطل (الصف الدولي) ؛
الفراغ drawBall (int x، int y) ؛
vase eraseBall (int x، int y) ؛

الإعداد باطل() {
Serial.begin (9600) ؛

// SSD1306_SWITCHCAPVCC = توليد جهد عرض من 3.3 فولت داخليًا
if (! display.begin (SSD1306_SWITCHCAPVCC، 0x3C)) {// العنوان 0x3D لـ 128x64
Serial.println (F ("فشل تخصيص SSD1306")) ؛
إلى عن على (؛؛)؛ // لا تتابع ، التكرار إلى الأبد
}
display.display () ؛
تأخير (2000) ؛ // وقفة لمدة ثانيتين

// امسح المخزن المؤقت
display.clearDisplay () ؛
}

حلقة فارغة() {
if (aiScore> 3 || playerScore> 3) {// check game state
inProgress = false ؛

// فاز شخص ما
display.clearDisplay () ؛
display.setTextSize (4) ؛
display.setTextColor (WHITE) ؛
display.setCursor (0، 0) ؛ // معرفة من
إذا (aiScore> playerScore)
display.println ("YOU LOSE!") ؛
آخر إذا (playerScore> aiScore)
display.println ("أنت تربح!") ؛
}

if (inProgress) {
eraseScore () ؛
eraseBall (الكرة [0] ، الكرة [1]) ؛

إذا (ballDirectionVerti == 'U') // حرك الكرة لأعلى قطريًا
الكرة [1] = الكرة [1] - السرعة ؛

إذا (ballDirectionVerti == 'D') // حرك الكرة لأسفل قطريًا
كرة [1] = كرة [1] + سرعة ؛

إذا (الكرة [1] = الدقة [1]) // ترتد الكرة من أسفل
ballDirectionVerti = 'U' ،

if (ballDirectionHori == 'R') {
الكرة [0] = الكرة [0] + السرعة ؛ // تحريك الكرة
إذا كانت (الكرة [0]> = (الدقة [0] - 6)) {// الكرة في حافة الذكاء الاصطناعي للشاشة
if ((aiPos + 12)> = ball [1] && (aiPos - 12) (aiPos + 2)) // تنحرف الكرة لأسفل
ballDirectionVerti = 'D' ،
آخر إذا (الكرة [1] ballDirectionVerti = 'U' ،
آخر // ينحرف الكرة مباشرة
ballDirectionVerti = 'S' ،

ballDirectionHori = 'L' ، // تغيير اتجاه الكرة
} آخر {// GOAL!
الكرة [0] = 6 ؛ // حرك الكرة إلى الجانب الآخر من الشاشة
ballDirectionVerti = 'S' ، // إعادة تعيين الكرة للسفر المستقيم
الكرة [1] = القرار [1] / 2 ؛ // حرك الكرة إلى منتصف الشاشة
++ playerScore ؛ // زيادة نقاط اللاعب
}
}
}

if (ballDirectionHori == 'L') {
الكرة [0] = الكرة [0] - السرعة ؛ // تحريك الكرة
if (ball [0] = ball [1] && (playerPos - 12) (playerPos + 2)) // ينحرف الكرة لأسفل
ballDirectionVerti = 'D' ،
آخر إذا (الكرة [1] aiPos)
++ aiPos ؛
آخر إذا (الكرة [1] --aiPos ؛

drawAiPaddle (aiPos) ؛
}

void drawScore () {// Draw AI and عشرات اللاعب
display.setTextSize (2) ؛
display.setTextColor (WHITE) ؛
display.setCursor (45، 0) ؛
display.println (playerScore) ؛

display.setCursor (75، 0) ؛
display.println (aiScore) ؛
}

vase eraseScore () {// مسح نتائج AI واللاعبين
display.setTextSize (2) ؛
display.setTextColor (BLACK) ؛
display.setCursor (45، 0) ؛
display.println (playerScore) ؛

display.setCursor (75، 0) ؛
display.println (aiScore) ؛
}

الفراغ drawNet () {// رسم حقل الخط
for (int i = 0؛ i drawPixel (((Resolution [0] / 2) - 1)، i * (WALL_WIDTH) + (WALL_WIDTH * i)، WALL_WIDTH) ؛
}

void drawPixel (int posX، int posY، int الأبعاد) {// Draw group of pixels
من أجل (int x = 0؛ س for (int y = 0؛ ذ display.drawPixel ((posX + x) ، (posY + y) ، أبيض) ؛
}

vase erasePixel (int posX، int posY، int الأبعاد) {// Erase group of pixels
من أجل (int x = 0؛ س for (int y = 0؛ ذ display.drawPixel ((posX + x) ، (posY + y) ، أسود) ؛
}

الفراغ drawPlayerPaddle (الصف الدولي) {
drawPixel (0 ، الصف - (PADDLE_WIDTH * 2) ، PADDLE_WIDTH) ؛
drawPixel (0 ، row - PADDLE_WIDTH ، PADDLE_WIDTH) ؛
drawPixel (0 ، row ، PADDLE_WIDTH) ؛
drawPixel (0 ، row + PADDLE_WIDTH ، PADDLE_WIDTH) ؛
drawPixel (0 ، row + (PADDLE_WIDTH + 2) ، PADDLE_WIDTH) ؛
}

vase erasePlayerPaddle (الصف الدولي) {
erasePixel (0 ، الصف - (PADDLE_WIDTH * 2) ، PADDLE_WIDTH) ؛
erasePixel (0 ، الصف - PADDLE_WIDTH ، PADDLE_WIDTH) ؛
erasePixel (0 ، row ، PADDLE_WIDTH) ؛
erasePixel (0 ، row + PADDLE_WIDTH ، PADDLE_WIDTH) ؛
erasePixel (0 ، row + (PADDLE_WIDTH + 2) ، PADDLE_WIDTH) ؛
}

الفراغ drawAiPaddle (الصف الدولي) {
العمود int = Resolution [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) ؛
}

vase eraseAiPaddle (الصف الدولي) {
العمود int = Resolution [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) ؛
}

vase eraseBall (int x، int y) {
display.drawCircle (x ، y ، BALL_SIZE ، أسود) ؛
}