Menu
CoddyTech

Simon:重复模式

本课属于 Coddy Arduino 学习旅程的“项目”单元。第 15 课,共 24 课。

棋盘播放完后,就轮到你了:按相同顺序重复这 4 种颜色。草图还需要一个数字 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。

challenge icon

挑战

困难

让玩家作答:

  • 一个 int step = 0;,在 startGame() 中将其重置为 0
  • 松开按钮且游戏处于 playing 状态时,调用 checkPress(i)
  • 颜色按错时,输出 Wrong! 并结束游戏
  • 连续按对 4 种颜色后,输出 Well done! 并结束游戏

在 setup() 中启动 Serial。按“运行”,观察并重复这个模式,然后按“检查”。

亲手试试

// 每种颜色对应一个元素:红、绿、蓝、黄
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;
  }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

项目中的所有课

自己练习: Arduino 在线编辑器