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.
Défi
DifficileTransforme-le en jeu complet :
const int MAX_STEPS = 20;,int sequence[MAX_STEPS];etint 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;
}
}
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