لعبة سرعة الاستجابة: أفضل وقت
جزء من قسم المشاريع في رحلة Arduino على Coddy. الدرس 8 من 24.
يحتفظ البرنامج بأفضل وقت (الأقل) في متغير ويطبعه بعد كل جولة.
في البداية لا يوجد أفضل وقت بعد. استخدم قيمة لا يمكن أن تحققها أي جولة حقيقية، وهي 0، للدلالة على «لا يوجد وقت بعد». بعد كل جولة: إذا لم يكن هناك أفضل وقت بعد، أو إذا تفوق عليه وقت هذه الجولة، يصبح وقت هذه الجولة هو الأفضل الجديد.
if (best == 0 || reaction < best) {
best = reaction;
}
Serial.print("Best: ");
Serial.print(best);
Serial.println(" ms");ضع هذا في حالة LIT، حيث تنتهي الجولة بوقت حقيقي. لا تصل البداية الخاطئة إلى هذا الكود مطلقًا، لذا لا تصبح هي الرقم القياسي.
يُخزَّن أفضل وقت في ذاكرة اللوحة (RAM)، التي تُمسح عند انقطاع الطاقة: يستمر الرقم القياسي حتى تضغط على Run مجددًا.
التحدي
متوسطاحتفظ بسجل:
- متغير
best، قيمته 0 في البداية - بعد كل جولة موقّتة، إذا كانت قيمة
bestتساوي 0 أو كانت الجولة أسرع، فاحفظ الجولة باعتبارها الأفضل الجديدة - اطبعه بعد كل جولة بهذا الشكل:
Best: 250 ms - البدايات الخاطئة لا تغيّر شيئًا
اضغط Run، وحاول تحطيم أفضل وقت لك، ثم اضغط Check.
جرّب بنفسك
const int ledPin = 12;
const int buttonPin = 2;
// الحالات الثلاث للجولة
enum State { READY, WAITING, LIT };
State state = READY;
int lastButton = HIGH; // قراءة الزر في المرة السابقة
unsigned long waitStart = 0; // وقت بدء الانتظار
unsigned long waitTime = 0; // مدة هذا الانتظار
unsigned long litAt = 0; // وقت إضاءة LED
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Press the button to start");
}
void loop() {
int button = digitalRead(buttonPin);
bool pressed = (button == LOW && lastButton == HIGH); // تم الضغط للتو
lastButton = button;
unsigned long now = millis();
switch (state) {
case READY:
if (pressed) {
randomSeed(micros()); // وقت الضغط لا يتكرر أبدًا
waitTime = random(1000, 3001);
waitStart = now;
state = WAITING;
}
break;
case WAITING:
if (pressed) {
// تم الضغط قبل إضاءة المصباح: بداية خاطئة.
Serial.println("Too soon!");
state = READY;
} else if (now - waitStart >= waitTime) {
digitalWrite(ledPin, HIGH);
litAt = now;
state = LIT;
}
break;
case LIT:
if (pressed) {
digitalWrite(ledPin, LOW);
unsigned long reaction = now - litAt;
Serial.print("Reaction: ");
Serial.print(reaction);
Serial.println(" ms");
state = READY;
}
break;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المشاريع
2لعبة سرعة الاستجابة
لعبة سرعة الاستجابة: انتظار عشوائيلعبة سرعة الاستجابة: المؤقّتلعبة سرعة الاستجابة: انطلاق مبكرلعبة سرعة الاستجابة: أفضل وقتتدرّب بنفسك: Playground لـ Arduino