反応ゲーム:ベストタイム
CoddyのArduinoジャーニー「プロジェクト」セクションの一部。レッスン 8/24。
このスケッチは、最も良い(最も短い)時間を変数に保存し、各ラウンドの後に表示します。
開始時点では、まだ最良の時間はありません。実際のラウンドではあり得ない値である 0 を「まだなし」を意味する値として使います。各ラウンドの後、まだ最良の時間がない場合、または今回のラウンドがそれを上回った場合は、今回のラウンドが新たな最良記録になります。
if (best == 0 || reaction < best) {
best = reaction;
}
Serial.print("Best: ");
Serial.print(best);
Serial.println(" ms");ラウンドが実際の時間で終了する LIT 状態にこれを入れます。フライングスタートではこのコードに到達しないため、記録にはなりません。
最良の時間はボードのメモリ(RAM)に保存されます。電源を切ると消去されるため、記録は再び Run を押すまで保持されます。
チャレンジ
中級記録を残しましょう:
- 最初は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;
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
プロジェクトのすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド