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.
Wyzwanie
TrudnyZamień to w pełną grę:
const int MAX_STEPS = 20;,int sequence[MAX_STEPS];iint 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;
}
}
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