Menu
CoddyTech

Symulator rzutu kostką

Część sekcji Wyświetlacze i czujniki ścieżki Arduino w Coddy. Lekcja 5 z 24.

random(1, 7) wybiera liczbę całkowitą od 1 do 6. Pierwsza liczba to najmniejsza możliwa do uzyskania; druga jest o jeden większa od największej.

Wewnątrz planszy nie ma prawdziwej losowości. random() oblicza każdą liczbę na podstawie poprzedniej, zaczynając od liczby nazywanej ziarnem. Przy tym samym ziarnie za każdym uruchomieniem zwraca te same liczby: twoje kostki za każdym razem po włączeniu wylosują 2, 2, 6, 3.

randomSeed() ustawia ziarno. Podaj mu coś, co zmienia się przy każdym uruchomieniu, na przykład czas pierwszego naciśnięcia przycisku. micros() zlicza milionowe części sekundy i nikt nie naciska przycisku dwa razy w tej samej mikrosekundzie:

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

Ustawienie ziarna w setup() nie pomoże: setup() uruchamia się w tej samej mikrosekundzie po każdym włączeniu.

challenge icon

Wyzwanie

Średni

Przycisk jest podłączony do pinu 10, a kod startowy już wykrywa moment jego wciśnięcia. Zrób kostkę do gry:

  • przy każdym naciśnięciu wylosuj random(1, 7) i wyświetl wynik za pomocą showDigit()
  • tylko przy pierwszym naciśnięciu wywołaj randomSeed(micros()), aby wyniki różniły się przy każdym uruchomieniu

Naciśnij Run i naciśnij przycisk kilka razy, a następnie Check.

Spróbuj swoich sił

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

// Jeden wzorzec na cyfrę, odczytywany od prawej: ostatni bit odpowiada segmentowi 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);   // świeci
    } else {
      digitalWrite(segmentPins[i], HIGH);  // zgaszony
    }
  }
}

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) {
      // przycisk został właśnie naciśnięty: wylosuj liczbę od 1 do 6 i ją wyświetl
    }
    delay(50);  // poczekaj, aż stan przycisku się ustabilizuje
  }
  wasPressed = pressed;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Wyświetlacze i czujniki

Poćwicz samodzielnie: Edytor online Arduino