Menu
CoddyTech

반응 게임: 최고 기록

Coddy Arduino 여정의 프로젝트 섹션에 포함된 레슨. 24개 중 8번째.

스케치는 변수에 가장 좋은(가장 낮은) 시간을 저장하고 매 라운드가 끝날 때마다 출력합니다.

시작할 때는 아직 가장 좋은 시간이 없습니다. 실제 라운드에서 나올 수 없는 값인 0을 “아직 없음”이라는 의미로 사용하세요. 각 라운드가 끝난 뒤, 아직 가장 좋은 시간이 없거나 이번 라운드가 그 기록을 깼다면 이번 라운드가 새로운 최고 기록입니다.

if (best == 0 || reaction < best) {
  best = reaction;
}
Serial.print("Best: ");
Serial.print(best);
Serial.println(" ms");

실제 시간이 기록된 라운드가 끝나는 LIT 상태에 이 코드를 넣으세요. 부정 출발은 이 코드에 도달하지 않으므로 기록으로 남지 않습니다.

최고 기록은 보드의 메모리(RAM)에 저장되며, 전원이 꺼지면 지워집니다. 따라서 Run을 다시 누를 때까지 기록이 유지됩니다.

challenge icon

챌린지

중급

기록을 유지하세요:

  • 시작할 때 값이 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;
  }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

프로젝트의 모든 레슨

직접 연습해 보세요: Arduino 플레이그라운드