Simon : Répéter le motif
Fait partie de la section Projets du Journey Arduino de Coddy. Leçon 15 sur 24.
Après que la carte a joué, c’est à ton tour : répète les quatre couleurs dans le même ordre. Le sketch a besoin d’un nombre supplémentaire, step, qui compte le nombre de couleurs que tu as répétées jusque-là. La couleur sur laquelle tu dois appuyer ensuite est sequence[step].
Compte un appui lorsque le bouton est relâché, comme le jeu le fait déjà pour démarrer. À ce moment-là, sa lumière et sa note sont éteintes, et le sketch peut réagir proprement :
void checkPress(int i) {
if (i != sequence[step]) {
Serial.println("Wrong!");
playing = false;
return;
}
step++;
if (step == 4) {
Serial.println("Well done!");
playing = false;
}
}return quitte immédiatement la fonction ; ainsi, après une mauvaise couleur, rien de ce qui suit ne s’exécute. Remettre playing à false termine le jeu, et l’appui suivant en démarre un nouveau.
Chaque nouvelle partie doit repartir du début : définis step = 0 dans startGame().
Défi
DifficileLaisse le joueur répondre :
- un
int step = 0;, réinitialisé à 0 dansstartGame() - quand un bouton est relâché et que le jeu est
playing, appelercheckPress(i) - une couleur incorrecte affiche
Wrong!et termine le jeu - après quatre couleurs correctes, afficher
Well done!et terminer le jeu
Démarre Serial dans setup(). Appuie sur Run, observe, reproduis le motif, 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}; // do, mi, sol et do aigu
const int buzzerPin = 8;
int lastState[4] = {HIGH, HIGH, HIGH, HIGH}; // la dernière valeur lue pour chaque bouton
int sequence[4]; // les couleurs jouées par la carte
bool playing = false; // false jusqu'à ce qu'un appui démarre le jeu
// 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;
playSequence();
}
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(ledPins[i], OUTPUT);
pinMode(buttonPins[i], INPUT_PULLUP);
}
}
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();
}
}
lastState[i] = state;
}
}
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
1Feu de circulation
Cycle du feu de circulationFeu de circulation avec millis()Bouton de traverséeSignal piéton et buzzer4Simon
Simon : Boutons et notesSimon : Séquence aléatoireSimon : Répéter le motifSimon : Le jeu completEntraînez-vous par vous-même : Playground Arduino