سايمون: كرّر النمط
جزء من قسم المشاريع في رحلة Arduino على Coddy. الدرس 15 من 24.
بعد أن يعزف اللوح، يحين دورك: كرّر الألوان الأربعة بالترتيب نفسه. يحتاج البرنامج إلى رقم إضافي، step، يحسب عدد الألوان التي كررتها حتى الآن. اللون الذي يجب أن تضغطه بعد ذلك هو sequence[step].
احتسب الضغطة عند إفلات الزر، كما تفعل اللعبة بالفعل عند البدء. عندها يكون ضوؤه ونغمته قد انطفآ، ويمكن للبرنامج أن يستجيب بسهولة:
void checkPress(int i) {
if (i != sequence[step]) {
Serial.println("Wrong!");
playing = false;
return;
}
step++;
if (step == 4) {
Serial.println("Well done!");
playing = false;
}
}تنهي return تنفيذ الدالة فورًا، لذا لا يُنفَّذ أي شيء بعدها عند اختيار لون خاطئ. إن إعادة playing إلى false تنهي اللعبة، وتبدأ اللعبة من جديد عند الضغطة التالية.
يجب أن يبدأ العد من البداية في كل لعبة جديدة: عيّن step = 0 في startGame().
التحدي
صعبدع اللاعب يجيب:
- متغير
int step = 0;، يُعاد ضبطه إلى 0 فيstartGame() - عند ترك الزر، وإذا كانت اللعبة
playing، استدعِcheckPress(i) - تطبع الإجابة بلون خاطئ
Wrong!وتنهي اللعبة - بعد أربعة ألوان صحيحة، اطبع
Well done!وأنهِ اللعبة
ابدأ Serial في setup(). اضغط 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 حتى تبدأ ضغطةٌ اللعبة
// أضئ اللون 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;
playSequence();
}
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(ledPins[i], OUTPUT);
pinMode(buttonPins[i], INPUT_PULLUP);
}
}
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();
}
}
lastState[i] = state;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المشاريع
تدرّب بنفسك: Playground لـ Arduino