Menu
CoddyTech

사이먼: 완성된 게임

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

실제 Simon은 작게 시작해 점점 커집니다. 1라운드에서는 색 하나를 재생합니다. 라운드를 올바르게 반복할 때마다 보드는 같은 색을 유지하고 끝에 하나를 더 추가하며, 실수할 때까지 계속됩니다.

배열에는 긴 게임을 위한 공간이 필요하고, 얼마나 사용 중인지 나타내는 변수 length도 필요합니다. 색을 추가하는 코드는 두 줄입니다.

sequence[length] = random(4);
length++;

게임이 시작될 때 시드를 한 번 설정합니다. 이제 playSequence()는 네 개 대신 length개의 색을 재생하고, step이 length에 도달하면 라운드가 끝납니다.

실수하면 음표와 확실히 다른 소리인 110 Hz 소리를 1초 동안 내며 게임이 끝나고 점수를 출력합니다. 점수는 완료한 라운드 수인 length - 1입니다. 실패한 라운드는 점수에 포함되지 않습니다.

배열에는 20개의 자리가 있으며 스케치는 끝을 넘어 쓰면 안 됩니다. 따라서 색 20개를 반복하는 플레이어가 승리합니다.

challenge icon

챌린지

어려움

완전한 게임으로 만들어 보세요:

  • const int MAX_STEPS = 20;, int sequence[MAX_STEPS]; 및 int length = 0;
  • 게임은 한 가지 색으로 시작합니다. 각 라운드에서 순서를 맞게 반복하면 색을 하나 추가하고 전체 순서를 재생합니다.
  • 실수하면 110 Hz로 1000 ms 동안 소리를 낸 다음, Game over! Score: 와 점수를 출력하고 게임을 끝냅니다.
  • 20가지 색의 순서를 맞게 반복하면 You win!을 출력하고 게임을 끝냅니다.

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
int step = 0;          // 플레이어가 따라 한 색상의 수

// 색상 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;
  step = 0;
  playSequence();
}

// 플레이어가 색상 i의 버튼에서 손을 뗐다: 순서상 다음 색상인가?
void checkPress(int i) {
  if (i != sequence[step]) {
    Serial.println("Wrong!");
    playing = false;
    return;
  }
  step++;
  if (step == 4) {
    Serial.println("Well done!");
    playing = false;
  }
}

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(ledPins[i], OUTPUT);
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
  Serial.begin(9600);
}

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();
      } else {
        checkPress(i);
      }
    }
    lastState[i] = state;
  }
}
quiz icon실력 점검

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

프로젝트의 모든 레슨

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