#include "pitches.h" // les notes de musique
#include <MD_Parola.h>
/* Constants - define pin numbers for LEDs,
buttons and speaker, and also the game tones: */
const byte ledPins [] = {13,12,4,10};
const byte buttonPins[] = {9 ,8 ,7 ,6};
#define SPEAKER_PIN 2
#define MAX_GAME_LENGTH 100
const int gameTones[] = { NOTE_G3, NOTE_C4, NOTE_E4, NOTE_G5};
/* Global variables - store the game state */
byte gameSequence[MAX_GAME_LENGTH] = {0};
byte gameIndex = 0;
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 2
#define CLK_PIN A3
#define DATA_PIN A5
#define CS_PIN A4
MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
/**
Set up the Arduino board and initialize Serial communication
*/
void setup()
{
Serial.begin(9600);
for (byte i = 0; i < 4; i++)
{
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], 1);
pinMode(buttonPins[i], INPUT_PULLUP);
}
delay(1000);
pinMode(SPEAKER_PIN, OUTPUT);
// The following line primes the random number generator.
// It assumes pin A0 is floating (disconnected):
randomSeed(analogRead(A0));
}
/******************************************************************
The main game loop
******************************************************************/
void loop() {
// Add a random color to the end of the sequence
gameSequence[gameIndex] = random(0, 4); // nombre aléatoire entre 0 et 3
gameIndex++;
if (gameIndex >= MAX_GAME_LENGTH)
{
gameIndex = MAX_GAME_LENGTH - 1;
}
playSequence();
if (!checkUserSequence())
{
gameOver();
}
delay(300);
if (gameIndex > 0)
{
playLevelUpSound();
delay(300);
}
}
/**
Lights the given LED and plays a suitable tone
*/
void lightLedAndPlayTone(byte ledIndex)
{
digitalWrite(ledPins[ledIndex], 0);
tone(SPEAKER_PIN, gameTones[ledIndex]);
delay(500);
digitalWrite(ledPins[ledIndex], 1);
noTone(SPEAKER_PIN);
}
/**
Plays the current sequence of notes that the user has to repeat
*/
void playSequence()
{
for (int i = 0; i < gameIndex; i++)
{
byte currentLed = gameSequence[i];
lightLedAndPlayTone(currentLed);
delay(50);
}
}
/**
Waits until the user pressed one of the buttons,
and returns the index of that button
*/
byte readButtons()
{
while (true)
{
for (byte i = 0; i < 4; i++)
{
byte buttonPin = buttonPins[i];
if (digitalRead(buttonPin) == LOW)
{
return i;
}
}
delay(1);
}
}
/**
Play the game over sequence, and report the game score
*/
void gameOver()
{
Serial.print("Game over! your score: ");
Serial.println(gameIndex - 1);
gameIndex = 0;
delay(200);
// Play a Wah-Wah-Wah-Wah sound
tone(SPEAKER_PIN, NOTE_DS5);
delay(300);
tone(SPEAKER_PIN, NOTE_D5);
delay(300);
tone(SPEAKER_PIN, NOTE_CS5);
delay(300);
for (byte i = 0; i < 10; i++)
{
for (int pitch = -10; pitch <= 10; pitch++)
{
tone(SPEAKER_PIN, NOTE_C5 + pitch);
delay(5);
}
}
noTone(SPEAKER_PIN);
delay(500);
}
/**
Get the user's input and compare it with the expected sequence.
*/
bool checkUserSequence()
{
for (int i = 0; i < gameIndex; i++)
{
byte expectedButton = gameSequence[i];
byte actualButton = readButtons();
lightLedAndPlayTone(actualButton);
if (expectedButton != actualButton)
{
return false;
}
}
return true;
}
/**
Plays a hooray sound whenever the user finishes a level
*/
void playLevelUpSound()
{
tone(SPEAKER_PIN, NOTE_E4);
delay(150);
tone(SPEAKER_PIN, NOTE_G4);
delay(150);
tone(SPEAKER_PIN, NOTE_E5);
delay(150);
tone(SPEAKER_PIN, NOTE_C5);
delay(150);
tone(SPEAKER_PIN, NOTE_D5);
delay(150);
tone(SPEAKER_PIN, NOTE_G5);
delay(150);
noTone(SPEAKER_PIN);
}