Retour

Construisez un jeu Simon Says avec Arduino sur Velxio

Introduction

Vous vous souvenez du jeu classique Simon Says ? C’est le projet parfait pour apprendre les tableaux, les machines d’état et la gestion des entrées utilisateur sur Arduino. Dans ce tutoriel, nous allons construire un jeu Simon Says entièrement fonctionnel utilisant quatre LEDs et quatre boutons poussoirs, le tout simulé directement dans votre navigateur avec Velxio. Aucun matériel nécessaire !

Schéma du circuit de Simon Says sur le simulateur Velxio

Présentation du circuit

Examinons les composants et leurs connexions.

Composants

ComposantIDObjectif
Arduino Unoarduino-unoLe cerveau du jeu
LED Rougeled-redSortie pour la séquence rouge
LED Verteled-greenSortie pour la séquence verte
LED Bleueled-blueSortie pour la séquence bleue
LED Jauneled-yellowSortie pour la séquence jaune
Bouton Rougebutton-redEntrée utilisateur pour le rouge
Bouton Vertbutton-greenEntrée utilisateur pour le vert
Bouton Bleubutton-blueEntrée utilisateur pour le bleu
Bouton Jaunebutton-yellowEntrée utilisateur pour le jaune

Câblage

L’anode (A) de chaque LED est connectée à une broche numérique de l’Arduino, et sa cathode (C) va à GND via une résistance de limitation de courant (simulée en interne). Les boutons sont câblés avec une patte (1.l) sur une broche numérique et l’autre patte (2.l) sur GND, en utilisant les résistances de tirage internes de l’Arduino.

Toutes les connexions de masse partagent la broche GND de l’Arduino.

Présentation du code

Ouvrez l’éditeur de code dans Velxio pour voir le sketch complet.

Code source de Simon Says dans l'éditeur Monaco de Velxio

Constantes et variables

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;

Nous définissons des tableaux pour les broches des LEDs et des boutons, correspondant au câblage. sequence stocke le motif aléatoire (jusqu’à 100 étapes). sequenceLength suit le nombre d’étapes que le joueur doit répéter, et currentStep suit la progression du joueur.

Configuration

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();
}

Nous configurons les broches des LEDs en sorties et les broches des boutons en entrées avec résistances de tirage internes (les boutons lisent LOW lorsqu’ils sont pressés). randomSeed(millis()) garantit une séquence différente à chaque partie. newGame() démarre le premier tour.

Logique du jeu

newGame() réinitialise la longueur de la séquence à 1, ajoute une étape aléatoire et joue la séquence.

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() parcourt la séquence stockée, en faisant clignoter chaque LED pendant 300ms avec un intervalle de 500ms.

Boucle 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 {
        // Mauvais bouton - fin de partie
        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);
    }
  }
}

La boucle vérifie en continu tous les boutons. Lorsqu’un bouton est pressé (LOW), elle fait clignoter la LED correspondante. Si le bouton pressé correspond à l’étape attendue (sequence[currentStep]), nous avançons. Si le joueur termine la séquence, nous ajoutons une nouvelle étape et jouons la séquence plus longue. En cas d’erreur, toutes les LEDs clignotent trois fois et une nouvelle partie commence.

Concepts clés

Pièges courants et conseils de débogage

Extensions suggérées

Essayez par vous-même !

Prêt à jouer ? Ouvrez l’exemple en direct sur Velxio et démarrez la simulation. Appuyez sur les boutons pour répéter la séquence. Jusqu’où pouvez-vous aller ?

Lancer Simon Says sur Velxio

Bon montage !


Partager sur :
David Montero

Écrit par

David Montero

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

GitHub velxio.dev

Articles liés


Article précédent
Démo d'affichage TFT ILI9341 — Graphismes et balle rebondissante sur Arduino
Article suivant
Cyclage de couleurs d'une LED RVB avec Arduino sur Velxio