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