Menu
CoddyTech

반응 게임: 부정 출발

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

지금은 눈치 빠른 플레이어가 부정행위를 할 수 있습니다. 기다리는 동안 계속 누르면, 그중 한 번은 불이 켜진 직후에 눌리게 됩니다. 경주에는 이에 대한 규칙이 있습니다. 신호 전에 움직이는 것은 부정 출발이며, 출발은 취소됩니다.

상태 머신은 플레이어가 너무 일찍 눌렀는지 이미 알고 있습니다. WAITING 상태에서 누르는 경우입니다. 시계를 확인하기 전에 그곳에서 찾아보세요.

case WAITING:
  if (pressed) {
    Serial.println("Too soon!");
    state = READY;
  } else if (millis() - waitStart >= waitTime) {
    // 이전처럼 LED를 켭니다
  }
  break;

READY로 돌아가면 라운드가 끝납니다. LED는 켜지지 않으며, 다음에 누르면 새로운 무작위 대기 시간으로 새 게임이 시작됩니다. delay(waitTime)을 사용하면 보드가 이 누름을 전혀 감지하지 못합니다.

challenge icon

챌린지

중급

조기 입력을 감지하세요:

  • WAITING 상태에서 버튼을 누르면 Too soon!을 출력하고 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;  // 이번 대기가 지속되는 시간
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 (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 플레이그라운드