bool Tile::takeDamage(int dmg) { if (dmg <= 0) return false; if (!isBomb() && this->type != AIRID) { if (rand() % (250 / dmg + 1) == 0) { createDamageParticle(); } } if (this->type != AIRID) this->health -= dmg; if (this->health < 0) { if (isBomb()) { explode(16); } this->changeType(AIRID); if (m->net->connected) { PACKET_TILECHANGE p = {x, y, 0}; m->net->sendData(m->net->TILECHANGE, &p, sizeof(p)); } return true; } return false; }
// Fonction executé lorsque l'utilisateur choisit une case void mineCase(int x, int y) { int countBomb = 0; // permet de compter les bombes aux alentours int i, j; // Variable de recherche // On vérifie que c'est pas la deuxième fois que l'utilisateur appuie ici if(isMined(x, y) != TRUE) { // On marque cette position comme déjà miner minedX[nbMined] = x; minedY[nbMined] = y; nbMined++; } // On se positionne sur la case à miner gotoxy(x, y); if(isBomb(x, y)) { // S'il mine une bombe, la partie est teminé endGame(); } else { // // On compte les bombes aux alentours // // On définie la première case de recherche sur l'axe Y if(y != OFFSET_Y) i = y-1; else i = y; // On parcourt en Y for (i; i <= y+1 && i < mapY+OFFSET_Y; i++) { // On définie la première case de recherche sur l'axe X if(x != OFFSET_X) j = x-1; else j = x; // Puis en X for (j; j <= x+1 && j < mapX+OFFSET_X; j++) { if(i != y || j != x) { if(isBomb(j, i) == TRUE) countBomb++; // S'il y a une bombe, on l'ajoute } } } // On vérifie que le joueur n'avait pas posé un drapeau ici if(isFlag(x, y)) removeFlag(x, y); // On l'enlève si c'était le cas // On choisit nos couleurs textbackground(B_MINED); textcolor(C_MINED); if(countBomb > 0) // S'il y a des bombes aux alentours on affiche le nombre { // On change la couleur switch(countBomb) { case 1:textcolor(LIGHTBLUE);break; case 2:textcolor(LIGHTGREEN);break; case 3:textcolor(LIGHTRED);break; case 4:textcolor(BLUE);break; case 5:textcolor(RED);break; case 6:textcolor(RED);break; case 7:textcolor(RED);break; case 8:textcolor(RED);break; } // On affiche le nombre printf("%d", countBomb); } else // Sinon on affiche un vide et on va voir plus loin { printf("%c", A_MINED); // // On mine aussi aux alentours // // On définie la première case de recherche sur l'axe Y if(y != OFFSET_Y) i = y-1; else i = y; // On parcourt en Y for (i; i <= y+1 && i < mapY+OFFSET_Y; i++) { // On définie la première case de recherche sur l'axe X if(x != OFFSET_X) j = x-1; else j = x; // Puis en X for (j; j <= x+1 && j < mapX+OFFSET_X; j++) if((i != y || j != x) && isMined(j, i) != TRUE) mineCase(j, i); // On mine à coté } } } }
void Tile::update() { if (isBomb()) this->takeDamage(10); }