Игра на реакцию: лучшее время
Часть раздела Проекты путешествия по Arduino на Coddy. Урок 8 из 24.
Скетч хранит лучшее (наименьшее) время в переменной и выводит его после каждого раунда.
В начале лучшего времени ещё нет. Используй значение, которого не может быть ни у одного настоящего раунда, — 0, чтобы обозначить «пока нет». После каждого раунда: если лучшего времени ещё нет или этот раунд показал лучший результат, то этот раунд становится новым лучшим.
if (best == 0 || reaction < best) {
best = reaction;
}
Serial.print("Best: ");
Serial.print(best);
Serial.println(" ms");Помести это в состояние LIT, где раунд заканчивается реальным временем. Фальстарт никогда не доходит до этого кода, поэтому он никогда не становится рекордом.
Лучшее время хранится в памяти платы (RAM), которая очищается при отключении питания: рекорд сохраняется, пока ты снова не нажмёшь Run.
Задание
СреднеВеди запись:
- переменная
best, в начале равна 0 - после каждого раунда на время, если
bestравна 0 или раунд прошёл быстрее, сохрани результат раунда как новый лучший - выводи его после каждого раунда в формате
Best: 250 ms - фальстарты ничего не меняют
Нажми Run, попробуй побить свой рекорд, затем нажми Check.
Попробуйте сами
const int ledPin = 12;
const int buttonPin = 2;
// Три состояния одного раунда
enum State { READY, WAITING, LIT };
State state = READY;
int lastButton = HIGH; // предыдущее показание кнопки
unsigned long waitStart = 0; // когда началось ожидание
unsigned long waitTime = 0; // сколько длится это ожидание
unsigned long litAt = 0; // когда загорелся светодиод
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Press the button to start");
}
void loop() {
int button = digitalRead(buttonPin);
bool pressed = (button == LOW && lastButton == HIGH); // кнопка только что нажата
lastButton = button;
unsigned long now = millis();
switch (state) {
case READY:
if (pressed) {
randomSeed(micros()); // время нажатия никогда не повторяется
waitTime = random(1000, 3001);
waitStart = now;
state = WAITING;
}
break;
case WAITING:
if (pressed) {
// Кнопка нажата до включения света: фальстарт.
Serial.println("Too soon!");
state = READY;
} else if (now - waitStart >= waitTime) {
digitalWrite(ledPin, HIGH);
litAt = now;
state = LIT;
}
break;
case LIT:
if (pressed) {
digitalWrite(ledPin, LOW);
unsigned long reaction = now - litAt;
Serial.print("Reaction: ");
Serial.print(reaction);
Serial.println(" ms");
state = READY;
}
break;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Проекты
2Игра на реакцию
Игра на реакцию: случайное ожиданиеИгра на реакцию: таймерИгра на реакцию: фальстартИгра на реакцию: лучшее времяПотренируйтесь самостоятельно: Песочница Arduino