Projet 2 – 40*2 character game

Do Ré Mi Fa Si-le

Yonathan Abad Jele – Sami Daoud – Mathilde Duquesne

DESCRIPTION

Notre jeu s’appelle Do Ré Mi Fa Si-le. C’est un jeu de mémoire qui reprend les règles du jeu de Simon. Le but est de retenir une mélodie aléatoire.

Nous avons créée deux versions du jeu. La première se joue avec des LED, et la seconde avec un écran LCD.

Dans la première version, le jeu, éclaire une des quatre LED et produit un son toujours associé à la LED, qui ont chacune une couleur différente. Le joueur doit alors appuyer sur la touche associé à la LED qui vient de s’allumer. Le jeu répète la même couleur et le même son, puis allume au hasard une nouvelle LED. Le joueur doit reproduire cette nouvelle séquence. Chaque fois que le joueur reproduit correctement la séquence, le jeu allume une nouvelle LED. Chaque note ajoutée constitue un nouveau niveau. Il y a 50 niveaux en tout.

La seconde version remplace les LED par un écran LCD. Il ne faut plus retenir quelle led s’est éclairée, mais l’emplacement de la croix sur l’écran. Chaque croix est associée à un bouton. Malheureusement cette version n’a pas abouti.

 

SCHÉMA FRITZING

Schéma de la première version de notre jeu, avec les LED.

Jeu

CODE SOURCE


jeu_arduino_lcd

Remarque:
Le code source implementé pour la seconde version de notre jeu (où nous utilisons l’écran LCD) n’est pas finie. Nous sommes presque arrivés à avoir le résultat voulu. La première version a été testée et marche bien.

 

//Simon

#include <LiquidCrystal.h>
//———————————————————
//Initialisation des LEDs et boutons poussoirs.
//int led1 = 2; //LED rouge
//int led2 = 3; //LED verte
//int led3 = 4; //LED bleue
//int led4 = 5; //LED jaune
LiquidCrystal lcd(11, 13, 4, 5, 2, 3);
int bouton1 = 6; //Bouton rouge
int bouton2 = 7; //Bouton vert
int bouton3 = 8; //Bouton bleu
int bouton4 = 12; //Bouton jaune
int speaker = 10; //Speaker

//Les numéros correspondent aux numéros d’entrées/sorties.
//Les 0 et 1 sont réservés aux transmissions/réceptions.

//Fréquences des sons de chaque couleur
//int son[] = {261, 330, 392, 523};
int son[] = {330, 330, 330, 330};
// Do, Mi, Sol, Do
//Tableau de séquence à jouer
int sequence[50];
//Personne ne dépasse jamais le niveau 50…

//———————————————————
// Routine d’initialisation.
// Le setup sera appelée à chaque démarrage ou reset.

void setup()
{
/// Serial.begin(9600);
//Initialisation des entrées/sorties
//pinMode(led1, OUTPUT);
//pinMode(led2, OUTPUT);
//pinMode(led3, OUTPUT);
//pinMode(led4, OUTPUT);
pinMode(bouton1, INPUT);
pinMode(bouton2, INPUT);
pinMode(bouton3, INPUT);
pinMode(bouton4, INPUT);
pinMode(speaker, OUTPUT);

// Afficher à l’écran
//lcd.print(« !!!!!!!!!!!! Welcome Benny !!!!!!!!!!!! »);
}

//———————————————————
// Boucle principale.
// La loop tournera jusqu’à extinction ou reset.

void loop()
{
randomSeed(analogRead(A0));

//Attente de pression sur une touche.
lectureBouton();

//Témoin de lancement du jeu.
// Effacer l’écran
//lcd.clear();
//lcd.print(« Let’s play »);
melodieLancement();
delay(2000);
//lcd.clear();

//Début du jeu
boolean gameOver = false;
int presse;
int niveau = 0;
while(!gameOver)
{
nouvelleNote(niveau); //Rajoute une note à la séquence.
jouerSequence(niveau); //Joue la séquence

for(int i=0; i<=niveau; i++) //Attend que le joueur tape chaque note de la séquence
{
presse = lectureBouton(); //Lecture du bouton appuyé par le joueur
jouerNote(presse); //Joue la note du joueur
if(presse!=sequence[i]) //Si la note est bonne, on continue, sinon GameOver
{
gameOver = true;
melodieGameOver();
}
if(gameOver) {break;}
}
niveau++;
delay(1000);
}
}

//———————————————————
//Fonction de lecture des boutons.
//L’arduino vérifie les boutons un par un, mais comme la vitesse d’une vérification
//est de l’ordre de la nanoseconde, l’ensemble est presque instantané.
int lectureBouton()
{
int boutonPresse = 0;

while(!boutonPresse)
{
if(digitalRead(bouton1))
{
boutonPresse = 1;
}
if(digitalRead(bouton2))
{
boutonPresse = 2;
}
if(digitalRead(bouton3))
{
boutonPresse = 3;
}
if(digitalRead(bouton4))
{
boutonPresse = 4;
}
}
return boutonPresse;
}
//———————————————————
//Fonction de lumière et de son
void jouerNote(int numero)
{
/*switch(numero)
{
case 1:
digitalWrite(led1, HIGH);
break;
case 2:
digitalWrite(led2, HIGH);
break;
case 3:
digitalWrite(led3, HIGH);
break;
case 4:
digitalWrite(led4, HIGH);
break;
}*/
tone(speaker, son[numero-1]); //Le tableau commence à 0 (non à 1)
delay(800);

/*digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);*/
noTone(speaker);
delay(200);
}

