Menu
CoddyTech

Simon: Pełna gra

Część sekcji Projekty ścieżki Arduino w Coddy. Lekcja 16 z 24.

Prawdziwy Simon zaczyna od krótkiej sekwencji, która się wydłuża. W rundzie 1 odtwarzany jest jeden kolor. Za każdym razem, gdy poprawnie powtórzysz rundę, plansza zachowuje te same kolory i dodaje jeden na końcu, aż popełnisz błąd.

Tablica musi pomieścić długą grę, a zmienna length określa, jaka jej część jest używana. Dodanie koloru to dwie linie:

sequence[length] = random(4);
length++;

Ustaw ziarno generatora raz, gdy rozpoczyna się gra. playSequence() odtwarza teraz length kolorów zamiast czterech, a runda kończy się, gdy step osiągnie length.

Błąd kończy grę dźwiękiem, który wyraźnie nie jest nutą: 110 Hz przez jedną sekundę; wynik jest wyświetlany jako liczba ukończonych rund, czyli length - 1, ponieważ przegrana runda się nie liczy.

Tablica ma 20 miejsc, a szkic nie może nigdy zapisywać poza jej końcem, więc gracz, który powtórzy 20 kolorów, wygrywa.

challenge icon

Wyzwanie

Trudny

Zamień to w pełną grę:

  • const int MAX_STEPS = 20;, int sequence[MAX_STEPS]; i int length = 0;
  • gra zaczyna się od jednego koloru; po każdej poprawnie powtórzonej rundzie dodaj jeden kolor i odtwórz całą sekwencję
  • błąd: 110 Hz przez 1000 ms, następnie wypisz Game over! Score: i wynik, a potem zakończ grę
  • 20 poprawnie powtórzonych kolorów: wypisz You win! i zakończ grę

Naciśnij Run, zobacz, jak daleko uda Ci się zajść, a potem Check.

Spróbuj swoich sił

// Po jednym wpisie na każdy 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

int sequence[4];       // kolory odtwarzane przez płytkę
bool playing = false;  // false, dopóki naciśnięcie nie rozpocznie gry
int step = 0;          // ile kolorów gracz już powtórzył

// Zaświeć kolor i i zagraj odpowiadającą mu nutę.
void lightOn(int i) {
  digitalWrite(ledPins[i], HIGH);
  tone(buzzerPin, notes[i]);
}

// Zgaś kolor i i wyłącz dźwięk.
void lightOff(int i) {
  digitalWrite(ledPins[i], LOW);
  noTone(buzzerPin);
}

// Odtwórz sekwencję: każdy kolor przez 400 ms, a potem 200 ms ciszy.
void playSequence() {
  delay(500);
  for (int i = 0; i < 4; i++) {
    lightOn(sequence[i]);
    delay(400);
    lightOff(sequence[i]);
    delay(200);
  }
}

// Wylosuj nową sekwencję i ją odtwórz.
void startGame() {
  randomSeed(micros());
  for (int i = 0; i < 4; i++) {
    sequence[i] = random(4);
  }
  playing = true;
  step = 0;
  playSequence();
}

// Gracz puścił przycisk koloru i: czy to następny kolor w sekwencji?
void checkPress(int i) {
  if (i != sequence[step]) {
    Serial.println("Wrong!");
    playing = false;
    return;
  }
  step++;
  if (step == 4) {
    Serial.println("Well done!");
    playing = false;
  }
}

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(ledPins[i], OUTPUT);
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < 4; i++) {
    int state = digitalRead(buttonPins[i]);
    if (state == LOW && lastState[i] == HIGH) {  // naciśnięty
      lightOn(i);
    }
    if (state == HIGH && lastState[i] == LOW) {  // puszczono
      lightOff(i);
      if (playing == false) {
        startGame();
      } else {
        checkPress(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