サイモン:ランダムな順番
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 型の変数でゲームが始まったことを記録し、最初のボタン押下だけでゲームが始まるようにします。
チャレンジ
中級ボードにパターンを再生させましょう:
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;
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
プロジェクトのすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド