Menu
CoddyTech

Simon : Le jeu complet

Fait partie de la section Projets du Journey Arduino de Coddy. Leçon 16 sur 24.

Un vrai Simon commence petit et s’allonge. Le tour 1 joue une couleur. Chaque fois que tu répètes correctement un tour, le plateau garde les mêmes couleurs et en ajoute une à la fin, jusqu’à ce que tu commettes une erreur.

Le tableau doit avoir assez de place pour une longue partie, ainsi qu’une variable length indiquant quelle partie est utilisée. Ajouter une couleur se fait en deux lignes :

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

Initialise la graine une seule fois, au démarrage du jeu. playSequence() joue maintenant length couleurs au lieu de quatre, et un tour se termine quand step atteint length.

Une erreur met fin au jeu avec un son qui n’est clairement pas une note, à 110 Hz pendant une seconde, et affiche le score : les tours terminés, length - 1, puisque le tour perdu ne compte pas.

Le tableau contient 20 places et le programme ne doit jamais écrire au-delà de sa fin : un joueur qui répète 20 couleurs gagne.

challenge icon

Défi

Difficile

Transforme-le en jeu complet :

  • const int MAX_STEPS = 20;, int sequence[MAX_STEPS]; et int length = 0;
  • une partie commence avec une couleur ; chaque manche répétée correctement en ajoute une et les joue toutes
  • une erreur : 110 Hz pendant 1000 ms, puis affiche Game over! Score: et le score, et termine la partie
  • 20 couleurs répétées correctement : affiche You win! et termine la partie

Appuie sur Run, vois jusqu'où tu arrives, puis clique sur Check.

Essayez vous-même

// Une entrée par couleur : rouge, vert, bleu, jaune
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 et C aigu
const int buzzerPin = 8;

int lastState[4] = {HIGH, HIGH, HIGH, HIGH};  // la dernière lecture de chaque bouton

int sequence[4];       // les couleurs jouées par la carte
bool playing = false;  // false jusqu’à ce qu’un appui démarre la partie
int step = 0;          // le nombre de couleurs que le joueur a répétées

// Allumer la couleur i et jouer sa note.
void lightOn(int i) {
  digitalWrite(ledPins[i], HIGH);
  tone(buzzerPin, notes[i]);
}

// Éteindre la couleur i et arrêter le son.
void lightOff(int i) {
  digitalWrite(ledPins[i], LOW);
  noTone(buzzerPin);
}

// Jouer la séquence : chaque couleur pendant 400 ms, puis 200 ms de silence.
void playSequence() {
  delay(500);
  for (int i = 0; i < 4; i++) {
    lightOn(sequence[i]);
    delay(400);
    lightOff(sequence[i]);
    delay(200);
  }
}

// Choisir une nouvelle séquence aléatoire et la jouer.
void startGame() {
  randomSeed(micros());
  for (int i = 0; i < 4; i++) {
    sequence[i] = random(4);
  }
  playing = true;
  step = 0;
  playSequence();
}

// Le joueur a relâché la couleur i : est-ce la suivante dans la séquence ?
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) {  // enfoncé
      lightOn(i);
    }
    if (state == HIGH && lastState[i] == LOW) {  // relâché
      lightOff(i);
      if (playing == false) {
        startGame();
      } else {
        checkPress(i);
      }
    }
    lastState[i] = state;
  }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Projets

Entraînez-vous par vous-même : Playground Arduino