لعبة سرعة الاستجابة: انطلاق مبكر
جزء من قسم المشاريع في رحلة Arduino على Coddy. الدرس 7 من 24.
يمكن للاعب الذكي الآن أن يغش: يضغط مرارًا أثناء الانتظار، فتأتي إحدى الضغطات مباشرة بعد إضاءة المصباح. للسباقات قاعدة بشأن هذا: التحرك قبل الإشارة يُعد انطلاقة خاطئة، ويُلغى السباق.
تعرف آلة الحالات بالفعل متى يكون اللاعب متعجلًا جدًا: عند أي ضغطة في الحالة WAITING. ابحث عن ذلك هناك، قبل التحقق من الساعة:
case WAITING:
if (pressed) {
Serial.println("Too soon!");
state = READY;
} else if (millis() - waitStart >= waitTime) {
// أضئ مصباح LED، كما فعلت من قبل
}
break;العودة إلى READY تنهي الجولة: لا يضيء مصباح LED أبدًا، وتبدأ الضغطة التالية لعبة جديدة بانتظار عشوائي جديد. مع delay(waitTime) لم يكن بإمكان اللوحة رصد هذه الضغطة إطلاقًا.
التحدي
متوسطاكتشف الضغطات المبكرة:
- في
WAITING، تؤدي الضغطة إلى طباعةToo soon!والعودة إلىREADYدون إضاءة LED - يبقى كل شيء آخر كما هو: تبدأ الضغطة التالية جولة جديدة
اضغط على تشغيل، وجرّب الضغط مرتين بسرعة، ثم اضغط على تحقّق.
جرّب بنفسك
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 (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