آموزش آردوینوپروژه های آردوینو

ساخت بازی تتریس با آردوینو و نمایشگر OLED

اگر به چالش کشیدن خود علاقه دارید، می توانید بازی تتریس را با استفاده از آردوینو و صفحه نمایش OLED بسازید. ایده ساخت بازی تتریس با استفاده از آردوینو و نمایشگر OLED ترسناک به نظر می رسد نگران نباشید. در بازی تتریس شما باید تترومینو ها را به بهترین شکل روی هم قرار بدهید تا دیرتر ببازید.

مدار بازی تتریس با آردوینو

برای این پروژه ابتدا شما باید صفحه نمایش OLED را با استفاده از ارتباط I2C به آردوینو نانو متصل کنید.

نمایشگر OLED SSD1306

  • GND – ولتاژ منفی
  • VCC – پایه تغذیه ولتاژ 3.3 یا 5 ولت
  • SCL Serial Clock – سیگنال انتقال ساعت
  • SDA Serial Data – سیگنال انتقال داده

به سادگی تعدادی پین از صفحه نمایش OLED را به پین های مربوطه در برد آردوینو نانو وصل کنید. باید آنها 4 دکمه فشاری را به چهار پایه ورودی دیجیتال روی برد نانو متصل کنید. این فرآیند ساده است. کافیست یک پایه از هر دکمه را به یک پایه ورودی دیجیتال روی نانو و پایه دیگر را به پایه GND نانو متصل کنید. سپس، بازر را به یک پین خروجی روی نانو وصل کنید.

مدار بازی تتریس با آردوینو

در نهایت، برای روشن کردن کل پروژه، یک باتری 9 ولتی را به پین Vin نانو (مثبت) و پایه GND نانو (منفی) وصل کنید.

قطعات مورد نیاز

  • آردوینو نانو
  • صفحه نمایش OLED
  • 4 دکمه فشاری
  • صدای زنگ
  • باتری 9 ولت

کد آردوینو برای بازی تتریس

در اینجا قسمت های مهم کد را توضیح میدهیم. کد کامل در فایل دانلودی انتهای صفحه قرار گرفته است.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

این خطوط شامل کتابخانه های لازم برای استفاده از نمایشگر OLED است.

#define WIDTH 64
#define HEIGHT 128

این خطوط عرض و ارتفاع نمایشگر OLED را بر حسب پیکسل مشخص می کنند.

Adafruit_SSD1306 display(128, 64, &Wire, -1);

این خط صفحه نمایش OLED را با عرض 128 پیکسل، ارتفاع 64 پیکسل، با استفاده از کتابخانه Wire برای برقراری ارتباط تنظیم میکند.

static const unsigned char PROGMEM mantex_logo [] = {
  0x00, 0x00, 0x18, 0x06, 0x01, 0xc0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, ……….
……… 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
  };

این کد تصویر لوگو است.

const char pieces_S_l[2][2][4] = {{
                                      {0, 0, 1, 1}, {0, 1, 1, 2}
                                    },
                                    {
                                      {0, 1, 1, 2}, {1, 1, 0, 0}
                                    }};

این یک آرایه سه بعدی است که شکل یک قطعه تترومینو را مشخص می کند. این آرایه شکل “S” را هنگامی که به سمت چپ می چرخد نشان می دهد. شاخص اول (2) تعداد چرخش های قطعه، شاخص دوم (2) تعداد ردیف ها و شاخص سوم (4) نشان دهنده تعداد ستون ها است. مقادیر موجود در این آرایه نشان دهنده موقعیت بلوک های درون قطعه است.

const char pieces_S_r[2][2][4]{{
                                    {1, 1, 0, 0}, {0, 1, 1, 2}
                                  },
                                  {
                                    {0, 1, 1, 2}, {0, 0, 1, 1}
                                  }};

این یک آرایه سه بعدی دیگر است که وقتی به سمت راست می چرخد، شکل “S” را نشان می دهد.

const char pieces_L_l[4][2][4] = {{
                                    {0, 0, 0, 1}, {0, 1, 2, 2}
                                  },
                                  {
                                    {0, 1, 2, 2}, {1, 1, 1, 0}
                                  },
                                  {
                                    {0, 1, 1, 1}, {0, 0, 1, 2}
                                  },
                                  {
                                    {0, 0, 1, 2}, {1, 0, 0, 0}
                                  }};

این آرایه سه بعدی شکل “L” را هنگامی که به سمت چپ می چرخد نشان می دهد.

const char pieces_Sq[1][2][4] = {{
                                    {0, 1, 0, 1}, {0, 0, 1, 1}
                                  }};

