Menu
CoddyTech

Simon: Il gioco completo

Fa parte della sezione Progetti del percorso Arduino di Coddy. Lezione 16 di 24.

Simon vero inizia in piccolo e cresce. Nel round 1 viene riprodotto un colore. Ogni volta che ripeti correttamente un round, la scheda mantiene gli stessi colori e ne aggiunge uno alla fine, finché non commetti un errore.

L’array ha bisogno di spazio per una partita lunga e di una variabile length per indicare quanta parte viene utilizzata. Aggiungere un colore richiede due righe:

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

Inizializza il generatore una sola volta, quando inizia la partita. Ora playSequence() riproduce length colori invece di quattro, e un round termina quando step raggiunge length.

Un errore termina la partita con un suono chiaramente diverso da una nota, a 110 Hz per un secondo, e stampa il punteggio: i round completati, length - 1, dato che il round perso non conta.

L’array ha 20 posti e lo sketch non deve mai scrivere oltre la sua fine, quindi vince chi ripete 20 colori.

challenge icon

Sfida

Difficile

Trasformalo nel gioco completo:

  • const int MAX_STEPS = 20;, int sequence[MAX_STEPS]; e int length = 0;
  • una partita inizia con un colore; ogni round ripetuto correttamente ne aggiunge uno e li riproduce tutti
  • un errore: 110 Hz per 1000 ms, poi stampa Game over! Score: e il punteggio, quindi termina la partita
  • 20 colori ripetuti correttamente: stampa You win! e termina la partita

Premi Run, guarda fin dove arrivi, poi Check.

Provalo tu

// Una voce per ogni colore: rosso, verde, blu, giallo
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 e C acuto
const int buzzerPin = 8;

int lastState[4] = {HIGH, HIGH, HIGH, HIGH};  // l’ultima lettura di ciascun pulsante

int sequence[4];       // i colori riprodotti dalla scheda
bool playing = false;  // false finché una pressione non avvia il gioco
int step = 0;          // quanti colori ha ripetuto il giocatore

// Accendi il colore i e riproduci la sua nota.
void lightOn(int i) {
  digitalWrite(ledPins[i], HIGH);
  tone(buzzerPin, notes[i]);
}

// Spegni il colore i e interrompi il suono.
void lightOff(int i) {
  digitalWrite(ledPins[i], LOW);
  noTone(buzzerPin);
}

// Riproduci la sequenza: ogni colore per 400 ms, poi 200 ms di silenzio.
void playSequence() {
  delay(500);
  for (int i = 0; i < 4; i++) {
    lightOn(sequence[i]);
    delay(400);
    lightOff(sequence[i]);
    delay(200);
  }
}

// Genera una nuova sequenza casuale e riproducila.
void startGame() {
  randomSeed(micros());
  for (int i = 0; i < 4; i++) {
    sequence[i] = random(4);
  }
  playing = true;
  step = 0;
  playSequence();
}

// Il giocatore ha rilasciato il pulsante del colore i: è il prossimo nella sequenza?
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) {  // premuto
      lightOn(i);
    }
    if (state == HIGH && lastState[i] == LOW) {  // rilasciato
      lightOff(i);
      if (playing == false) {
        startGame();
      } else {
        checkPress(i);
      }
    }
    lastState[i] = state;
  }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Progetti

Esercitati da solo: Playground Arduino