Simon: Losowa sekwencja
Część sekcji Projekty ścieżki Arduino w Coddy. Lekcja 14 z 24.
Teraz swoją kolej ma plansza. Gdy po raz pierwszy zwolnisz przycisk, gra się rozpoczyna: plansza losuje cztery kolory, zapisuje je w tablicy i je odtwarza.
random(4) zwraca 0, 1, 2 lub 3: jeden kolor. Pętla for wypełnia tablicę. Podobnie jak w grze reakcyjnej, użyj micros() jako ziarna przy naciśnięciu, w przeciwnym razie każda gra będzie odtwarzać te same kolory:
randomSeed(micros());
for (int i = 0; i < 4; i++) {
sequence[i] = random(4);
}Druga pętla for odtwarza wzór: zapala kolor i odtwarza jego dźwięk, czeka, wyłącza go i znów czeka. Druga pauza ma znaczenie, gdy ten sam kolor pojawia się dwa razy z rzędu: bez niej czerwony, czerwony wygląda jak jedno długie świecenie na czerwono. Teraz gracz tylko obserwuje, więc delay() jest w porządku.
for (int i = 0; i < 4; i++) {
lightOn(sequence[i]);
delay(400);
lightOff(sequence[i]);
delay(200);
}Wartość typu bool o nazwie playing zapamiętuje, że gra się rozpoczęła, więc tylko pierwsze naciśnięcie ją uruchamia.
Wyzwanie
ŚredniSpraw, aby płytka odtwarzała sekwencję:
- dodaj
int sequence[4];orazbool playing = false; - gdy przycisk zostanie puszczony, a
playingma wartośćfalse: zainicjuj generator liczb losowych, wypełnij tablicę wartościami zrandom(4), ustawplayingnatruei odtwórz sekwencję - sekwencja: odczekaj 500 ms, następnie odtwarzaj każdy kolor wraz z jego dźwiękiem przez 400 ms, a potem zachowaj 200 ms ciszy
Potem przyciski będą się świecić i odtwarzać dźwięki jak wcześniej. Naciśnij Run, naciśnij przycisk, a następnie Check.
Spróbuj swoich sił
// Po jednym elemencie na kolor: czerwony, zielony, niebieski, żółty
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 i wysokie C
const int buzzerPin = 8;
int lastState[4] = {HIGH, HIGH, HIGH, HIGH}; // ostatni odczyt każdego przycisku
// Zaświeć kolor i i zagraj przypisany mu dźwięk.
void lightOn(int i) {
digitalWrite(ledPins[i], HIGH);
tone(buzzerPin, notes[i]);
}
// Zgaś kolor i i zatrzymaj dźwięk.
void lightOff(int i) {
digitalWrite(ledPins[i], LOW);
noTone(buzzerPin);
}
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) { // wciśnięty
lightOn(i);
}
if (state == HIGH && lastState[i] == LOW) { // puszczony
lightOff(i);
}
lastState[i] = state;
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Projekty
Poćwicz samodzielnie: Edytor online Arduino