Menu
CoddyTech

反応ゲーム:ベストタイム

CoddyのArduinoジャーニー「プロジェクト」セクションの一部。レッスン 8/24。

このスケッチは、最も良い(最も短い)時間を変数に保存し、各ラウンドの後に表示します。

開始時点では、まだ最良の時間はありません。実際のラウンドではあり得ない値である 0 を「まだなし」を意味する値として使います。各ラウンドの後、まだ最良の時間がない場合、または今回のラウンドがそれを上回った場合は、今回のラウンドが新たな最良記録になります。

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

ラウンドが実際の時間で終了する LIT 状態にこれを入れます。フライングスタートではこのコードに到達しないため、記録にはなりません。

最良の時間はボードのメモリ(RAM)に保存されます。電源を切ると消去されるため、記録は再び Run を押すまで保持されます。

challenge icon

チャレンジ

中級

記録を残しましょう:

  • 最初は0の変数 best
  • タイムを計測する各ラウンドの後、best が0、または今回のラウンドのほうが速かった場合は、そのラウンドを新しいベストとして保存します
  • 各ラウンドの後に Best: 250 ms として表示します
  • フライングでは何も変更しません

Run を押して、自己ベストの更新に挑戦してから、Check を押しましょう。

自分で試してみよう

const int ledPin = 12;
const int buttonPin = 2;

// 1ラウンドの3つの状態
enum State { READY, WAITING, LIT };
State state = READY;

int lastButton = HIGH;       // 前回のボタンの読み取り値
unsigned long waitStart = 0; // 待機が始まった時刻
unsigned long waitTime = 0;  // 今回の待機時間
unsigned long litAt = 0;     // LEDが点灯した時刻

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;
  }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

プロジェクトのすべてのレッスン

自分で練習してみよう: Arduinoプレイグラウンド