Саймон: повтори последовательность
Часть раздела Проекты путешествия по 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;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Проекты
4Саймон
Саймон: кнопки и нотыСаймон: случайная последовательностьСаймон: повтори последовательностьСаймон: полная играПотренируйтесь самостоятельно: Песочница Arduino