Game Reaksi: Mulai Terlalu Cepat
Termasuk bagian Proyek dalam perjalanan Arduino di Coddy. Pelajaran 7 dari 24.
Saat ini, pemain yang cerdik bisa curang: tekan tombol berulang kali selama menunggu, dan salah satu tekanan tombol akan terjadi tepat setelah lampu menyala. Dalam perlombaan, ada aturan untuk hal ini: bergerak sebelum sinyal disebut start prematur, dan start dibatalkan.
Mesin status sudah mengetahui kapan pemain terlalu cepat: setiap tekanan tombol dalam status WAITING. Periksa di sana, sebelum memeriksa waktu:
case WAITING:
if (pressed) {
Serial.println("Too soon!");
state = READY;
} else if (millis() - waitStart >= waitTime) {
// nyalakan LED seperti sebelumnya
}
break;Kembali ke READY mengakhiri ronde: LED tidak akan menyala, dan tekanan tombol berikutnya memulai permainan baru dengan waktu tunggu acak yang baru. Dengan delay(waitTime), papan tidak bisa mendeteksi tekanan tombol ini sama sekali.
Tantangan
SedangCegah start palsu:
- di
WAITING, saat tombol ditekan, program mencetakToo soon!dan kembali keREADYtanpa menyalakan LED - hal lainnya tetap sama: tekanan berikutnya memulai ronde baru
Tekan Jalankan, coba tekan tombol dua kali dengan cepat, lalu tekan Periksa.
Coba sendiri
const int ledPin = 12;
const int buttonPin = 2;
// Tiga keadaan dalam satu putaran
enum State { READY, WAITING, LIT };
State state = READY;
int lastButton = HIGH; // pembacaan tombol sebelumnya
unsigned long waitStart = 0; // saat penantian dimulai
unsigned long waitTime = 0; // lama penantian ini berlangsung
unsigned long litAt = 0; // saat LED menyala
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); // baru saja ditekan
lastButton = button;
unsigned long now = millis();
switch (state) {
case READY:
if (pressed) {
randomSeed(micros()); // waktu penekanan tidak pernah sama dua kali
waitTime = random(1000, 3001);
waitStart = now;
state = WAITING;
}
break;
case WAITING:
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;
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Proyek
2Game Reaksi
Game Reaksi: Waktu Tunggu AcakGame Reaksi: TimerGame Reaksi: Mulai Terlalu CepatGame Reaksi: Waktu TerbaikLatihan sendiri: Playground Arduino