Menu
CoddyTech

주사위 굴리기

Coddy Arduino 여정의 디스플레이와 센서 섹션에 포함된 레슨. 24개 중 5번째.

random(1, 7)은 1부터 6까지의 정수를 선택합니다. 첫 번째 숫자는 나올 수 있는 가장 작은 수이고, 두 번째 숫자는 가장 큰 수보다 1 큰 수입니다.

보드 내부에는 실제 무작위성이 없습니다. random()은 시드라고 하는 숫자에서 시작해 앞선 숫자를 바탕으로 각 숫자를 계산합니다. 같은 시드를 사용하면 실행할 때마다 같은 숫자가 나옵니다. 전원을 켤 때마다 주사위는 2, 2, 6, 3을 굴리게 됩니다.

randomSeed()는 시드를 설정합니다. 첫 번째 버튼을 누른 시각처럼 실행할 때마다 달라지는 값을 지정하세요. micros()는 마이크로초 단위로 시간을 세며, 누구도 같은 마이크로초에 두 번 누르지는 않습니다.

if (!seeded) {
  randomSeed(micros());
  seeded = true;
}
int roll = random(1, 7);

setup()에서 시드를 설정해도 소용없습니다. 전원을 켤 때마다 setup()은 같은 마이크로초에 실행되기 때문입니다.

challenge icon

챌린지

중급

버튼은 핀 10에 연결되어 있고, 시작 코드는 버튼이 눌리는 순간을 이미 감지합니다. 주사위를 만들어 보세요:

  • 버튼을 누를 때마다 random(1, 7)을 선택하고 showDigit()으로 표시하세요
  • 첫 번째로 누를 때만 randomSeed(micros())를 호출하여 실행할 때마다 다른 값이 나오게 하세요

Run을 누르고 버튼을 몇 번 누른 다음 Check를 누르세요.

직접 해보기

const int segmentPins[7] = {2, 3, 4, 5, 6, 7, 8};  // a, b, c, d, e, f, g

// 숫자 하나당 패턴 하나. 오른쪽부터 읽으며, 마지막 비트는 세그먼트 a를 나타낸다.
//                     gfedcba
const byte digits[10] = {
  0b0111111,  // 0
  0b0000110,  // 1
  0b1011011,  // 2
  0b1001111,  // 3
  0b1100110,  // 4
  0b1101101,  // 5
  0b1111101,  // 6
  0b0000111,  // 7
  0b1111111,  // 8
  0b1101111   // 9
};

void showDigit(int n) {
  for (int i = 0; i < 7; i++) {
    if (bitRead(digits[n], i) == 1) {
      digitalWrite(segmentPins[i], LOW);   // 켜짐
    } else {
      digitalWrite(segmentPins[i], HIGH);  // 꺼짐
    }
  }
}

const int buttonPin = 10;
bool wasPressed = false;
bool seeded = false;

void setup() {
  for (int i = 0; i < 7; i++) {
    pinMode(segmentPins[i], OUTPUT);
  }
  pinMode(buttonPin, INPUT_PULLUP);
  showDigit(0);
}

void loop() {
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      // 버튼이 방금 눌렸다: 1부터 6까지의 숫자를 무작위로 뽑아 표시한다
    }
    delay(50);  // 버튼 입력이 안정될 때까지 기다린다
  }
  wasPressed = pressed;
}
quiz icon실력 점검

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

디스플레이와 센서의 모든 레슨

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