Menu
CoddyTech

反应力游戏:随机等待

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

下一个项目是反应游戏。你按下按钮,电路板等待一会儿,然后点亮 LED,你再尽可能快地按下按钮。

等待时间是随机的,否则你会摸清节奏。random(1000, 3001)会生成一个从 1000 到 3000 的整数。

random()是一种计算:每次通电后,它都会按相同顺序生成相同的数字。randomSeed()会选择这个序列的起点。用按下按钮的时刻(以微秒为单位)作为种子,因为每局游戏的这个时刻都不同:

randomSeed(micros());
waitTime = random(1000, 3001);

这个游戏是一个有三个状态的状态机:READY(等待按下按钮)、WAITING(随机等待)和LIT(LED 已点亮)。等待过程使用millis(),这样后续步骤就能在等待期间检测按钮。

入门代码已经计算好了pressed:按钮现在读取为LOW,上一次读取为HIGH。这个按钮不会抖动,因此不需要消抖。

challenge icon

挑战

中等

按钮连接到引脚 2,LED 连接到引脚 12。填入这三个状态:

  • READY:按下按钮时,用 micros() 设置随机种子,选择 1000 到 3000 ms 的等待时间,保存开始时间,并切换到 WAITING
  • WAITING:等待结束时,点亮 LED 并切换到 LIT
  • LIT:按下按钮时,关闭 LED 并切换到 READY

按“运行”,玩几轮,然后按“检查”。

亲手试试

const int ledPin = 12;
const int buttonPin = 2;

// 一轮游戏的三种状态
enum State { READY, WAITING, LIT };
State state = READY;

int lastButton = HIGH;       // 上一次读取的按钮状态
unsigned long waitStart = 0; // 开始等待的时间
unsigned long waitTime = 0;  // 这次要等待多久

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println("Press the button to start");
}

void loop() {
  int button = digitalRead(buttonPin);
  bool pressed = (button == LOW && lastButton == HIGH);  // 刚刚按下
  lastButton = button;

  // READY:按下按钮后开始等待
  // WAITING:等待结束后点亮 LED
  // LIT:按下按钮后关闭 LED,游戏再次进入准备状态

}
quiz icon自我测试

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

项目中的所有课

自己练习: Arduino 在线编辑器