משחק תגובה: התחלה מוקדמת
חלק מהיחידה פרויקטים במסלול ה-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 - כל השאר נשאר כפי שהוא: הלחיצה הבאה מתחילה סיבוב חדש
לחצי על 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;
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה פרויקטים
2משחק תגובה
משחק תגובה: המתנה אקראיתמשחק תגובה: טיימרמשחק תגובה: התחלה מוקדמתמשחק תגובה: הזמן הטוב ביותרתרגלו בעצמכם: Arduino אונליין