סיימון: חזרה על התבנית
חלק מהיחידה פרויקטים במסלול ה-Arduino של Coddy. שיעור 15 מתוך 24.
אחרי שהלוח מנגן, תורך: חזור על ארבעת הצבעים באותו הסדר. הסקץ׳ צריך מספר נוסף, step, שסופר כמה צבעים חזרת עליהם עד עכשיו. הצבע שעליך ללחוץ עליו עכשיו הוא sequence[step].
ספור לחיצה כשהכפתור משתחרר, כפי שהמשחק כבר עושה כדי להתחיל. עד אז האור והצליל שלו כבויים, והסקץ׳ יכול להגיב בצורה נקייה:
void checkPress(int i) {
if (i != sequence[step]) {
Serial.println("Wrong!");
playing = false;
return;
}
step++;
if (step == 4) {
Serial.println("Well done!");
playing = false;
}
}return יוצא מהפונקציה מיד, כך שאחרי לחיצה על צבע שגוי לא מתבצע שום דבר שמתחתיו. הגדרת playing בחזרה ל-false מסיימת את המשחק, והלחיצה הבאה מתחילה משחק חדש.
כל משחק חדש חייב להתחיל לספור מההתחלה: הגדר step = 0 בתוך startGame().
אתגר
קשהאפשר לשחקן לענות:
int step = 0;, שמתאפס ל־0 ב־startGame()- כשמשחררים כפתור והמשחק
playing, קוראים ל־checkPress(i) - צבע שגוי מדפיס
Wrong!ומסיים את המשחק - אחרי ארבעה צבעים נכונים, מדפיסים
Well done!ומסיימים את המשחק
מתחילים את Serial ב־setup(). לוחצים על Run, צופים, חוזרים על התבנית ואז לוחצים על Check.
נסו בעצמכם
// רשומה אחת לכל צבע: אדום, ירוק, כחול, צהוב
const int ledPins[4] = {9, 10, 11, 12};
const int buttonPins[4] = {2, 3, 4, 5};
const int notes[4] = {262, 330, 392, 523}; // C, E, G ו-C גבוה
const int buzzerPin = 8;
int lastState[4] = {HIGH, HIGH, HIGH, HIGH}; // הקריאה האחרונה של כל כפתור
int sequence[4]; // הצבעים שהלוח מציג
bool playing = false; // false עד שלחיצה מתחילה את המשחק
// הדלק את צבע i ונגן את התו שלו.
void lightOn(int i) {
digitalWrite(ledPins[i], HIGH);
tone(buzzerPin, notes[i]);
}
// כבה את צבע i והפסק את הצליל.
void lightOff(int i) {
digitalWrite(ledPins[i], LOW);
noTone(buzzerPin);
}
// נגן את הרצף: כל צבע למשך 400 ms, ואז 200 ms של שקט.
void playSequence() {
delay(500);
for (int i = 0; i < 4; i++) {
lightOn(sequence[i]);
delay(400);
lightOff(sequence[i]);
delay(200);
}
}
// בחר רצף אקראי חדש ונגן אותו.
void startGame() {
randomSeed(micros());
for (int i = 0; i < 4; i++) {
sequence[i] = random(4);
}
playing = true;
playSequence();
}
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(ledPins[i], OUTPUT);
pinMode(buttonPins[i], INPUT_PULLUP);
}
}
void loop() {
for (int i = 0; i < 4; i++) {
int state = digitalRead(buttonPins[i]);
if (state == LOW && lastState[i] == HIGH) { // נלחץ
lightOn(i);
}
if (state == HIGH && lastState[i] == LOW) { // שוחרר
lightOff(i);
if (playing == false) {
startGame();
}
}
lastState[i] = state;
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה פרויקטים
תרגלו בעצמכם: Arduino אונליין