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