返回

在 Velxio 上用 Arduino 构建西蒙说记忆游戏

简介

还记得经典的西蒙说游戏吗?它是学习 Arduino 上数组、状态机和用户输入处理的完美项目。在本教程中,我们将使用四个 LED 和四个按钮构建一个功能完整的西蒙说游戏,所有操作都在浏览器中通过 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 闪烁 300 毫秒,间隔 500 毫秒。

主循环

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 闪烁三次,然后开始新游戏。

关键概念

常见问题与调试技巧

建议扩展

亲自试试!

准备好了吗?在 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 颜色循环