🎮 بازی سایمون — حافظهات را با آردوینو بسنج
سایمون یک بازی حافظهی کلاسیک است: دستگاه یک دنبالهی رنگ نشان میدهد و تو باید همان را تکرار کنی. هر دور یک رنگ به دنباله اضافه میشود.
این بهترین پروژه برای تمرین آرایه، حلقه و حالت بازی است.
قطعات
چهار LED با رنگ متفاوت، چهار دکمه، یک بازر، و مقاومتها.
منطق بازی
- یک رنگ تصادفی به دنباله اضافه کن.
- کل دنباله را با نور و صدا پخش کن.
- منتظر بمان بازیکن همان تعداد دکمه بزند.
- اگر همه درست بود، به مرحلهی بعد؛ وگرنه باخت.
کد
const int leds[] = {2, 3, 4, 5};
const int btns[] = {8, 9, 10, 11};
const int tones[] = {262, 330, 392, 523};
const int buzzer = 12;
int sequence[50];
int level = 0;
void play(int i) {
digitalWrite(leds[i], HIGH);
tone(buzzer, tones[i]);
delay(350);
digitalWrite(leds[i], LOW);
noTone(buzzer);
delay(120);
}
int waitForPress() {
while (true) {
for (int i = 0; i < 4; i++) {
if (digitalRead(btns[i]) == LOW) {
play(i);
while (digitalRead(btns[i]) == LOW) { } // تا رها شود
return i;
}
}
}
}
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(leds[i], OUTPUT);
pinMode(btns[i], INPUT_PULLUP);
}
randomSeed(analogRead(A0));
}
void loop() {
sequence[level] = random(0, 4); // رنگ جدید
level++;
for (int i = 0; i < level; i++) { // پخش دنباله
play(sequence[i]);
}
for (int i = 0; i < level; i++) { // نوبت بازیکن
if (waitForPress() != sequence[i]) {
tone(buzzer, 120, 700); // باخت
delay(1500);
level = 0;
return;
}
}
delay(700);
}
چرا منتظر رها شدن دکمه میمانیم؟
بدون آن حلقه، یک فشار طولانی مثل چند فشار پشت سر هم خوانده میشود و بازی بلافاصله میبازد. این همان مشکل «دیبانس» است با یک راهحل ساده.
قدم بعدی
سرعت پخش را با بالا رفتن مرحله کم کن تا بازی سختتر شود، و رکورد بالاترین مرحله را در EEPROM ذخیره کن تا با قطع برق نپرد.
بازی سایمون را بساز 🎮