Menu
CoddyTech
flag Ar iconالعربيةdown icon

سايمون: اللعبة كاملة

جزء من قسم المشاريع في رحلة Arduino على Coddy. الدرس 16 من 24.

تبدأ لعبة Simon الحقيقية صغيرة ثم تكبر. تعرض الجولة 1 لونًا واحدًا. في كل مرة تكرر فيها جولة بشكل صحيح، تحتفظ اللوحة بالألوان نفسها وتضيف لونًا في النهاية، إلى أن تخطئ.

تحتاج المصفوفة إلى مساحة تكفي للعبة طويلة، وإلى متغير length لتحديد مقدار المساحة المستخدمة منها. إضافة لون تتطلب سطرين:

sequence[length] = random(4);
length++;

هيّئ البذرة مرة واحدة، عند بدء اللعبة. تعرض playSequence() الآن length من الألوان بدلًا من أربعة، وتنتهي الجولة عندما تصل step إلى length.

ينهي الخطأ اللعبة بصوت لا يشبه نغمة بوضوح، بتردد 110 Hz لمدة ثانية واحدة، ويطبع النتيجة: عدد الجولات المكتملة، length - 1، لأن الجولة التي خسرتها لا تُحتسب.

تتسع المصفوفة لـ20 خانة، ويجب ألا يكتب البرنامج مطلقًا بعد نهايتها، لذا يفوز اللاعب الذي يكرر 20 لونًا.

challenge icon

التحدي

صعب

حوِّله إلى اللعبة كاملة:

  • const int MAX_STEPS = 20;، int sequence[MAX_STEPS]; وint length = 0;
  • تبدأ اللعبة بلون واحد؛ وكل جولة تُكرَّر بشكل صحيح تضيف لونًا واحدًا وتُشغِّل جميع الألوان
  • عند ارتكاب خطأ: 110 Hz لمدة 1000 ms، ثم اطبع Game over! Score: والنتيجة، وأنهِ اللعبة
  • عند تكرار 20 لونًا بشكل صحيح: اطبع You win! وأنهِ اللعبة

اضغط Run، وانظر إلى أي مدى ستصل، ثم اضغط Check.

جرّب بنفسك

// مدخل واحد لكل لون: الأحمر، الأخضر، الأزرق، الأصفر
const int ledPins[4] = {9, 10, 11, 12};
const int buttonPins[4] = {2, 3, 4, 5};
const int notes[4] = {262, 330, 392, 523};  // C وE وG وC العالية
const int buzzerPin = 8;

int lastState[4] = {HIGH, HIGH, HIGH, HIGH};  // آخر قراءة لكل زر

int sequence[4];       // الألوان التي تشغّلها اللوحة
bool playing = false;  // تبقى false حتى تبدأ ضغطةٌ اللعبة
int step = 0;          // عدد الألوان التي كرّرها اللاعب

// أضئ اللون i وشغّل نغمته.
void lightOn(int i) {
  digitalWrite(ledPins[i], HIGH);
  tone(buzzerPin, notes[i]);
}

// أطفئ اللون i وأوقف الصوت.
void lightOff(int i) {
  digitalWrite(ledPins[i], LOW);
  noTone(buzzerPin);
}

// شغّل التسلسل: كل لون لمدة 400 ms، ثم صمت لمدة 200 ms.
void playSequence() {
  delay(500);
  for (int i = 0; i < 4; i++) {
    lightOn(sequence[i]);
    delay(400);
    lightOff(sequence[i]);
    delay(200);
  }
}

// اختر تسلسلًا عشوائيًا جديدًا وشغّله.
void startGame() {
  randomSeed(micros());
  for (int i = 0; i < 4; i++) {
    sequence[i] = random(4);
  }
  playing = true;
  step = 0;
  playSequence();
}

// ترك اللاعب زر اللون i: هل هو اللون التالي في التسلسل؟
void checkPress(int i) {
  if (i != sequence[step]) {
    Serial.println("Wrong!");
    playing = false;
    return;
  }
  step++;
  if (step == 4) {
    Serial.println("Well done!");
    playing = false;
  }
}

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(ledPins[i], OUTPUT);
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < 4; i++) {
    int state = digitalRead(buttonPins[i]);
    if (state == LOW && lastState[i] == HIGH) {  // مضغوط
      lightOn(i);
    }
    if (state == HIGH && lastState[i] == LOW) {  // تم تحرير الزر
      lightOff(i);
      if (playing == false) {
        startGame();
      } else {
        checkPress(i);
      }
    }
    lastState[i] = state;
  }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المشاريع

تدرّب بنفسك: Playground لـ Arduino