Labyrinthe où le joueur contrôle sa position avec sa voix (Speech recognizer de Grove)

Dependencies:   TS_DISCO_F746NG mbed LCD_DISCO_F746NG BSP_DISCO_F746NG

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 #include "TS_DISCO_F746NG.h" 
00004 
00005 #include "LCD_DISCO_F746NG.h"
00006 
00007 #include <stdio.h>
00008 
00009 #define MAX 10
00010 
00011 LCD_DISCO_F746NG lcd;
00012 Serial pc(USBTX, USBRX, 115200);
00013 Serial groove(A4, A5, 9600);
00014 TS_DISCO_F746NG boutton;
00015 int x = 0, y = 0; //Position des objets sur l'écran LCD
00016 
00017 
00018 
00019 uint8_t status; 
00020 const char laby[11][11] = {  //Le labyrinthe sous forme de tableau 2d
00021     "**********",
00022     "* *      *",
00023     "* ****** *",
00024     "*        *",
00025     "****** ***",
00026     "*       **",
00027     "* ** *** *",
00028     "* ****** *",
00029     "*        O",
00030     "**********",
00031 };
00032 
00033 
00034 
00035 const char * voiceBuffer[] = {    //Liste des commandes (La liste du dispositif commence par contre par 1 et non 0 comme dans notre tableau)
00036     "Turn on the light",
00037     "Turn off the light",
00038     "Play music",
00039     "Pause",
00040     "Next",
00041     "Previous",
00042     "Up",
00043     "Down",
00044     "Turn on the TV",
00045     "Turn off the TV",
00046     "Increase temperature",
00047     "Decrease temperature",
00048     "What's the time",
00049     "Open the door",
00050     "Close the door",
00051     "Left",
00052     "Right",
00053     "Stop",
00054     "Start",
00055     "Mode 1",
00056     "Mode 2",
00057     "Go",
00058 };
00059 
00060 
00061 
00062 
00063 void TryMove(int * joueurX, int * joueurY, int vx, int vy) {  //Fonction effectuant le mouvement du joueur tout en vérifiant sa faisabilité
00064                                                               //(Si la case de la direction choisit est vide ou contient "*" qui correspond ‡ un mur)
00065     if (laby[ * joueurY + vy][ * joueurX + vx] == '*')
00066         return;
00067     ( * joueurX) += vx;
00068     ( * joueurY) += vy;
00069 }
00070 
00071 
00072 
00073 void Afficher(int joueurX, int joueurY) {  // Fonction affichant le labyrinthe et la position du joueur
00074 
00075     for (int i = 0; i < MAX; i++) {  //On place les blocs, les cases vides et le joueur ligne par ligne, de gauche ‡ droite
00076         for (int j = 0; j < MAX; j++) {
00077             if (j == joueurX && i == joueurY) {
00078                 lcd.DisplayChar(x + (48 / 2) - 8, y + (27 / 2) - 8, 'P');
00079             }
00080             if (laby[i][j] == '*') {
00081                 lcd.DrawRect(x, y, 48, 27);
00082             }
00083             if (laby[i][j] == 'O') {
00084                 lcd.DrawCircle(x + 48 / 2, y + 27 / 2, 13);
00085             }
00086 
00087             x += 48; //Passage à la colonne de droite
00088         }
00089         y += 27; //passage à la ligne suivante
00090         x = 0; //retour à la premiere colonne
00091     }
00092 
00093 
00094     y = 0; //retour à la premiere ligne
00095 
00096 }
00097 
00098 
00099 int main() {
00100 
00101     int joueurX = 8, joueurY = 8, xtouch, ytouch, idx;
00102     char cmd;
00103     bool bon = false, win = false;
00104 
00105     TS_StateTypeDef TS_State;
00106 
00107 
00108     lcd.SetFont( & Font16);
00109     lcd.SetBackColor(LCD_COLOR_GREEN);
00110 
00111 
00112 
00113     while (1) {
00114         
00115         /******* ECRAN DE DEPART *******/
00116         
00117         
00118         lcd.Clear(LCD_COLOR_BLUE);
00119         lcd.DisplayStringAt(0, LINE(1), (uint8_t * )
00120             "Toucher pour commencer le labyrinthe", LEFT_MODE);
00121 
00122 
00123         while (bon == false) {
00124             boutton.GetState( & TS_State);
00125             if (TS_State.touchDetected) {
00126                 xtouch = TS_State.touchX[idx];
00127                 ytouch = TS_State.touchY[idx];
00128                 if ((xtouch > 0) && (xtouch < 450) && (ytouch > 0) && (ytouch < 250)) {
00129 
00130                     bon = true;
00131                     win = false;
00132                     lcd.Clear(LCD_COLOR_BLUE);
00133                 }
00134 
00135             }
00136         }
00137 
00138 
00139 
00140 /******* DEBUT DU JEU*******/
00141 
00142 
00143         Afficher(joueurX, joueurY);
00144 
00145         while (win == false) {
00146 
00147 
00148 
00149 
00150             if (groove.readable()) {  //Lorsque des informations transites on lit le dispositif
00151 
00152                 pc.printf("READABLE \n \r");
00153                 cmd = groove.getc();
00154                 pc.printf("Commande : %s \n \r ", voiceBuffer[cmd - 1]); 
00155 
00156 
00157                 while (!groove.readable() && win==false) {  //Mouvement effectué continuellement tant que le joueur ne parle pas à nouveau
00158                     switch (cmd) {
00159 
00160                         case 7:
00161                             TryMove( & joueurX, & joueurY, 0, -1); // Mouvement BAS
00162                             break;
00163                         case 8:
00164                             TryMove( & joueurX, & joueurY, 0, 1); // Mouvement HAUT
00165                             break;
00166                         case 16:
00167                             TryMove( & joueurX, & joueurY, -1, 0); // Mouvement GAUCHE
00168                             break;
00169                         case 17:
00170                             TryMove( & joueurX, & joueurY, 1, 0); // Mouvement DROITE
00171                             break;
00172 
00173                     }
00174                     
00175                     
00176                     
00177 
00178                     pc.printf("Mouvement joueur : %s \n \r", voiceBuffer[cmd - 1]);
00179                     //wait(2);
00180                     lcd.Clear(LCD_COLOR_BLUE);  // A chaque mouvement on efface l'Ècran puis on redessine le labyrinthe et le joueur
00181                     Afficher(joueurX, joueurY);
00182                     wait(1);
00183                     
00184                     
00185 
00186                     if (joueurX == 9 && joueurY == 8) {  // En cas de victoire
00187                         win = true;
00188                         bon = false;
00189                         joueurX=1;
00190                         joueurY=1;
00191                         lcd.Clear(LCD_COLOR_BLUE);
00192                         lcd.DisplayStringAt(0, LINE(5), (uint8_t * )
00193                             "PARTIE GAGNER !", CENTER_MODE);
00194                         wait(1);
00195                     }
00196                     
00197                     
00198                     
00199                     wait(1);
00200                 }
00201             }
00202         }
00203     }
00204 }