Menu
CoddyTech

סיימון: חזרה על התבנית

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

challenge icon

אתגר

קשה

אפשר לשחקן לענות:

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

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

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

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