サイモン:パターンを繰り返す
CoddyのArduinoジャーニー「プロジェクト」セクションの一部。レッスン 15/24。
ボードが再生したら、あなたの番です。同じ順番で4色を繰り返してください。スケッチにはもう1つ、これまでに繰り返した色の数を数えるstepが必要です。次に押す色はsequence[step]です。
ゲーム開始時と同じように、ボタンを離したときに押下を数えます。その時点でライトと音はオフになっているので、スケッチは適切に反応できます。
void checkPress(int i) {
if (i != sequence[step]) {
Serial.println("Wrong!");
playing = false;
return;
}
step++;
if (step == 4) {
Serial.println("Well done!");
playing = false;
}
}returnは関数をただちに終了するため、色を間違えた場合、その下の処理は実行されません。playingを再びfalseに設定するとゲームが終了し、次にボタンを押すと新しいゲームが始まります。
新しいゲームは毎回、最初から数えなければなりません。startGame()でstep = 0を設定します。
チャレンジ
難しいプレイヤーが回答できるようにします。
int step = 0;を用意し、startGame()で0に戻します- ボタンを離したとき、ゲームが
playingならcheckPress(i)を呼び出します - 色が間違っていたら
Wrong!を出力してゲームを終了します - 4色を正しく押したら、
Well done!を出力してゲームを終了します
setup()でSerialを開始します。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}; // 各ボタンの前回の読み取り値
int sequence[4]; // ボードが再生する色の順番
bool playing = false; // ボタンが押されてゲームが始まるまではfalse
// 色iを点灯し、対応する音を鳴らす。
void lightOn(int i) {
digitalWrite(ledPins[i], HIGH);
tone(buzzerPin, notes[i]);
}
// 色iを消灯し、音を止める。
void lightOff(int i) {
digitalWrite(ledPins[i], LOW);
noTone(buzzerPin);
}
// 順番どおりに再生する:各色を400 msずつ点灯し、その後200 ms無音にする。
void playSequence() {
delay(500);
for (int i = 0; i < 4; i++) {
lightOn(sequence[i]);
delay(400);
lightOff(sequence[i]);
delay(200);
}
}
// 新しいランダムな順番を決めて再生する。
void startGame() {
randomSeed(micros());
for (int i = 0; i < 4; i++) {
sequence[i] = random(4);
}
playing = true;
playSequence();
}
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);
if (playing == false) {
startGame();
}
}
lastState[i] = state;
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
プロジェクトのすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド