Menu
CoddyTech

사이먼: 패턴 반복하기

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

보드가 재생을 마치면 이제 네 차례야. 네 가지 색을 같은 순서로 반복해. 스케치에는 지금까지 몇 가지 색을 반복했는지 세는 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!을 출력하고 게임을 끝냅니다
  • 색상 네 개를 모두 맞히면 Well done!을 출력하고 게임을 끝냅니다

setup()에서 Serial을 시작합니다. Run을 누르고, 패턴을 보고 따라 한 다음 Check를 누릅니다.

직접 해보기

// 색상별로 하나씩: 빨간색, 초록색, 파란색, 노란색
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 플레이그라운드