این آرایه سه بعدی شکل “مربع” را نشان می دهد که یک تترومینو با پیکربندی بلوک 2×2 است. فقط به یک چرخش نیاز دارد.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید
const char pieces_T[4][2][4] = {{
                                    {0, 0, 1, 0},{0, 1, 1, 2}
                                  },
                                  {
                                    {0, 1, 1, 2},{1, 0, 1, 1}
                                  },
                                  {
                                    {1, 0, 1, 1},{0, 1, 1, 2}
                                  },
                                  {
                                    {0, 1, 1, 2},{0, 0, 1, 0}
                                  }};

این آرایه سه بعدی شکل “T” را هنگامی که در هر یک از چهار جهت ممکن می چرخد، نشان می دهد.

const char pieces_l[2][2][4] = {{
                                    {0, 1, 2, 3}, {0, 0, 0, 0}
                                  },
                                  {
                                    {0, 0, 0, 0}, {0, 1, 2, 3}
                                  }};

این آرایه سه بعدی شکل “خط” را نشان می دهد که یک تترومینو 1×4 است. این شامل دو چرخش (افقی و عمودی) است.

  int left=11;
  int right=9;
  int change=12;
  int speed=10;

این خطوط چهار متغیر را تعریف می کنند: left, right, change, و speed.

این متغیر ها بعدا برای ارجاع به پین دکمه ها استفاده میشود.

  void checkLines(){
    boolean full;
    for(short y = 17; y >= 0; y--){
      full = true;
      for(short x = 0; x < 10; x++){
        full = full && grid[x][y];
      }
      if(full){
        breakLine(y);
        y++;
      }
    }
  }
  void breakLine(short line){
      tone(SPEAKER_PIN, erase[0], 1000 / erase_duration[0]); 
      delay(100);
      noTone(SPEAKER_PIN);
    for(short y = line; y >= 0; y--){
      for(short x = 0; x < 10; x++){
        grid[x][y] = grid[x][y-1];
      }
    }
    for(short x = 0; x < 10; x++){
      grid[x][0] = 0;
    }
    display.invertDisplay(true);
    delay(50);
    display.invertDisplay(false);
    score += 10;
  }

این کد تابع checkLines و breakLine را برای پاک کردن خطوط تکمیل شده در شبکه بازی پیاده سازی می کند.

checkLines در هر ردیف از شبکه از پایین به بالا تکرار می شود و بررسی می کند که آیا یک خط پر است (همه سلول ها اشغال شده اند) یا خیر. اگر اینطور باشد، تابع breakLine() را فراخوانی می کند و شماره خط را به عنوان پارامتر ارسال می کند تا آن خط را پاک کند.

breakLine ابتدا با استفاده از تابع tone() در پین مربوط به بازر، یک صدای “پاک کردن” را پخش می کند، که نشان می دهد یک خط پاک شده است. سپس تمام ردیف های بالای خط پاک شده را یک سلول به پایین جابجا می کند و ردیف بالایی را پاک می کند. همچنین 10 تا به امتیاز های کاربر اضافه میکند. در نهایت، نمایشگر را به مدت 50 میلی ثانیه معکوس می کند تا جلوه ای بصری از خط پاک شده ایجاد کند و سپس نمایشگر را به حالت عادی برمی گرداند.

void refresh(){
      display.clearDisplay();
      drawLayout();
      drawGrid();
      drawPiece(currentType, 0, pieceX, pieceY);
      display.display();
  }
  void drawGrid(){
    for(short x = 0; x < 10; x++)
      for(short y = 0; y < 18; y++)
        if(grid[x][y])
          display.fillRect(MARGIN_LEFT + (SIZE + 1)*x, MARGIN_TOP + (SIZE + 1)*y, SIZE, SIZE, WHITE);
  }

refresh(): این تابع نمایشگر را پاک می کند، طرح بندی را ترسیم می کند، شبکه را می کشد و در نهایت قطعه فعلی را روی نمایشگر می کشد.

drawGrid(): این تابع در کل شبکه تکرار می شود و اگر یک سلول پر شود، یک مستطیل سفید به اندازه سلول رسم می کند.

در این پروژه نحوه ساخت یک بازی تتریس با استفاده از آردوینو و نمایشگر OLED 128×64 را دیدیم. ما از زبان C++ و Arduino IDE برای برنامه نویسی بازی استفاده کرده ایم.

ما با تنظیم سخت افزار شامل نمایشگر، دکمه ها و بازر شروع کردیم و سپس منطق بازی را تعریف کردیم. ما از یک شبکه برای نمایش صفحه بازی استفاده کردیم و هفت شکل تترومینو را به عنوان آرایه تعریف کردیم. ما همچنین توابعی برای تولید و چرخاندن قطعات، بررسی برخوردها و به روز رسانی صفحه بازی ایجاد کردیم.

در نهایت با استفاده از نمایشگر OLED یک رابط کاربری ساده برای بازی ایجاد کردیم. ما امتیاز فعلی و قطعه بعدی را که ظاهر می شود را هم در صفحه نمایش میدهیم.

موارد موجود در فایل : سورس کامل

3 (2 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *