戻る

Arduinoでサイモンセイズ記憶ゲームをVelxioで作ろう

はじめに

あの古典的なサイモンセイズゲームを覚えていますか?これはArduinoで配列、ステートマシン、ユーザー入力処理を学ぶのに最適なプロジェクトです。このチュートリアルでは、4つのLEDと4つのプッシュボタンを使った完全に機能するサイモンセイズゲームを、すべてブラウザ上のVelxioでシミュレーションしながら構築します。ハードウェアは不要です!

Velxioシミュレーターキャンバス上のサイモンセイズの回路図

回路の解説

コンポーネントとその接続方法を見てみましょう。

コンポーネント

コンポーネントID目的
Arduino Unoarduino-unoゲームの頭脳
赤色LEDled-red赤色シーケンスの出力
緑色LEDled-green緑色シーケンスの出力
青色LEDled-blue青色シーケンスの出力
黄色LEDled-yellow黄色シーケンスの出力
赤色ボタンbutton-red赤色のユーザー入力
緑色ボタンbutton-green緑色のユーザー入力
青色ボタンbutton-blue青色のユーザー入力
黄色ボタンbutton-yellow黄色のユーザー入力

配線

各LEDのアノード(A)はArduinoのデジタルピンに接続し、カソード(C)は電流制限抵抗(内部でシミュレーション)を介してGNDに接続します。ボタンは、一方の端子(1.l)をデジタルピンに、もう一方の端子(2.l)をGNDに配線し、Arduinoの内部プルアップ抵抗を使用します。

すべてのグランド接続はArduinoのGNDピンを共有します。

コードの解説

Velxioでコードエディタを開いて、完全なスケッチを確認してください。

Velxio Monacoエディタでのサイモンセイズのソースコード

定数と変数

const int LED_PINS[] = {8, 9, 10, 11};
const int BUTTON_PINS[] = {2, 3, 4, 5};
const int NUM_LEDS = 4;

int sequence[100];
int sequenceLength = 0;
int currentStep = 0;

配線に合わせてLEDとボタンピンの配列を定義します。sequenceはランダムなパターン(最大100ステップ)を保存します。sequenceLengthはプレイヤーが繰り返す必要のあるステップ数を追跡し、currentStepはプレイヤーの進行状況を追跡します。

セットアップ

void setup() {
  Serial.begin(9600);

  for (int i = 0; i < NUM_LEDS; i++) {
    pinMode(LED_PINS[i], OUTPUT);
    pinMode(BUTTON_PINS[i], INPUT_PULLUP);
  }

  randomSeed(millis());
  newGame();
}

LEDピンを出力に、ボタンピンを内部プルアップ付きの入力に設定します(これにより、ボタンが押されたときにLOWを読み取ります)。randomSeed(millis())により、ゲームごとに異なるシーケンスが生成されます。newGame()で最初のラウンドを開始します。

ゲームロジック

newGame()はシーケンス長を1にリセットし、ランダムなステップを追加して、シーケンスを再生します。

void newGame() {
  sequenceLength = 1;
  currentStep = 0;
  addToSequence();
  playSequence();
}

void addToSequence() {
  sequence[sequenceLength - 1] = random(0, NUM_LEDS);
}

void playSequence() {
  for (int i = 0; i < sequenceLength; i++) {
    flashLED(sequence[i]);
    delay(500);
  }
}

void flashLED(int led) {
  digitalWrite(LED_PINS[led], HIGH);
  delay(300);
  digitalWrite(LED_PINS[led], LOW);
}

playSequence()は保存されたシーケンスを反復処理し、各LEDを300ms点灯させ、500msの間隔を空けます。

メインループ

void loop() {
  for (int i = 0; i < NUM_LEDS; i++) {
    if (digitalRead(BUTTON_PINS[i]) == LOW) {
      flashLED(i);

      if (i == sequence[currentStep]) {
        currentStep++;
        if (currentStep == sequenceLength) {
          delay(1000);
          sequenceLength++;
          currentStep = 0;
          addToSequence();
          playSequence();
        }
      } else {
        // 間違ったボタン - ゲームオーバー
        for (int j = 0; j < 3; j++) {
          for (int k = 0; k < NUM_LEDS; k++) {
            digitalWrite(LED_PINS[k], HIGH);
          }
          delay(200);
          for (int k = 0; k < NUM_LEDS; k++) {
            digitalWrite(LED_PINS[k], LOW);
          }
          delay(200);
        }
        newGame();
      }

      delay(300);
      while (digitalRead(BUTTON_PINS[i]) == LOW);
    }
  }
}

ループはすべてのボタンを継続的にチェックします。ボタンが押されると(LOW)、対応するLEDを点滅させます。押されたボタンが期待されるステップ(sequence[currentStep])と一致すれば、進行します。プレイヤーがシーケンスを完了すると、新しいステップを追加して、より長いシーケンスを再生します。間違った場合は、すべてのLEDが3回点滅し、新しいゲームが開始されます。

重要な概念

よくある問題とデバッグのヒント

推奨拡張機能

自分で試してみよう!

プレイする準備はできましたか?Velxioでライブサンプルを開いて、シミュレーションを開始してください。ボタンを押してシーケンスを繰り返しましょう。どこまで進めるでしょうか?

Velxioでサイモンセイズを起動

楽しい制作を!


共有:
David Montero

執筆者

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

関連記事


前の記事
TFT ILI9341 ディスプレイデモ:Arduino でのグラフィックスとバウンドボール
次の記事
VelxioでArduinoを使ったRGB LEDカラーサイクリング