From 9646d260cbd379a0dd3fe4be2714da1aa12906f2 Mon Sep 17 00:00:00 2001 From: Montaigu-Lancelin Emilie Date: Thu, 15 Jan 2026 13:51:09 +0100 Subject: [PATCH] version finale --- BE c/projet/Application.cpp | 15 ++++- BE c/projet/Application.h | 6 +- BE c/projet/bdd.cpp | 129 ++++++++++++++++++++++++------------ BE c/projet/bdd.h | 8 ++- BE c/projet/bouton.cpp | 32 +++++---- BE c/projet/bouton.h | 1 + BE c/projet/led.cpp | 22 ++++-- BE c/projet/led.h | 3 + 8 files changed, 148 insertions(+), 68 deletions(-) diff --git a/BE c/projet/Application.cpp b/BE c/projet/Application.cpp index e803169..803af61 100644 --- a/BE c/projet/Application.cpp +++ b/BE c/projet/Application.cpp @@ -11,9 +11,10 @@ #include "bouton.h" #define buttonPinRelief D8 #define buttonPinPlat D6 +#define ledRougePin D7 Application::Application() - : ledPin(D7), colorR(255), colorG(100), colorB(100), boutonRelief(buttonPinRelief), boutonPlat(buttonPinPlat) {} + : ledPin(D7), colorR(255), colorG(100), colorB(100), boutonRelief(buttonPinRelief), boutonPlat(buttonPinPlat), ledRouge(ledRougePin){} Application::~Application() { /*if (boutonRelief != nullptr) { @@ -37,9 +38,17 @@ void Application::init(void) { void Application::run(void) { + gameOver = false; + nb_erreurs = 0; lcd.clear(); - lcd.print("On commence a jouer?"); + lcd.print("C'est parti !"); delay(1500); - listequestions_init(lcd, boutonRelief, boutonPlat); + listequestions_init(lcd, boutonRelief, boutonPlat,ledRouge); delay(100); + if (gameOver) { + lcd.clear(); + lcd.setCursor(0, 0); + lcd.print("GAME OVER"); + delay(5000); + } } \ No newline at end of file diff --git a/BE c/projet/Application.h b/BE c/projet/Application.h index 307866f..b23ca85 100644 --- a/BE c/projet/Application.h +++ b/BE c/projet/Application.h @@ -1,7 +1,7 @@ /********************************************************************* * @file Apllication.h - * @author - * @brief Fichier header de l'application + * @author Montaigu Emilie, Ouvrard Marine + * @brief Fichier source de l'application *********************************************************************/ #ifndef APPLICATION_H_ #define APPLICATION_H_ @@ -9,6 +9,7 @@ #include "ecran.h" #include "bdd.h" #include "bouton.h" +#include "led.h" /** * @class Application * @brief Classe Application @@ -22,6 +23,7 @@ public: ecran lcd; bouton boutonRelief; bouton boutonPlat; + led ledRouge; /** * @fn Application(); * @brief Constructeur par defaut diff --git a/BE c/projet/bdd.cpp b/BE c/projet/bdd.cpp index cfae87e..acd785b 100644 --- a/BE c/projet/bdd.cpp +++ b/BE c/projet/bdd.cpp @@ -1,20 +1,21 @@ #include "bdd.h" #include "ecran.h" #include "bouton.h" +#include "led.h" #include #include #include #include - +bool gameOver = false; using namespace std; - +int nb_erreurs = 0; // Tableau avec les réponses aux questions par catégorie // 1 = VRAI et 0 = FAUX -int reponses_disney[] = { 0, 1, 0 }; -int reponses_geographie[] = { 0, 1, 1 }; -int reponses_sciences[] = { 1, 0, 1 }; -int reponses_culture[] = { 1, 1, 1 }; -int reponses_animaux[] = { 0, 0, 1 }; +int reponses_disney[] = { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0 }; +int reponses_geographie[] = { 1, 1, 0, 1, 1, 1, 0, 0, 1, 0 }; +int reponses_sciences[] = { 1, 0, 1, 0, 1, 1, 0, 0, 1, 0 }; +int reponses_culture_g[] = { 1, 1, 1, 0, 1, 0, 0, 1, 0, 1 }; +int reponses_animaux[] = { 1, 0, 1, 1, 0, 1, 1, 1, 0, 0 }; void defileTexte(ecran &lcd, String texte) { int largeur = 32; @@ -31,7 +32,7 @@ void defileTexte(ecran &lcd, String texte) { } } -void listequestions_init(ecran &lcd, bouton &boutonRelief, bouton &boutonPlat) { +void listequestions_init(ecran &lcd, bouton &boutonRelief, bouton &boutonPlat,led &ledRouge) { list listeQ; //Crée la liste de thèmes list::iterator it; //Déclare un iterateur //Pousse les thème dans une liste @@ -58,20 +59,21 @@ void listequestions_init(ecran &lcd, bouton &boutonRelief, bouton &boutonPlat) { //Affiche le thème actuel it = listeQ.begin(); advance(it, TActuel); - lcd.setCursor(0, 1); - lcd.print((*it).c_str()); - delay(2000); + //lcd.setCursor(0, 1); + //lcd.print((*it).c_str()); + //delay(2000); - //Affiche les instruction par bouton + //Affiche les instructions par bouton lcd.clear(); lcd.setCursor(0, 0); - lcd.print(String(TActuel + 1) + (*it).c_str()); + lcd.print(String(TActuel + 1) + " " + (*it).c_str()); lcd.setCursor(0, 1); - lcd.print("Relief=OK, Plat=>"); + lcd.print("Relief OK Plat >"); delay(1000); // Attends la réponse de l'utilisateur bool choixUtilisateur = choix_bouton(boutonRelief, boutonPlat); + lcd.clear(); if (choixUtilisateur == 1) { // Bouton Relief = Valider le thème @@ -82,35 +84,69 @@ void listequestions_init(ecran &lcd, bouton &boutonRelief, bouton &boutonPlat) { } } - //Banque de questions pour le thème Disney - list Questions_Disney; - Questions_Disney.push_back("Patrick est le nom du cameleon de Raiponce ?"); - Questions_Disney.push_back("La robe de Tiana est verte ?"); - Questions_Disney.push_back("Cendrillon etait le premier disney ?"); + //Banque de questions pour le theme Disney + list Questions_Disney = { "Mickey est une souris ?", + "Patrick est le nom du cameleon dans Raiponce ?", + "La robe de Tiana est verte ?", + "Simba est un lion ?", + "Elsa est la soeur d Anna ?", + "Aladdin se passe en Chine ?", + "Cendrillon perd une pantoufle en verre ?", + "Ariel est une sirene ?", + "Le Genie est bleu ?", + "Bambi est un cochon ?" }; - //Banque de questions pour le thème Geographie + //Banque de questions pour le theme Geographie list Questions_Geographie; - Questions_Geographie.push_back("Rio de Janeiro est la capitale du Bresil ?"); - Questions_Geographie.push_back("L'Inde est le pays le plus peuple ?"); - Questions_Geographie.push_back("Les Pyrenees Atlantiques ont 64 en numéro de département ?"); + Questions_Geographie.push_back("Paris est la capitale de la France ?"); + Questions_Geographie.push_back("Le Sahara est le plus grand desert du monde ?"); + Questions_Geographie.push_back("Le Bresil parle principalement espagnol ?"); + Questions_Geographie.push_back("La Russie est plus grande que la Chine ?"); + Questions_Geographie.push_back("L'Europe est un continent ?"); + Questions_Geographie.push_back("Le Nil traverse plus de 5 pays ?"); + Questions_Geographie.push_back("L'Australie possede une frontiere terrestre ?"); + Questions_Geographie.push_back("Le Mont Blanc se situe en Italie ?"); + Questions_Geographie.push_back("L'Afrique est traversee par l'equateur ?"); + Questions_Geographie.push_back("Tokyo est la capitale de la Coree du Sud ?"); - //Banque de questions pour le thème Sciences + //Banque de questions pour le theme Sciences list Questions_Sciences; - Questions_Geographie.push_back("Le corps humain contient assez de fer pour faire un clou ?"); - Questions_Geographie.push_back("Les cheveux continuent de pousser après la mort ?"); - Questions_Geographie.push_back("Le cerveau ne ressent pas la douleur?"); + Questions_Sciences.push_back("Le corps humain contient assez de fer pour faire un clou ?"); + Questions_Sciences.push_back("Les cheveux continuent de pousser apres la mort ?"); + Questions_Sciences.push_back("Le cerveau ne ressent pas la douleur ?"); + Questions_Sciences.push_back("L'eau bout toujours a 100 degres Celsius ?"); + Questions_Sciences.push_back("La Terre tourne autour du Soleil ?"); + Questions_Sciences.push_back("Les plantes produisent de l'oxygene ?"); + Questions_Sciences.push_back("Les humains utilisent seulement 10% de leur cerveau ?"); + Questions_Sciences.push_back("Le son se propage plus vite dans l'air que dans l'eau ?"); + Questions_Sciences.push_back("Le sang est rouge a l'interieur du corps ?"); + Questions_Sciences.push_back("Les dinosaures ont vecu en meme temps que les humains ?"); - //Banque de questions pour le thème Culture Générale + //Banque de questions pour le theme Culture Generale list Questions_Culture_G; - Questions_Geographie.push_back("Le Soleil est une étoile ?"); - Questions_Geographie.push_back("Le français est parlé sur tous les continents ?"); - Questions_Geographie.push_back("Les Romains utilisaient déjà le béton ?"); + Questions_Culture_G.push_back("Le Soleil est une etoile ?"); + Questions_Culture_G.push_back("Le francais est parle sur tous les continents ?"); + Questions_Culture_G.push_back("Les Romains utilisaient deja le beton ?"); + Questions_Culture_G.push_back("La Tour Eiffel a ete construite au XXe siecle ?"); + Questions_Culture_G.push_back("L'eau est composee de deux atomes d'hydrogene et d'un atome d'oxygene ?"); + Questions_Culture_G.push_back("Napoleon Bonaparte etait italien ?"); + Questions_Culture_G.push_back("Le pingouin peut voler ?"); + Questions_Culture_G.push_back("La Joconde est exposee au Louvre ?"); + Questions_Culture_G.push_back("Le zero a ete invente avant les chiffres romains ?"); + Questions_Culture_G.push_back("La Lune influence les marees ?"); - //Banque de questions pour le thème Animaux + //Banque de questions pour le theme Animaux list Questions_Animaux; - Questions_Geographie.push_back("Les requins doivent nager en permanence pour survivre ?"); - Questions_Geographie.push_back("Les chauves-souris sont aveugles ?"); - Questions_Geographie.push_back("Les poissons dorment ?"); + Questions_Animaux.push_back("Les requins doivent nager en permanence pour survivre ?"); + Questions_Animaux.push_back("Les chauves-souris sont aveugles ?"); + Questions_Animaux.push_back("Les poissons dorment ?"); + Questions_Animaux.push_back("Les dauphins sont des mammiferes ?"); + Questions_Animaux.push_back("Les autruches peuvent voler ?"); + Questions_Animaux.push_back("Les elephants ont une excellente memoire ?"); + Questions_Animaux.push_back("Le koala est un marsupial ?"); + Questions_Animaux.push_back("Les pieuvres ont trois coeurs ?"); + Questions_Animaux.push_back("Le cameleon change de couleur pour se camoufler uniquement ?"); + Questions_Animaux.push_back("Les grenouilles respirent uniquement avec leurs poumons ?"); // Lance le quiz selon le thème choisi lcd.clear(); @@ -118,32 +154,32 @@ void listequestions_init(ecran &lcd, bouton &boutonRelief, bouton &boutonPlat) { case 0: lcd.print("Disney"); delay(2000); - play(lcd, Questions_Disney, reponses_disney, boutonRelief, boutonPlat); + play(lcd, Questions_Disney, reponses_disney, boutonRelief, boutonPlat, ledRouge); break; case 1: lcd.print("Geographie"); delay(2000); - play(lcd, Questions_Geographie, reponses_geographie, boutonRelief, boutonPlat); + play(lcd, Questions_Geographie, reponses_geographie, boutonRelief, boutonPlat, ledRouge); break; case 2: lcd.print("Sciences"); delay(2000); - play(lcd, Questions_Sciences, reponses_sciences, boutonRelief, boutonPlat); + play(lcd, Questions_Sciences, reponses_sciences, boutonRelief, boutonPlat, ledRouge); break; case 3: lcd.print("Culture Generale"); delay(2000); - play(lcd, Questions_Culture_G, reponses_culture, boutonRelief, boutonPlat); + play(lcd, Questions_Culture_G, reponses_culture_g, boutonRelief, boutonPlat, ledRouge); break; case 4: lcd.print("Animaux"); delay(2000); - play(lcd, Questions_Animaux, reponses_animaux, boutonRelief, boutonPlat); + play(lcd, Questions_Animaux, reponses_animaux, boutonRelief, boutonPlat, ledRouge); break; } } -void play(ecran &lcd, list Questions, int reponses[], bouton &boutonRelief, bouton &boutonPlat) { +void play(ecran &lcd, list Questions, int reponses[], bouton &boutonRelief, bouton &boutonPlat, led &ledRouge) { int score = 0; int questionNum = 0; list::iterator it; @@ -181,7 +217,16 @@ void play(ecran &lcd, list Questions, int reponses[], bouton &boutonReli score++; } else { lcd.clear(); - lcd.print("Faux !"); + lcd.print("Erreur !"); + lcd.setCursor(0, 1); + nb_erreurs++; + lcd.print(String("Nb err: ") + nb_erreurs); + ledRouge.cligno(); + if (nb_erreurs == 3) { + gameOver = true; + + return; + } } delay(2000); diff --git a/BE c/projet/bdd.h b/BE c/projet/bdd.h index 834573e..1c7d158 100644 --- a/BE c/projet/bdd.h +++ b/BE c/projet/bdd.h @@ -1,10 +1,12 @@ #ifndef bdd_H #define bdd_H #include "ecran.h" +#include "led.h" #include "bouton.h" #include #include - +extern bool gameOver; +extern int nb_erreurs; using namespace std; //Permet de faire défiler le texte sur l'écran @@ -12,9 +14,9 @@ using namespace std; void defileTexte(ecran &lcd, String texte); // Affiche les thèmes disponibles et lance le quiz correspondant -void listequestions_init(ecran &lcd, bouton &boutonRelief, bouton &boutonPlat); +void listequestions_init(ecran &lcd, bouton &boutonRelief, bouton &boutonPlat, led &ledRouge); //Fonction principale pour jouer à un quiz -void play(ecran &lcd, list Questions, int reponses[], bouton &boutonRelief, bouton &boutonPlat); +void play(ecran &lcd, list Questions, int reponses[], bouton &boutonRelief, bouton &boutonPlat, led &ledRouge); #endif \ No newline at end of file diff --git a/BE c/projet/bouton.cpp b/BE c/projet/bouton.cpp index 6571db3..936ea3f 100644 --- a/BE c/projet/bouton.cpp +++ b/BE c/projet/bouton.cpp @@ -8,45 +8,49 @@ bouton::bouton() bouton::bouton(int pin) : capteur(pin), etat(0) {} -//ccesseur de etat +//Accesseur de etat bool bouton::lire_etat() { - bool res; int buttonState = digitalRead(this->getpin()); - if (buttonState == HIGH) res = 1; - else res = 0; - return res; + if (buttonState == HIGH) { + this->etat = 1; // Met à jour etat + } else { + this->etat = 0; // Met à jour etat + } + return this->etat; +} + +// Redéfinition de l'opérateur +bool bouton::operator!() const { + return this->etat == 0; } bool choix_bouton(bouton &Brelief, bouton &Bplat) { - Serial.println("A"); //a enlever - //Attends que les 2 bouttons soient relachés - while (Brelief.lire_etat() == 1 || Bplat.lire_etat() == 1) { + while (!(!Brelief) || !(!Bplat)) { + Brelief.lire_etat(); + Bplat.lire_etat(); delay(10); } - Serial.println("A"); //a enlever //Attends que l'un des boutons soit appuyé - while (Brelief.lire_etat() == 0 && Bplat.lire_etat() == 0) { + while (!Brelief && !Bplat) { + Brelief.lire_etat(); + Bplat.lire_etat(); delay(10); } - //Stocke l'état des boutons bool reliefPresse = Brelief.lire_etat(); bool platPresse = Bplat.lire_etat(); - Serial.println("A"); //a enlever //Boucle qui renvoie 1 si bouton relief et renvoie 0 si bouton plat if (reliefPresse) { - Serial.println("A"); while (Brelief.lire_etat() == 1) { delay(10); } return 1; } else if (platPresse) { - Serial.println("A"); while (Bplat.lire_etat() == 1) { delay(10); } diff --git a/BE c/projet/bouton.h b/BE c/projet/bouton.h index 7400a0a..bd82a36 100644 --- a/BE c/projet/bouton.h +++ b/BE c/projet/bouton.h @@ -11,6 +11,7 @@ public: bouton(); bouton(int pin); bool lire_etat(); //Accesseur de etat + bool operator!() const; }; //Renvoie 1 si bouton relief et renvoie 0 si bouton plat diff --git a/BE c/projet/led.cpp b/BE c/projet/led.cpp index 178893b..af8b192 100644 --- a/BE c/projet/led.cpp +++ b/BE c/projet/led.cpp @@ -1,10 +1,24 @@ #include "led.h" +#include -//Constructeur -led::led() - : actionneur(), pin(0), etat(0) {} +//Constructeur par defaut +led::led() : actionneur(), pin(0), etat(0) {} + +// Constructeur avec pin +led::led(int p) : actionneur(), pin(p), etat(0) {} + +// Getter pour le pin +int led::getPin() const { + return this->pin; +} //Initialise la LED en OUTPUT void led::init() { - pinMode(pin, OUTPUT); + pinMode(this->pin, OUTPUT); +} + +void led::cligno() { + digitalWrite(this->pin, HIGH); + delay(3000); + digitalWrite(this->pin, LOW); } \ No newline at end of file diff --git a/BE c/projet/led.h b/BE c/projet/led.h index 7d2eba7..ff9d0f0 100644 --- a/BE c/projet/led.h +++ b/BE c/projet/led.h @@ -9,7 +9,10 @@ private: bool etat; public: led(); + led(int p); void init(void); //Initialise la LED en OUTPUT + void cligno(void); + int getPin() const; }; #endif \ No newline at end of file