Simon: Powtórz wzór
Część sekcji Projekty ścieżki Arduino w Coddy. Lekcja 15 z 24.
Po odtworzeniu sekwencji przez planszę przychodzi twoja kolej: powtórz cztery kolory w tej samej kolejności. Szkic potrzebuje jeszcze jednej liczby, step, która zlicza, ile kolorów udało ci się dotąd powtórzyć. Kolor, który musisz nacisnąć jako następny, to sequence[step].
Rejestruj naciśnięcie po zwolnieniu przycisku, tak jak gra już robi to przy rozpoczynaniu. Wtedy jego lampka i dźwięk są wyłączone, a szkic może odpowiednio zareagować:
void checkPress(int i) {
if (i != sequence[step]) {
Serial.println("Wrong!");
playing = false;
return;
}
step++;
if (step == 4) {
Serial.println("Well done!");
playing = false;
}
}return natychmiast kończy funkcję, więc po naciśnięciu niewłaściwego koloru nic poniżej niego się nie wykona. Ponowne ustawienie playing na false kończy grę, a następne naciśnięcie rozpoczyna nową.
Każda nowa gra musi liczyć od początku: ustaw step = 0 w startGame().
Wyzwanie
TrudnyPozwól graczowi udzielić odpowiedzi:
- zmienna
int step = 0;, ustawiana z powrotem na 0 wstartGame() - gdy przycisk zostanie puszczony, a gra jest
playing, wywołajcheckPress(i) - nieprawidłowy kolor wyświetla
Wrong!i kończy grę - po czterech prawidłowych kolorach wyświetl
Well done!i zakończ grę
Uruchom Serial w setup(). Naciśnij Run, obserwuj, powtórz wzór, a następnie naciśnij Check.
Spróbuj swoich sił
// Po jednej pozycji dla każdego koloru: czerwonego, zielonego, niebieskiego i żółtego
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 stanu każdego przycisku
int sequence[4]; // kolory odtwarzane przez płytkę
bool playing = false; // false, dopóki naciśnięcie przycisku nie rozpocznie gry
// Zaświeć kolor i i zagraj odpowiadający mu dźwięk.
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;
playSequence();
}
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) { // naciśnięty
lightOn(i);
}
if (state == HIGH && lastState[i] == LOW) { // puszczony
lightOff(i);
if (playing == false) {
startGame();
}
}
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