🐍 ماموریت ۹۹: بازی مار روی ماتریس

جوی‌استیک VRx→A0، VRy→A1؛ ماتریس روی D12/D11/D10. مختصات مار را در دو آرایه نگه دار، سر را جلو ببر و بدن را دنبالش جابه‌جا کن.

سطح: چالشی ⭐⭐⭐ · مود: آردوینو — با کد

هدف‌ها

قطعه‌های لازم

▶ همین ماموریت را در شبیه‌ساز امتحان کن
💡 گیر کردی؟ داخل شبیه‌ساز راهنما را ببین، و اگر باز هم نشد دکمه‌ی «برام حلش کن» مدار را برایت می‌چیند تا ببینی چطور کار می‌کند.

جواب کامل

اول خودت امتحان کن! بعد جواب را ببین 👀

سیم‌کشی

  1. Arduino Uno (VCC5) ⟷ LED Matrix 8×8 (MAX7219) (VCC)
  2. LED Matrix 8×8 (MAX7219) (GND) ⟷ Arduino Uno (GND1)
  3. Arduino Uno (D12) ⟷ LED Matrix 8×8 (MAX7219) (DIN)
  4. Arduino Uno (D10) ⟷ LED Matrix 8×8 (MAX7219) (CS)
  5. Arduino Uno (D11) ⟷ LED Matrix 8×8 (MAX7219) (CLK)
  6. Arduino Uno (VCC5) ⟷ جوی‌استیک (VCC)
  7. جوی‌استیک (GND) ⟷ Arduino Uno (GND2)
  8. Arduino Uno (A0) ⟷ جوی‌استیک (VRX)
  9. Arduino Uno (A1) ⟷ جوی‌استیک (VRY)

کد

// Snake on the 8x8 matrix, steered with the joystick
#include <LedControl.h>

LedControl lc(12, 11, 10, 1);
int sx[64];
int sy[64];
int len = 3;
int dx = 1;
int dy = 0;
int fx = 5;
int fy = 5;

void newFood() {
  fx = random(8);
  fy = random(8);
}

void setup() {
  lc.shutdown(0, false);
  lc.setIntensity(0, 5);
  randomSeed(analogRead(A2));
  for (int i = 0; i < len; i++) { sx[i] = 2 - i; sy[i] = 3; }
}

void loop() {
  int jx = analogRead(A0);
  int jy = analogRead(A1);
  if (jx < 300 && dx == 0) { dx = -1; dy = 0; }
  if (jx > 700 && dx == 0) { dx = 1; dy = 0; }
  if (jy < 300 && dy == 0) { dx = 0; dy = -1; }
  if (jy > 700 && dy == 0) { dx = 0; dy = 1; }

  for (int i = len - 1; i > 0; i--) { sx[i] = sx[i - 1]; sy[i] = sy[i - 1]; }
  sx[0] = (sx[0] + dx + 8) % 8;   // wrap around the edges
  sy[0] = (sy[0] + dy + 8) % 8;

  for (int i = 1; i < len; i++) {
    if (sx[i] == sx[0] && sy[i] == sy[0]) len = 3;   // bit yourself: start again
  }
  if (sx[0] == fx && sy[0] == fy) {
    if (len < 64) { sx[len] = sx[len - 1]; sy[len] = sy[len - 1]; len++; }
    newFood();
  }

  lc.clearDisplay(0);
  for (int i = 0; i < len; i++) lc.setLed(0, sy[i], sx[i], true);
  lc.setLed(0, fy, fx, (millis() / 200) % 2);   // food blinks
  delay(250);
}

ماموریت‌های مشابه

🥤

ماموریت ۹۸: دستگاه فروش خودکار

🗂️

ماموریت ۱۰۰: ثبت دما روی کارت SD

🛗

ماموریت ۹۷: آسانسور با ماشین حالت

🌞

ماموریت ۹۶: ردیاب خورشید

📚 برای یاد گرفتن پایه‌ها سری به دوره‌ی آموزش آردوینو بزن · 🎯 همه‌ی ماموریت‌ها