Mini projet LOO
Dependencies: mbed APDS_9960 mbed-rtos
Home du projet
src/cJeu.cpp@40:08490d120ec4, 2016-04-24 (annotated)
- 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?
User | Revision | Line number | New 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 |