//———————————————————
//Joue toute la séquence
void jouerSequence(int niveau)
{
for(int i=0; i<=niveau; i++)
{
jouerNote(sequence[i]);
//lcd.clear();
if (sequence[i]==1) {
lcd.print(« X »);
// wait a bit for the entire message to arrive
delay(800);
// clear the screen
//lcd.clear();
}

else if (sequence[i]==2) {
lcd.print(« –X–« );
delay(800);
//lcd.clear();
}

else if (sequence[i]==3) {
lcd.print(« ——-X »);
delay(800);
//lcd.clear();
}

else if (sequence[i]==4) {
lcd.print(« ——XXX »);
delay(800);
//lcd.clear();
}
}
}
//———————————————————
//Nouvelle note aléatoire
void nouvelleNote(int niveau)
{
sequence[niveau] = (int)random(1,5);
}

//———————————————————
//Témoin lancement (petite séquence lumineuse)
void melodieLancement()
{
/*digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
tone(speaker, son[0]);
delay(300);
tone(speaker, son[1]);
delay(300);
tone(speaker, son[2]);
delay(300);
tone(speaker, son[3]);
delay(300);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
noTone(speaker);*/

tone(speaker, 440); //la
delay(400);
tone(speaker, 523); //do
delay(100);
tone(speaker, 523);
delay(100);
tone(speaker, 440); //la
delay(150);
tone(speaker, 392); //sol
delay(150);
tone(speaker, 330); //mi
delay(150);
tone(speaker, 330);
delay(150);
tone(speaker, 392); //sol
delay(150);
tone(speaker, 392); //sol
delay(150);
tone(speaker, 440); //la
delay(150);
tone(speaker, 392); //sol
delay(150);
tone(speaker, 392); //sol
delay(150);
tone(speaker, 330); //mi
delay(150);
tone(speaker, 294); //ré
delay(150);
tone(speaker, 262); //do
delay(150);

noTone(speaker);

}

//———————————————————
//Témoin Game Over
void melodieGameOver()
{
/*digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
tone(speaker, son[3]);
delay(150);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
delay(100);
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
tone(speaker, son[2]);
delay(100);
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
tone(speaker, son[1]);
delay(100);
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
tone(speaker, son[0]);
delay(100);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
delay(500);
noTone(speaker);*/

/*StarWars1
tone(speaker, 349);
delay(250);
tone(speaker, 415);
delay(500);
tone(speaker, 349);
delay(350);
tone(speaker, 440);
delay(125);
tone(speaker, 523);
delay(500);
tone(speaker, 440);
delay(375);
tone(speaker, 523);
delay(125);
tone(speaker, 659);
delay(650);
noTone(speaker); */

//StarWars2
/*tone(speaker, 440);
delay(500);
tone(speaker, 440);
delay(500);
tone(speaker, 440);
delay(500);
tone(speaker, 349);
delay(350);
tone(speaker, 523);
delay(150);
tone(speaker, 440);
delay(500);
tone(speaker, 349);
delay(350);
tone(speaker, 523);
delay(150);
tone(speaker, 440);

delay(650);
²delay(500);

tone(speaker, 659);
delay(500);
tone(speaker, 659);
delay(500);
tone(speaker, 659);
delay(500);
tone(speaker, 698);
delay(350);
tone(speaker, 523);
delay(150);
tone(speaker, 415);
delay(500);
tone(speaker, 349);
delay(350);
tone(speaker, 523);
delay(150);
tone(speaker, 440);

delay(500);

tone(speaker, 880);
delay(500);
tone(speaker, 440);
delay(300);
tone(speaker, 440);
delay(150);
tone(speaker, 880);
delay(500);
tone(speaker, 830);
delay(325);
tone(speaker, 784);
delay(175);
tone(speaker, 740);
delay(125);
tone(speaker, 698);
delay(125);
tone(speaker, 740);
delay(250);

delay(625);

tone(speaker, 455);
delay(250);
tone(speaker, 622);
delay(500);
tone(speaker, 587);
delay(325);
tone(speaker, 554);
delay(175);
tone(speaker, 523);
delay(125);
tone(speaker, 466);
delay(125);
tone(speaker, 523);
delay(250);

delay(350);

noTone(speaker); */

tone(speaker, 454);
delay(175);
tone(speaker, 423);
delay(125);
tone(speaker, 366);
delay(125);
tone(speaker, 300);
delay(250);

delay(350);

noTone(speaker);

}


Références pour le display:

http://www.buydisplay.com/download/manual/ERM4002-1_Series_Datasheet.pdf (voir la page 8)

http://arduino.cc/en/Tutorial/LiquidCrystal

Repérer les n° de PIN sur l’afficheur, et se fier au schéma de la librairie Arduino.
La résistance variable est indispensable, car elle permet de trouver le bon réglage pour le rétro-éclairage.

Laisser un commentaire

Votre e-mail ne sera jamais publié ni communiqué.

Vous pouvez utiliser ces balises et attributs HTML <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>