Menu
CoddyTech

משחק תגובה: התחלה מוקדמת

חלק מהיחידה פרויקטים במסלול ה-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) הלוח לא היה יכול לזהות את הלחיצה הזאת כלל.

challenge icon

אתגר

בינוני

זהי התחלות שווא:

  • במצב WAITING, לחיצה מדפיסה Too soon! וחוזרת ל-READY בלי להדליק את ה-LED
  • כל השאר נשאר כפי שהוא: הלחיצה הבאה מתחילה סיבוב חדש

לחצי על 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 (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;
  }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה פרויקטים

תרגלו בעצמכם: Arduino אונליין