Mini projet LOO

Dependencies:   mbed APDS_9960 mbed-rtos

Dependents:   MoveYourTetris_OK

Home du projet

Committer:
Willheisen
Date:
Sun Apr 24 22:11:55 2016 +0000
Revision:
40:08490d120ec4
Parent:
38:418278e5eb6b
VERSION FINALE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Willheisen 8:92d0c4961a16 1 #include "cJeu.h"
clementdoreau 23:298a1314fc81 2 #include "rtos.h"
Willheisen 36:f58a566595ad 3 #include "cScore.h"
clementdoreau 25:b59758a85ed3 4
clementdoreau 25:b59758a85ed3 5
clementdoreau 25:b59758a85ed3 6
Willheisen 24:9f3005f1ba96 7 //Constructeur par défaut
Willheisen 8:92d0c4961a16 8 cJeu::cJeu()
Willheisen 8:92d0c4961a16 9 {
Willheisen 34:3f8df7ccfcbc 10 _mat = new cMatrice(8, 8);
Willheisen 21:f0cf4173ecdb 11 }
Willheisen 21:f0cf4173ecdb 12
Willheisen 24:9f3005f1ba96 13 //Second constructeur:
Willheisen 24:9f3005f1ba96 14 //Il crée de crée une matrice de x LEDs de large sur y LEDS de HAUT,
Willheisen 24:9f3005f1ba96 15 //avec la broche pin comme entrée d'interruption si détection de mouvement du capteur
Willheisen 38:418278e5eb6b 16 //Entrées: x: nombre de colonnes, y: nombre de lignes
clementdoreau 25:b59758a85ed3 17 cJeu::cJeu(unsigned char x, unsigned char y)
Willheisen 21:f0cf4173ecdb 18 {
clementdoreau 37:a08a58f5e9aa 19 // On met le score à 0
clementdoreau 37:a08a58f5e9aa 20 _score = 0;
Willheisen 21:f0cf4173ecdb 21 //on crée une nouvelle matrice
Willheisen 21:f0cf4173ecdb 22 _mat = new cMatrice(x, y);
Willheisen 8:92d0c4961a16 23 //on initialise la générateur de nombres pseudo-aléatoires
clementdoreau 10:9ef3f520ff6c 24 srand(time(NULL));
Willheisen 9:6f3d8b714a59 25 }
Willheisen 8:92d0c4961a16 26
Willheisen 24:9f3005f1ba96 27 //Accesseur qui retourne un pointeur sur la matrice
Willheisen 16:5c3d61584f51 28 cMatrice* cJeu::get_matrice()
Willheisen 13:336220ac9a8b 29 {
Willheisen 13:336220ac9a8b 30 return _mat;
Willheisen 13:336220ac9a8b 31 }
Willheisen 13:336220ac9a8b 32
Willheisen 24:9f3005f1ba96 33 //Accesseur qui retourne la valeur du score du joueur
Willheisen 13:336220ac9a8b 34 unsigned char cJeu::get_score()
Willheisen 13:336220ac9a8b 35 {
Willheisen 13:336220ac9a8b 36 return _score;
Willheisen 13:336220ac9a8b 37 }
Willheisen 13:336220ac9a8b 38
Willheisen 24:9f3005f1ba96 39 //Accesseur qui retourne un pointeur sur la valeur du mouvement détecté
Willheisen 24:9f3005f1ba96 40 unsigned char *cJeu::getDetec()
Willheisen 24:9f3005f1ba96 41 {
Willheisen 34:3f8df7ccfcbc 42 return &_detec;
clementdoreau 23:298a1314fc81 43 }
clementdoreau 23:298a1314fc81 44
Willheisen 24:9f3005f1ba96 45 //Mutateur pour la matrice
Willheisen 16:5c3d61584f51 46 void cJeu::set_matrice(cMatrice *mat)
Willheisen 13:336220ac9a8b 47 {
Willheisen 13:336220ac9a8b 48 _mat = mat;
Willheisen 13:336220ac9a8b 49 }
Willheisen 13:336220ac9a8b 50
Willheisen 24:9f3005f1ba96 51
Willheisen 24:9f3005f1ba96 52 //Mutateur pour le score
Willheisen 13:336220ac9a8b 53 void cJeu::set_score(unsigned char sc)
Willheisen 13:336220ac9a8b 54 {
Willheisen 13:336220ac9a8b 55 _score = sc;
Willheisen 13:336220ac9a8b 56 }
Willheisen 16:5c3d61584f51 57
Willheisen 36:f58a566595ad 58 //Mutateur pour la valeur du mouvement détecté
Willheisen 34:3f8df7ccfcbc 59 void cJeu::setDetec(unsigned char detec)
Willheisen 34:3f8df7ccfcbc 60 {
Willheisen 34:3f8df7ccfcbc 61 _detec = detec;
Willheisen 34:3f8df7ccfcbc 62 }
Willheisen 34:3f8df7ccfcbc 63
Willheisen 36:f58a566595ad 64 //Mutateur pour récupérer la valeur de mouvement depuis le 2e thread via le Message queue
Willheisen 34:3f8df7ccfcbc 65 void cJeu::setQueue(osMessageQId* queue, osPoolId* pool)
Willheisen 34:3f8df7ccfcbc 66 {
Willheisen 34:3f8df7ccfcbc 67 _queue = queue;
Willheisen 34:3f8df7ccfcbc 68 _pool = pool;
Willheisen 34:3f8df7ccfcbc 69 }
Willheisen 34:3f8df7ccfcbc 70
Willheisen 24:9f3005f1ba96 71 //Méthode d'initialisation de la liaison SPI et de la matrice RGB
Willheisen 8:92d0c4961a16 72 void cJeu::initialiser()
Willheisen 8:92d0c4961a16 73 {
Willheisen 36:f58a566595ad 74 //paramètres: fréquence 100kHz (maximum pour la matrice RGB 125KHz)
clementdoreau 35:7aef0bbdf335 75 _spi.initSPI(100000);
Willheisen 36:f58a566595ad 76 //envoi la matrice de LED le nombre de matrices à contrôler (par DaisyChain)
Willheisen 36:f58a566595ad 77 _spi.setNbMatrice(2);
Willheisen 36:f58a566595ad 78 //effacement de la matrice
Willheisen 16:5c3d61584f51 79 _mat->clear();
clementdoreau 19:9e3551d418d5 80 _spi.envoyerMatrice(*_mat);
Willheisen 36:f58a566595ad 81 wait(1);
Willheisen 38:418278e5eb6b 82 // On affiche le début du message d'accueil MoveYourTetris
Willheisen 36:f58a566595ad 83 _mat->messageAccueil();
Willheisen 36:f58a566595ad 84 _spi.envoyerMatrice(*_mat);
Willheisen 36:f58a566595ad 85 wait(1);
Willheisen 36:f58a566595ad 86 int i;
Willheisen 36:f58a566595ad 87 i=0;
Willheisen 38:418278e5eb6b 88 //On décale le message pour affichage
Willheisen 36:f58a566595ad 89 while(i<51) {//67 - 16= nbColonnes du message - nbLignes de la matrice
Willheisen 36:f58a566595ad 90 _mat->decalerMatrice();
Willheisen 36:f58a566595ad 91 _spi.envoyerMatrice(*_mat);
Willheisen 36:f58a566595ad 92 wait(0.1);
Willheisen 36:f58a566595ad 93 i++;
Willheisen 36:f58a566595ad 94 }
Willheisen 36:f58a566595ad 95 //On colore toute la matrice en bleue
Willheisen 36:f58a566595ad 96 for(unsigned char i = 0; i < _mat->getCol(); i++) {
Willheisen 36:f58a566595ad 97 for(unsigned char j = 0; j < _mat->getLig()/2; j++) {
Willheisen 36:f58a566595ad 98 wait_ms(1);
Willheisen 36:f58a566595ad 99 _mat->setValTab(i, j, LED_BLEU_FONCE);
Willheisen 36:f58a566595ad 100 _spi.envoyerMatrice(*_mat);
Willheisen 36:f58a566595ad 101 }
Willheisen 36:f58a566595ad 102 }
Willheisen 36:f58a566595ad 103 for(unsigned char i = 0; i < _mat->getCol(); i++) {
Willheisen 36:f58a566595ad 104 for(unsigned char j = _mat->getLig()/2; j < _mat->getLig(); j++) {
Willheisen 36:f58a566595ad 105 wait_ms(1);
Willheisen 36:f58a566595ad 106 _mat->setValTab(i, j, LED_BLEU_FONCE);
Willheisen 36:f58a566595ad 107 _spi.envoyerMatrice(*_mat);
Willheisen 36:f58a566595ad 108 }
Willheisen 36:f58a566595ad 109 }
Willheisen 38:418278e5eb6b 110 //Enfin on efface la matrice
Willheisen 36:f58a566595ad 111 _mat->clear();
Willheisen 36:f58a566595ad 112 _spi.envoyerMatrice(*_mat);
Willheisen 8:92d0c4961a16 113 }
Willheisen 8:92d0c4961a16 114
Willheisen 24:9f3005f1ba96 115 //Méthode de création d'une nouvelle pièce de manière pseudo-aléatoire
Willheisen 38:418278e5eb6b 116 //Entrées
Willheisen 14:6b6aa696680f 117 void cJeu::nouvellePiece()
Willheisen 8:92d0c4961a16 118 {
Willheisen 24:9f3005f1ba96 119 //On génère un nombre aléatoire entre 1 et 5 pour la pièce
Willheisen 21:f0cf4173ecdb 120 unsigned char nb = 1 + ((float)rand()/RAND_MAX) * 5;
Willheisen 24:9f3005f1ba96 121 //On génère un deuxième nombre pour choisir la couleur de la pièce
Willheisen 21:f0cf4173ecdb 122 unsigned char couleur = 1 + ((float)rand()/RAND_MAX) * 7;
Willheisen 24:9f3005f1ba96 123 //Selon le nombre généré, on va créer une nouvelle pièce
clementdoreau 10:9ef3f520ff6c 124 switch(nb) {
Willheisen 24:9f3005f1ba96 125 //On crée une pièce "L"
Willheisen 8:92d0c4961a16 126 case 1: {
clementdoreau 17:e03163d4e367 127 _ptrForme = new cEl(3,0);
Willheisen 8:92d0c4961a16 128 break;
Willheisen 8:92d0c4961a16 129 }
Willheisen 24:9f3005f1ba96 130 //On crée une pièce "ligne"
Willheisen 8:92d0c4961a16 131 case 2: {
clementdoreau 17:e03163d4e367 132 _ptrForme = new cLigne(3,0);
Willheisen 8:92d0c4961a16 133 break;
Willheisen 8:92d0c4961a16 134 }
Willheisen 24:9f3005f1ba96 135 //On crée une pièce "Z"
Willheisen 8:92d0c4961a16 136 case 3: {
clementdoreau 17:e03163d4e367 137 _ptrForme = new cZed(3,0);
Willheisen 8:92d0c4961a16 138 break;
Willheisen 8:92d0c4961a16 139 }
Willheisen 24:9f3005f1ba96 140 //On crée une pièce "T"
Willheisen 8:92d0c4961a16 141 case 4: {
clementdoreau 17:e03163d4e367 142 _ptrForme = new cTe(3,0);
Willheisen 8:92d0c4961a16 143 break;
Willheisen 8:92d0c4961a16 144 }
Willheisen 24:9f3005f1ba96 145 //On crée une pièce "carré"
Willheisen 8:92d0c4961a16 146 case 5: {
clementdoreau 17:e03163d4e367 147 _ptrForme = new cCarre(3,0);
Willheisen 8:92d0c4961a16 148 break;
Willheisen 8:92d0c4961a16 149 }
clementdoreau 10:9ef3f520ff6c 150 default:
clementdoreau 10:9ef3f520ff6c 151 {}
Willheisen 21:f0cf4173ecdb 152
Willheisen 24:9f3005f1ba96 153 }//Et on choisi sa couleur
Willheisen 21:f0cf4173ecdb 154 switch(couleur) {
Willheisen 21:f0cf4173ecdb 155 case 1: {
Willheisen 21:f0cf4173ecdb 156 couleur = LED_ROUGE;
Willheisen 21:f0cf4173ecdb 157 break;
Willheisen 21:f0cf4173ecdb 158 }
Willheisen 21:f0cf4173ecdb 159 case 2: {
Willheisen 21:f0cf4173ecdb 160 couleur = LED_ORANGE;
Willheisen 21:f0cf4173ecdb 161 break;
Willheisen 21:f0cf4173ecdb 162 }
Willheisen 21:f0cf4173ecdb 163 case 3: {
Willheisen 21:f0cf4173ecdb 164 couleur = LED_JAUNE;
Willheisen 21:f0cf4173ecdb 165 break;
Willheisen 21:f0cf4173ecdb 166 }
Willheisen 21:f0cf4173ecdb 167 case 4: {
Willheisen 21:f0cf4173ecdb 168 couleur = LED_VERT;
Willheisen 21:f0cf4173ecdb 169 break;
Willheisen 21:f0cf4173ecdb 170 }
Willheisen 21:f0cf4173ecdb 171 case 5: {
Willheisen 21:f0cf4173ecdb 172 couleur = LED_BLEU_CLAIR;
Willheisen 21:f0cf4173ecdb 173 break;
Willheisen 21:f0cf4173ecdb 174 }
Willheisen 21:f0cf4173ecdb 175 case 6: {
Willheisen 21:f0cf4173ecdb 176 couleur = LED_BLEU_FONCE;
Willheisen 21:f0cf4173ecdb 177 break;
Willheisen 21:f0cf4173ecdb 178 }
Willheisen 21:f0cf4173ecdb 179 case 7: {
Willheisen 21:f0cf4173ecdb 180 couleur = LED_MAGENTA;
Willheisen 21:f0cf4173ecdb 181 break;
Willheisen 21:f0cf4173ecdb 182 }
Willheisen 21:f0cf4173ecdb 183 default:
Willheisen 21:f0cf4173ecdb 184 {}
clementdoreau 19:9e3551d418d5 185 }
Willheisen 24:9f3005f1ba96 186 //Enfin, on "attache" la pièce la matrice et on affiche celle-ci
clementdoreau 17:e03163d4e367 187 _mat->afficherForme(_ptrForme, couleur);
clementdoreau 17:e03163d4e367 188 _spi.envoyerMatrice(*_mat);
Willheisen 8:92d0c4961a16 189 }
Willheisen 8:92d0c4961a16 190
Willheisen 36:f58a566595ad 191 //Destructeur de la classe cJeu, qui appelle la méthode fin,
Willheisen 36:f58a566595ad 192 //qui désalloue tous les objets alloués dynamiquement
Willheisen 9:6f3d8b714a59 193 cJeu::~cJeu()
Willheisen 9:6f3d8b714a59 194 {
clementdoreau 35:7aef0bbdf335 195 fin();
Willheisen 9:6f3d8b714a59 196 }
Willheisen 12:7afdbc7465ac 197
Willheisen 24:9f3005f1ba96 198
Willheisen 36:f58a566595ad 199 /*Méthode de gestion d'une partie
Willheisen 36:f58a566595ad 200 Entrées: aucune.
Willheisen 36:f58a566595ad 201 Sorties: aucune.
Willheisen 36:f58a566595ad 202 */
Willheisen 14:6b6aa696680f 203 void cJeu::nouvelleManche()
Willheisen 14:6b6aa696680f 204 {
clementdoreau 37:a08a58f5e9aa 205 bool resultat = false;
Willheisen 36:f58a566595ad 206 //On met le score à 0
Willheisen 36:f58a566595ad 207 _score = 0;
Willheisen 36:f58a566595ad 208 // Tant que l'on a pas perdu
Willheisen 36:f58a566595ad 209 while (!resultat) {
Willheisen 36:f58a566595ad 210 //on joue une nouvelle pièce
Willheisen 36:f58a566595ad 211 resultat = partieEnCours();
Willheisen 36:f58a566595ad 212 }
Willheisen 36:f58a566595ad 213 afficherScore();
Willheisen 24:9f3005f1ba96 214 }
clementdoreau 19:9e3551d418d5 215
Willheisen 24:9f3005f1ba96 216 /*Méthode qui permet de voir s'il une ligne est complète.
Willheisen 24:9f3005f1ba96 217 Entrées: aucune.
Willheisen 24:9f3005f1ba96 218 Sortie, une variable de type unsigned char égale à 1 si une ligne est complète, 0 le cas échéant.
Willheisen 24:9f3005f1ba96 219 Principe:
Willheisen 36:f58a566595ad 220 On parcourt chaque LED de chaque ligne de la matrice.
Willheisen 36:f58a566595ad 221 Si une LED n'est pas éteinte, alors on incrémente une variable.
Willheisen 36:f58a566595ad 222 Si cette variable atteint la valeur 8, c'est que toutes les LEDs d'une ligne sont allumées,
Willheisen 36:f58a566595ad 223 donc que la ligne est complète.
Willheisen 36:f58a566595ad 224 Si une de ces lignes est complète, alors on fait descendre toutes les pièces au-dessus
Willheisen 36:f58a566595ad 225 de la ligne(autres que celle de la manche) d'un cran. */
Willheisen 16:5c3d61584f51 226 unsigned char cJeu::ligneComplete()
Willheisen 12:7afdbc7465ac 227 {
clementdoreau 37:a08a58f5e9aa 228 unsigned char total = 0, numLigne = 0, res = 0;
Willheisen 24:9f3005f1ba96 229 //On parcourt chaque ligne de la matrice.
Willheisen 16:5c3d61584f51 230 for( unsigned char i = 0; i < _mat->getLig(); i++) {
Willheisen 13:336220ac9a8b 231 total = 0;
Willheisen 16:5c3d61584f51 232 for( unsigned char j = 0; j < _mat->getCol(); j++) {
Willheisen 24:9f3005f1ba96 233 //Pour chaque LED de la ligne, si celle-ci n'est pas éteinte
Willheisen 16:5c3d61584f51 234 if(_mat->getValTab(j, i) != LED_NOIR) {
Willheisen 24:9f3005f1ba96 235 //alors on incrémente une variable
Willheisen 13:336220ac9a8b 236 total ++;
Willheisen 14:6b6aa696680f 237 }
Willheisen 36:f58a566595ad 238 //Si cette variable atteint la valeur 8 (ligne complète de LEDs non éteinte),
Willheisen 14:6b6aa696680f 239 if(total == 8) {
Willheisen 24:9f3005f1ba96 240 //on note le numéro de la ligne complète
Willheisen 36:f58a566595ad 241 total = 0;
Willheisen 13:336220ac9a8b 242 numLigne = i;
Willheisen 24:9f3005f1ba96 243 //et on quitte la boucle
clementdoreau 37:a08a58f5e9aa 244 res = 1;
clementdoreau 37:a08a58f5e9aa 245 //Et on augmente le score!
clementdoreau 37:a08a58f5e9aa 246 _score+=10;
clementdoreau 15:3782eb2bc312 247 }
Willheisen 12:7afdbc7465ac 248 }
clementdoreau 19:9e3551d418d5 249 }
Willheisen 36:f58a566595ad 250
clementdoreau 37:a08a58f5e9aa 251 // On nettoie la ligne complétée
clementdoreau 37:a08a58f5e9aa 252 for(int i = 0; i < _mat->getCol(); i++) {
clementdoreau 37:a08a58f5e9aa 253 _mat->setValTab(i, numLigne, LED_NOIR);
clementdoreau 37:a08a58f5e9aa 254 }
Willheisen 13:336220ac9a8b 255 //On descend toutes les LEDs allumées au dessus de numLigne d'un cran
clementdoreau 37:a08a58f5e9aa 256 for( unsigned char i = numLigne; i > 0; i--) {
clementdoreau 37:a08a58f5e9aa 257 for( unsigned char j = 0; j < _mat->getCol(); j++) {
clementdoreau 37:a08a58f5e9aa 258 _mat->setValTab(j, i, _mat->getValTab(j, i-1));
Willheisen 14:6b6aa696680f 259 }
Willheisen 13:336220ac9a8b 260 }
clementdoreau 37:a08a58f5e9aa 261
clementdoreau 37:a08a58f5e9aa 262 //On renvoie 1 pour indiquer la présente d'une ligne complète
clementdoreau 37:a08a58f5e9aa 263 return res;
Willheisen 12:7afdbc7465ac 264 }
clementdoreau 15:3782eb2bc312 265
Willheisen 36:f58a566595ad 266 /*Méthode de gestion du jeu en cours:
Willheisen 36:f58a566595ad 267 Entrées: aucune.
Willheisen 36:f58a566595ad 268 Sorties: perdu, variable type integer qui passe à 1 si on perd.
Willheisen 36:f58a566595ad 269 Principe:
Willheisen 36:f58a566595ad 270 ->gestion des mouvements de la pièce
Willheisen 36:f58a566595ad 271 ->gestion des collision
Willheisen 36:f58a566595ad 272 ->gestion de la fin (gagné ou perdu)
Willheisen 36:f58a566595ad 273 */
Willheisen 36:f58a566595ad 274 bool cJeu::partieEnCours()
clementdoreau 19:9e3551d418d5 275 {
Willheisen 34:3f8df7ccfcbc 276 int _mvt = 0;
Willheisen 36:f58a566595ad 277 bool perdu = false;
Willheisen 16:5c3d61584f51 278 cCollision col;
Willheisen 24:9f3005f1ba96 279 /*La boucle suivante correspond à une "manche" du jeu:
Willheisen 24:9f3005f1ba96 280 On crée une nouvelle pièce.
Willheisen 24:9f3005f1ba96 281 Si celle-ci ne peut pas descendre, c'est que la matrice est remplie donc que le joueur a perdu.
Willheisen 24:9f3005f1ba96 282 On colore toute la matrice en bleue puis on l'efface.
Willheisen 24:9f3005f1ba96 283 Sinon, on effectue s'il y a eu mouvement de l'utilisateur le mouvement de le pièce correspondante.
Willheisen 24:9f3005f1ba96 284 On rafraîchit la matrice,
Willheisen 24:9f3005f1ba96 285 Puis si c'est possible, on descend la pièce d'une ligne et on rafraîchi de nouveau */
Willheisen 24:9f3005f1ba96 286
Willheisen 21:f0cf4173ecdb 287 while(!perdu) {
Willheisen 24:9f3005f1ba96 288 //On crée une nouvelle pièce.
clementdoreau 22:16863912486d 289 nouvellePiece();
Willheisen 24:9f3005f1ba96 290 //Si celle-ci ne peut pas descendre, c'est que la matrice est remplie donc que le joueur a perdu.
clementdoreau 22:16863912486d 291 if(col.pieceBas(*_ptrForme, *_mat) == true) {
Willheisen 24:9f3005f1ba96 292 //On colore toute la matrice en bleue
Willheisen 36:f58a566595ad 293 for(unsigned char i = 0; i < _mat->getCol(); i++) {
Willheisen 36:f58a566595ad 294 for(unsigned char j = 0; j < _mat->getLig()/2; j++) {
Willheisen 36:f58a566595ad 295 wait_ms(1);
Willheisen 36:f58a566595ad 296 _mat->setValTab(i, j, LED_BLEU_FONCE);
Willheisen 36:f58a566595ad 297 _spi.envoyerMatrice(*_mat);
Willheisen 36:f58a566595ad 298 }
Willheisen 36:f58a566595ad 299 }
Willheisen 36:f58a566595ad 300 for(unsigned char i = 0; i < _mat->getCol(); i++) {
Willheisen 36:f58a566595ad 301 for(unsigned char j = _mat->getLig()/2; j < _mat->getLig(); j++) {
clementdoreau 35:7aef0bbdf335 302 wait_ms(1);
Willheisen 21:f0cf4173ecdb 303 _mat->setValTab(i, j, LED_BLEU_FONCE);
clementdoreau 35:7aef0bbdf335 304 _spi.envoyerMatrice(*_mat);
Willheisen 21:f0cf4173ecdb 305 }
Willheisen 21:f0cf4173ecdb 306 }
Willheisen 24:9f3005f1ba96 307 //Puis on l'efface
Willheisen 21:f0cf4173ecdb 308 _mat->clear();
Willheisen 21:f0cf4173ecdb 309 _spi.envoyerMatrice(*_mat);
Willheisen 36:f58a566595ad 310 //on signale que le jeu est fini
Willheisen 36:f58a566595ad 311 perdu = true;
clementdoreau 22:16863912486d 312 }
Willheisen 34:3f8df7ccfcbc 313
Willheisen 38:418278e5eb6b 314 //Tant que la pièce en cours peut descendre
clementdoreau 22:16863912486d 315 while(col.bordBas(*_ptrForme, *_mat) == false && col.pieceBas(*_ptrForme, *_mat) == false && !perdu) {
Willheisen 38:418278e5eb6b 316 //On lit la message queue
Willheisen 34:3f8df7ccfcbc 317 osEvent evt = osMessageGet(*_queue, 500);
Willheisen 34:3f8df7ccfcbc 318 if (evt.status == osEventMessage) {
Willheisen 34:3f8df7ccfcbc 319 message_t *message = (message_t*)evt.value.p;
Willheisen 38:418278e5eb6b 320 //et on récupère la valeur du mouvement détecté
Willheisen 34:3f8df7ccfcbc 321 _mvt = message->val;
Willheisen 34:3f8df7ccfcbc 322 osPoolFree(*_pool, message);
Willheisen 38:418278e5eb6b 323 //Si pas de mouvement reçu
clementdoreau 35:7aef0bbdf335 324 } else {
clementdoreau 35:7aef0bbdf335 325 _mvt = 0;
Willheisen 34:3f8df7ccfcbc 326 }
Willheisen 38:418278e5eb6b 327 //Selon la valeur du mouvement, on effectue le mouvement de la pièce correspondant.
Willheisen 38:418278e5eb6b 328 //A chaque fois, on test de non-collision est fait avant de faire le mouvement.
Willheisen 34:3f8df7ccfcbc 329 switch(_mvt) {
Willheisen 36:f58a566595ad 330 case 1: {
Willheisen 36:f58a566595ad 331 if(col.pieceBas(*_ptrForme, *_mat) == false && col.bordBas(*_ptrForme, *_mat) == false) {
Willheisen 36:f58a566595ad 332 _ptrForme->rotationHoraire();
Willheisen 36:f58a566595ad 333 }
clementdoreau 22:16863912486d 334 break;
Willheisen 21:f0cf4173ecdb 335 }
Willheisen 34:3f8df7ccfcbc 336 case 2: {
Willheisen 34:3f8df7ccfcbc 337 while(col.pieceBas(*_ptrForme, *_mat) == false && col.bordBas(*_ptrForme, *_mat) == false) {
Willheisen 34:3f8df7ccfcbc 338 _ptrForme->deplacementBas();
Willheisen 34:3f8df7ccfcbc 339 _mat->updateMatrice();
Willheisen 34:3f8df7ccfcbc 340 _spi.envoyerMatrice(*_mat);
clementdoreau 22:16863912486d 341 }
clementdoreau 22:16863912486d 342 break;
Willheisen 21:f0cf4173ecdb 343 }
Willheisen 34:3f8df7ccfcbc 344 case 3: {
clementdoreau 35:7aef0bbdf335 345 if(col.pieceGauche(*_ptrForme, *_mat) == false && col.bordGauche(*_ptrForme) == false) {
clementdoreau 35:7aef0bbdf335 346 _ptrForme->deplacementGauche();
clementdoreau 35:7aef0bbdf335 347 }
Willheisen 34:3f8df7ccfcbc 348 break;
Willheisen 34:3f8df7ccfcbc 349 }
Willheisen 34:3f8df7ccfcbc 350 case 4: {
clementdoreau 22:16863912486d 351 if(col.pieceDroite(*_ptrForme, *_mat) == false && col.bordDroit(*_ptrForme) == false) {
clementdoreau 22:16863912486d 352 _ptrForme->deplacementDroite();
clementdoreau 22:16863912486d 353 }
clementdoreau 22:16863912486d 354 break;
clementdoreau 22:16863912486d 355 }
Willheisen 36:f58a566595ad 356 default: {
Willheisen 36:f58a566595ad 357 _ptrForme->deplacementBas();
clementdoreau 22:16863912486d 358 break;
Willheisen 21:f0cf4173ecdb 359 }
Willheisen 21:f0cf4173ecdb 360 }
clementdoreau 22:16863912486d 361 //on rafraîchi la matrice
clementdoreau 18:45dbd9948c97 362 _mat->updateMatrice();
clementdoreau 18:45dbd9948c97 363 _spi.envoyerMatrice(*_mat);
Willheisen 21:f0cf4173ecdb 364 }
clementdoreau 22:16863912486d 365 delete _ptrForme;
Willheisen 38:418278e5eb6b 366 //On regarde si des lignes sont complètes
clementdoreau 37:a08a58f5e9aa 367 while(ligneComplete()==1){
clementdoreau 37:a08a58f5e9aa 368 _spi.envoyerMatrice(*_mat);
clementdoreau 37:a08a58f5e9aa 369 wait(0.5);
clementdoreau 37:a08a58f5e9aa 370 }
clementdoreau 19:9e3551d418d5 371 }
Willheisen 36:f58a566595ad 372 return perdu;
Willheisen 34:3f8df7ccfcbc 373 }
Willheisen 16:5c3d61584f51 374
Willheisen 24:9f3005f1ba96 375 //Méthode de suppression des objets alloués dynamiquement
Willheisen 16:5c3d61584f51 376 void cJeu::fin()
Willheisen 16:5c3d61584f51 377 {
Willheisen 16:5c3d61584f51 378 delete _ptrForme;
Willheisen 34:3f8df7ccfcbc 379 delete _pool;
Willheisen 34:3f8df7ccfcbc 380 delete _queue;
Willheisen 21:f0cf4173ecdb 381 delete _mat;
clementdoreau 22:16863912486d 382 }
clementdoreau 22:16863912486d 383
Willheisen 36:f58a566595ad 384 void cJeu::afficherScore()
clementdoreau 37:a08a58f5e9aa 385 {
clementdoreau 37:a08a58f5e9aa 386 int centaines, dizaines;
Willheisen 36:f58a566595ad 387 cScore score;
clementdoreau 37:a08a58f5e9aa 388 centaines = _score/100;
clementdoreau 37:a08a58f5e9aa 389 dizaines = (_score-(centaines*100))/10;
clementdoreau 37:a08a58f5e9aa 390 for(unsigned char i = 0; i < 5; i++) {
clementdoreau 37:a08a58f5e9aa 391 for(unsigned char j = 0; j < 4; j++) {
clementdoreau 37:a08a58f5e9aa 392 _mat->setValTab(i+2, j+1, score.getChiffre(centaines, i, j));
Willheisen 36:f58a566595ad 393 }
clementdoreau 37:a08a58f5e9aa 394 }
clementdoreau 37:a08a58f5e9aa 395
clementdoreau 37:a08a58f5e9aa 396 // On affiche les dizaines
clementdoreau 37:a08a58f5e9aa 397 for(unsigned char i = 0; i < 5; i++) {
clementdoreau 37:a08a58f5e9aa 398 for(unsigned char j = 0; j < 4; j++) {
clementdoreau 37:a08a58f5e9aa 399 _mat->setValTab(i+2, j+6, score.getChiffre(dizaines, i, j));
clementdoreau 37:a08a58f5e9aa 400 }
clementdoreau 37:a08a58f5e9aa 401 }
Willheisen 36:f58a566595ad 402
clementdoreau 37:a08a58f5e9aa 403 //puis on affiche les unités
clementdoreau 37:a08a58f5e9aa 404 for(unsigned char i = 0; i < 5; i++) {
clementdoreau 37:a08a58f5e9aa 405 for(unsigned char j = 0; j < 4; j++) {
clementdoreau 37:a08a58f5e9aa 406 _mat->setValTab(i+2, j+11, score.getChiffre(0, i, j));
Willheisen 36:f58a566595ad 407 }
clementdoreau 37:a08a58f5e9aa 408 }
Willheisen 36:f58a566595ad 409 _spi.envoyerMatrice(*_mat);
Willheisen 36:f58a566595ad 410 }
Willheisen 36:f58a566595ad 411
Willheisen 36:f58a566595ad 412