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.
Wyzwanie
ŚredniPrzycisk 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;
}
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
1Wyświetlacze siedmiosegmentowe
Wyświetlacz siedmiosegmentowyWzory cyfr w bajtachLiczenie na wyświetlaczuOdliczanie do zeraSymulator rzutu kostkąPoćwicz samodzielnie: Edytor online Arduino