Menu
CoddyTech

Game Reaksi: Waktu Terbaik

Termasuk bagian Proyek dalam perjalanan Arduino di Coddy. Pelajaran 8 dari 24.

Sketch ini menyimpan waktu terbaik (terendah) dalam sebuah variabel dan mencetaknya setelah setiap putaran.

Pada awalnya belum ada waktu terbaik. Gunakan nilai yang tidak mungkin diperoleh dalam putaran sungguhan, yaitu 0, untuk menandakan "belum ada". Setelah setiap putaran: jika belum ada waktu terbaik, atau putaran ini lebih baik, waktu putaran ini menjadi waktu terbaik yang baru.

if (best == 0 || reaction < best) {
  best = reaction;
}
Serial.print("Best: ");
Serial.print(best);
Serial.println(" ms");

Letakkan ini di state LIT, tempat putaran berakhir dengan waktu yang sebenarnya. Start palsu tidak pernah mencapai kode itu, jadi tidak akan menjadi rekor.

Waktu terbaik tersimpan di memori board (RAM), yang dihapus saat daya dimatikan: rekor bertahan sampai kamu menekan Jalankan lagi.

challenge icon

Tantangan

Sedang

Simpan catatan:

  • sebuah variabel best, bernilai 0 di awal
  • setelah setiap ronde yang waktunya diukur, jika best bernilai 0 atau ronde tersebut lebih cepat, simpan waktu ronde itu sebagai catatan terbaik baru
  • cetak nilainya setelah setiap ronde sebagai Best: 250 ms
  • awal yang terlalu cepat tidak mengubah apa pun

Tekan Jalankan, coba pecahkan catatan terbaikmu, 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;  // berapa 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 (pressed) {
        // Ditekan sebelum lampu menyala: awal yang terlalu cepat.
        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;
  }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Proyek

Latihan sendiri: Playground Arduino