반응 게임: 최고 기록
Coddy Arduino 여정의 프로젝트 섹션에 포함된 레슨. 24개 중 8번째.
스케치는 변수에 가장 좋은(가장 낮은) 시간을 저장하고 매 라운드가 끝날 때마다 출력합니다.
시작할 때는 아직 가장 좋은 시간이 없습니다. 실제 라운드에서 나올 수 없는 값인 0을 “아직 없음”이라는 의미로 사용하세요. 각 라운드가 끝난 뒤, 아직 가장 좋은 시간이 없거나 이번 라운드가 그 기록을 깼다면 이번 라운드가 새로운 최고 기록입니다.
if (best == 0 || reaction < best) {
best = reaction;
}
Serial.print("Best: ");
Serial.print(best);
Serial.println(" ms");실제 시간이 기록된 라운드가 끝나는 LIT 상태에 이 코드를 넣으세요. 부정 출발은 이 코드에 도달하지 않으므로 기록으로 남지 않습니다.
최고 기록은 보드의 메모리(RAM)에 저장되며, 전원이 꺼지면 지워집니다. 따라서 Run을 다시 누를 때까지 기록이 유지됩니다.
챌린지
중급기록을 유지하세요:
- 시작할 때 값이 0인
best변수 - 시간을 측정한 각 라운드가 끝난 뒤,
best가 0이거나 해당 라운드가 더 빠르면 그 라운드 기록을 새로운 최고 기록으로 저장합니다 - 각 라운드가 끝날 때마다
Best: 250 ms로 출력합니다 - 부정 출발은 아무것도 바꾸지 않습니다
Run을 누르고, 최고 기록을 깨 보세요. 그런 다음 Check를 누르세요.
직접 해보기
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; // 이번 대기의 지속 시간
unsigned long litAt = 0; // LED가 켜진 시점
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;
unsigned long now = millis();
switch (state) {
case READY:
if (pressed) {
randomSeed(micros()); // 버튼을 누른 시점은 매번 다름
waitTime = random(1000, 3001);
waitStart = now;
state = WAITING;
}
break;
case WAITING:
if (pressed) {
// 불이 켜지기 전에 누름: 부정 출발.
Serial.println("Too soon!");
state = READY;
} else if (now - waitStart >= waitTime) {
digitalWrite(ledPin, HIGH);
litAt = now;
state = LIT;
}
break;
case LIT:
if (pressed) {
digitalWrite(ledPin, LOW);
unsigned long reaction = now - litAt;
Serial.print("Reaction: ");
Serial.print(reaction);
Serial.println(" ms");
state = READY;
}
break;
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
프로젝트의 모든 레슨
직접 연습해 보세요: Arduino 플레이그라운드