Menu
CoddyTech

サイモン:ランダムな順番

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

次はボードの番です。ボタンを初めて離すとゲームが始まります。ボードは4つの色をランダムに選び、それらを配列に保存して、順番に点灯させます。

random(4) は 0、1、2、または 3 を返します。つまり、1つの色です。for ループで配列を埋めます。反応ゲームと同じように、ボタンを押したときに micros() でシードを設定しないと、毎回同じ色の並びになります。

randomSeed(micros());
for (int i = 0; i < 4; i++) {
  sequence[i] = random(4);
}

2つ目の for ループでパターンを再生します。色を対応する音とともに点灯し、待ってから消灯し、もう一度待ちます。同じ色が続くときは、2回目の待ち時間が重要です。これがないと、赤、赤が1回の長い赤に見えてしまいます。今はプレイヤーは見るだけなので、delay() を使っても問題ありません。

for (int i = 0; i < 4; i++) {
  lightOn(sequence[i]);
  delay(400);
  lightOff(sequence[i]);
  delay(200);
}

playing という bool 型の変数でゲームが始まったことを記録し、最初のボタン押下だけでゲームが始まるようにします。

challenge icon

チャレンジ

中級

ボードにパターンを再生させましょう:

  • int sequence[4]; と bool playing = false; を追加します
  • ボタンを離したときに playing が false なら、シード値を設定し、配列に random(4) を入れ、playing を true に設定して、パターンを再生します
  • パターン:500 ms 待ち、その後各色を対応する音とともに400 ms点灯・再生し、その後200 msの無音を入れます

その後は、これまでと同じようにボタンが点灯して音が鳴ります。Runを押し、ボタンを押してから、Checkを押します。

自分で試してみよう

// 各色に1つずつ: 赤、緑、青、黄
const int ledPins[4] = {9, 10, 11, 12};
const int buttonPins[4] = {2, 3, 4, 5};
const int notes[4] = {262, 330, 392, 523};  // C、E、G、高いC
const int buzzerPin = 8;

int lastState[4] = {HIGH, HIGH, HIGH, HIGH};  // 各ボタンの前回の読み取り値

// 色 i を点灯し、その音を鳴らす。
void lightOn(int i) {
  digitalWrite(ledPins[i], HIGH);
  tone(buzzerPin, notes[i]);
}

// 色 i を消灯し、音を止める。
void lightOff(int i) {
  digitalWrite(ledPins[i], LOW);
  noTone(buzzerPin);
}

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(ledPins[i], OUTPUT);
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
}

void loop() {
  for (int i = 0; i < 4; i++) {
    int state = digitalRead(buttonPins[i]);
    if (state == LOW && lastState[i] == HIGH) {  // 押された
      lightOn(i);
    }
    if (state == HIGH && lastState[i] == LOW) {  // 離された
      lightOff(i);
    }
    lastState[i] = state;
  }
}
quiz icon腕試し

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

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

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