Menu
CoddyTech

反応ゲーム:ランダムな待ち時間

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

次のプロジェクトは反応ゲームです。ボタンを押すと、ボードは待機し、その後LEDを点灯し、できるだけ速くもう一度ボタンを押します。

待ち時間はランダムです。そうでなければ、リズムを覚えてしまうでしょう。random(1000, 3001)は1000から3000までの整数を返します。

random()は計算です。電源を入れるたびに、同じ順序で同じ数値を返します。randomSeed()は、その数列の開始位置を選びます。ゲームごとに異なる、押した瞬間のマイクロ秒を使ってシードを設定します。

randomSeed(micros());
waitTime = random(1000, 3001);

このゲームは、3つの状態を持つ状態機械です。READY(ボタンが押されるのを待機)、WAITING(ランダムな待ち時間)、そしてLIT(LEDが点灯中)です。待ち時間にはmillis()を使うため、後続の処理で待ち時間中にボタンを監視できます。

スターターコードでは、すでにpressedを判定しています。現在ボタンがLOWで、前回はHIGHだった場合です。このボタンはチャタリングしないため、デバウンスは不要です。

challenge icon

チャレンジ

中級

ボタンはピン 2 に、LED はピン 12 に接続されています。3 つの状態を完成させましょう。

  • READY: ボタンを押すとmicros()でシードを設定し、待ち時間を 1000~3000 ms から選び、開始時刻を保存して、WAITINGに移ります
  • WAITING: 待ち時間が終わったら、LED を点灯し、LITに移ります
  • LIT: ボタンを押すと LED を消灯し、READYに移ります

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;  // 今回の待機時間

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;

  // READY: ボタンを押すと待機を開始する
  // WAITING: 待機が終わったらLEDを点灯する
  // LIT: ボタンを押すとLEDが消え、ゲームは再び開始できる状態になる

}
quiz icon腕試し

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

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

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