🐍 درس 97: بازی مار روی ماتریس LED

جوی‌استیک + MAX7219: آرایه مثل صف، غذا و پایان بازی.

سطح: پیشرفته · زمان: حدود 24 دقیقه · مفاهیم: بازی، آرایه، MAX7219، جوی‌استیک

قدم‌های این درس

  1. چرا؟ بازی مار یک درس برنامه‌نویسی است
  2. قدم ۱ — مدار
  3. قدم ۲ — کد: صف، حرکت، غذا
  4. اشتباه رایج: سطر و ستون جابه‌جا
  5. چالش: غذای درست و سرعت بیشتر

نمونه‌ای از کد این درس

// بازی مار روی ماتریس ۸×۸ با جوی‌استیک
#include <LedControl.h>

LedControl lc = LedControl(12, 11, 10, 1);   // DIN, CLK, CS, 1 matrix
int sx[64];          // x of every body part, [0] = head
int sy[64];
int len = 3;
int dx = 1, dy = 0;  // direction
int fx = 5, fy = 2;  // food
bool over = false;
unsigned long last = 0;

void restart() {
  len = 3; dx = 1; dy = 0; over = false;
  for (int i = 0; i < 3; i++) { sx[i] = 2 - i; sy[i] = 4; }
  fx = random(8); fy = random(8);
}

void draw() {
  lc.clearDisplay(0);
  for (int i = 0; i < len; i++) lc.setLed(0, sy[i], sx[i], true);
  lc.setLed(0, fy, fx, true);
}

void setup() {
  lc.shutdown(0, false);       // MAX7219 starts asleep
  lc.setIntensity(0, 5);
  pinMode(2, INPUT_PULLUP);    // joystick switch = restart
  randomSeed(analogRead(A2));
  Serial.begin(9600);
  restart();
}

void loop() {
  int x = analogRead(A0), y = analogRead(A1);
  if (x < 300 && dx == 0) { dx = -1; dy = 0; }       // no instant U-turn
  else if (x > 700 && dx == 0) { dx = 1; dy = 0; }
  else if (y < 300 && dy == 0) { dx = 0; dy = -1; }
  else if (y > 700 && dy == 0) { dx = 0; dy = 1; }

  if (over) { if (digitalRead(2) == LOW) restart(); return; }
  if (millis() - last < 300) return;
  last = millis();

  int nx = sx[0] + dx, ny = sy[0] + dy;
  bool hit = nx < 0 || nx > 7 || ny < 0 || ny > 7;
  for (int i = 0; i < len; i++) if (sx[i] == nx && sy[i] == ny) hit = true;
  if (hit) { over = true; Serial.print("game over! emtiaz: "); Serial.println(len - 3); return; }

  bool ate = nx == fx && ny == fy;
  if (ate && len < 64) len++;
  for (int i = len - 1; i > 0; i--) { sx[i] = sx[i - 1]; sy[i] = sy[i - 1]; }
  sx[0] = nx; sy[0] = ny;          // the queue moves: new head in, tail out
  if (ate) { fx = random(8); fy = random(8); }
  draw();
}

چرا این درس؟

دوره‌ی تینکرکد فارسی تعاملی است: هر قدم را خودت داخل شبیه‌ساز انجام می‌دهی — مدار واقعی می‌چینی، کد واقعی اجرا می‌کنی و نتیجه را همان لحظه می‌بینی. این درس روی درس‌های قبلی ساخته شده، پس اگر تازه شروع کرده‌ای از درس ۱ بیا!

این درس را رایگان در شبیه‌ساز شروع کن 🎓

درس‌های دیگر دوره

🚨

درس 96: سیستم امنیتی کامل

💾

درس 98: ثبت داده روی کارت حافظه