Indietro

Costruisci un Gioco Simon Says con Arduino su Velxio

Introduzione

Ricordi il classico gioco Simon Says? È il progetto perfetto per imparare array, macchine a stati e gestione dell’input utente su Arduino. In questo tutorial, costruiremo un gioco Simon Says completamente funzionale usando quattro LED e quattro pulsanti, tutto simulato direttamente nel tuo browser con Velxio. Nessun hardware necessario!

Diagramma del circuito di simon-says sul canvas del simulatore Velxio

Panoramica del Circuito

Diamo un’occhiata ai componenti e a come sono collegati.

Componenti

ComponenteIDScopo
Arduino Unoarduino-unoIl cervello del gioco
LED Rossoled-redOutput per la sequenza rossa
LED Verdeled-greenOutput per la sequenza verde
LED Bluled-blueOutput per la sequenza blu
LED Gialloled-yellowOutput per la sequenza gialla
Pulsante Rossobutton-redInput utente per il rosso
Pulsante Verdebutton-greenInput utente per il verde
Pulsante Blubutton-blueInput utente per il blu
Pulsante Giallobutton-yellowInput utente per il giallo

Cablaggio

L’anodo (A) di ogni LED si collega a un pin digitale sull’Arduino, e il suo catodo (C) va a GND attraverso un resistore limitatore di corrente (simulato internamente). I pulsanti sono cablati con un piedino (1.l) a un pin digitale e l’altro piedino (2.l) a GND, utilizzando i resistori di pull-up interni dell’Arduino.

Tutte le connessioni di massa condividono il pin GND dell’Arduino.

Panoramica del Codice

Apri l’editor di codice in Velxio per vedere lo sketch completo.

Codice sorgente per simon-says nell'editor Monaco di Velxio

Costanti e Variabili

const int LED_PINS[] = {8, 9, 10, 11};
const int BUTTON_PINS[] = {2, 3, 4, 5};
const int NUM_LEDS = 4;

int sequence[100];
int sequenceLength = 0;
int currentStep = 0;

Definiamo array per i pin dei LED e dei pulsanti, in corrispondenza del cablaggio. sequence memorizza lo schema casuale (fino a 100 passi). sequenceLength tiene traccia di quanti passi il giocatore deve ripetere, e currentStep tiene traccia del progresso del giocatore.

Setup

void setup() {
  Serial.begin(9600);

  for (int i = 0; i < NUM_LEDS; i++) {
    pinMode(LED_PINS[i], OUTPUT);
    pinMode(BUTTON_PINS[i], INPUT_PULLUP);
  }

  randomSeed(millis());
  newGame();
}

Impostiamo i pin dei LED come output e i pin dei pulsanti come input con pull-up interni (così i pulsanti leggono LOW quando premuti). randomSeed(millis()) garantisce una sequenza diversa ogni partita. newGame() avvia il primo round.

Logica di Gioco

newGame() resetta la lunghezza della sequenza a 1, aggiunge un passo casuale e riproduce la sequenza.

void newGame() {
  sequenceLength = 1;
  currentStep = 0;
  addToSequence();
  playSequence();
}

void addToSequence() {
  sequence[sequenceLength - 1] = random(0, NUM_LEDS);
}

void playSequence() {
  for (int i = 0; i < sequenceLength; i++) {
    flashLED(sequence[i]);
    delay(500);
  }
}

void flashLED(int led) {
  digitalWrite(LED_PINS[led], HIGH);
  delay(300);
  digitalWrite(LED_PINS[led], LOW);
}

playSequence() scorre la sequenza memorizzata, accendendo ogni LED per 300ms con un intervallo di 500ms.

Loop Principale

void loop() {
  for (int i = 0; i < NUM_LEDS; i++) {
    if (digitalRead(BUTTON_PINS[i]) == LOW) {
      flashLED(i);

      if (i == sequence[currentStep]) {
        currentStep++;
        if (currentStep == sequenceLength) {
          delay(1000);
          sequenceLength++;
          currentStep = 0;
          addToSequence();
          playSequence();
        }
      } else {
        // Pulsante sbagliato - game over
        for (int j = 0; j < 3; j++) {
          for (int k = 0; k < NUM_LEDS; k++) {
            digitalWrite(LED_PINS[k], HIGH);
          }
          delay(200);
          for (int k = 0; k < NUM_LEDS; k++) {
            digitalWrite(LED_PINS[k], LOW);
          }
          delay(200);
        }
        newGame();
      }

      delay(300);
      while (digitalRead(BUTTON_PINS[i]) == LOW);
    }
  }
}

Il loop controlla continuamente tutti i pulsanti. Quando un pulsante viene premuto (LOW), accende il LED corrispondente. Se il pulsante premuto corrisponde al passo previsto (sequence[currentStep]), avanziamo. Se il giocatore completa la sequenza, aggiungiamo un nuovo passo e riproduciamo la sequenza più lunga. Se è sbagliato, tutti i LED lampeggiano tre volte e inizia una nuova partita.

Concetti Chiave

Insidie Comuni e Suggerimenti per il Debug

Estensioni Suggerite

Provalo Tu Stesso!

Pronto a giocare? Apri l’esempio live su Velxio e avvia la simulazione. Premi i pulsanti per ripetere la sequenza. Quanto lontano riesci ad arrivare?

Avvia Simon Says su Velxio

Buona costruzione!


Condividi su:
David Montero

Scritto da

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

Articoli correlati


Articolo precedente
Demo Display TFT ILI9341: Grafica e Palla Rimbalzante su Arduino
Articolo successivo
Ciclo di Colori RGB con LED e Arduino su Velxio