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
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 }
Generated on Thu Aug 4 2022 07:29:50 by 1.7.2