Menu
CoddyTech

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.

challenge icon

Wyzwanie

Średni

Spraw, aby płytka odtwarzała sekwencję:

  • dodaj int sequence[4]; oraz bool playing = false;
  • gdy przycisk zostanie puszczony, a playing ma wartość false: zainicjuj generator liczb losowych, wypełnij tablicę wartościami z random(4), ustaw playing na true i 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;
  }
}
quiz iconSprawdź się

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