Exemple #1
0
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;
}
Exemple #2
0
// 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é
			}
		}
	}
}
Exemple #3
0
void Tile::update()
{
	if (isBomb())
		this->takeDamage(10);
}