Menu
CoddyTech

סיימון: המשחק המלא

חלק מהיחידה פרויקטים במסלול ה-Arduino של Coddy. שיעור 16 מתוך 24.

Simon האמיתי מתחיל בקטן וגדל. בסיבוב 1 מתנגן צבע אחד. בכל פעם שחוזרים על סיבוב נכון, הלוח שומר על אותם צבעים ומוסיף אחד בסוף, עד שטועים.

המערך צריך מקום למשחק ארוך, ומשתנה length שמציין כמה ממנו נמצא בשימוש. הוספת צבע נעשית בשתי שורות:

sequence[length] = random(4);
length++;

אתחלו את הגרעין פעם אחת, כשהמשחק מתחיל. playSequence() מנגנת עכשיו length צבעים במקום ארבעה, והסיבוב מסתיים כש-step מגיע ל-length.

טעות מסיימת את המשחק בצליל שאינו תו באופן ברור, בתדר 110 Hz למשך שנייה אחת, ומדפיסה את הניקוד: מספר הסיבובים שהושלמו, length - 1, מכיוון שהסיבוב שבו מפסידים אינו נחשב.

במערך יש 20 מקומות והסקץ' לעולם לא חייב לכתוב מעבר לסופו, ולכן שחקן שחוזר נכון על 20 צבעים מנצח.

challenge icon

אתגר

קשה

הפכו אותו למשחק המלא:

  • const int MAX_STEPS = 20;, int sequence[MAX_STEPS]; ו-int length = 0;
  • המשחק מתחיל בצבע אחד; כל סבב ששוחזר נכון מוסיף צבע אחד ומשמיע את כל הצבעים
  • טעות: 110 Hz למשך 1000 ms, ואז להדפיס Game over! Score: ואת הניקוד, ולסיים את המשחק
  • 20 צבעים ששוחזרו נכון: להדפיס You win! ולסיים את המשחק

לחצו על 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 עד שלחיצה מתחילה את המשחק
int step = 0;          // כמה צבעים השחקן חזר עליהם

// הדלק את הצבע 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;
  step = 0;
  playSequence();
}

// השחקן שחרר את הצבע i: האם זה הצבע הבא ברצף?
void checkPress(int i) {
  if (i != sequence[step]) {
    Serial.println("Wrong!");
    playing = false;
    return;
  }
  step++;
  if (step == 4) {
    Serial.println("Well done!");
    playing = false;
  }
}

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(ledPins[i], OUTPUT);
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
  Serial.begin(9600);
}

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();
      } else {
        checkPress(i);
      }
    }
    lastState[i] = state;
  }
}
quiz iconבחנו את עצמכם

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

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

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