void Cell::open() { emit generate(m_x, m_y); if (isOpen()) { return; } else if (!isSuspect() & !isMined()) { if(minesAround() != 0) { m_open = true; } else { m_open = true; for (Cell *cell : m_neighbors) { if (!cell->isMined() & !cell->isSuspect() &cell->minesAround() == 0) { cell->open(); } else if (!cell->isMined() & !cell->isSuspect()) { cell->m_open = true; } } } emit checkWin(); } if(this->haveMine() & !isSuspect() & !isMined()) { emit lose(); } }
// Permet de poser un drapeau void putFlag(int x, int y) { // On execute le contenue seulement si la case n'a pas été minée if(isMined(x, y) == FALSE) { // On vérifie qu'il n'y a pas déjà un drapeau if(isFlag(x, y) == FALSE) { // On vérifie que l'on a pas mis plus de drapeau que de bombes if(nbFlags < NB_BOMBS) { // On choisit nos couleurs textbackground(B_FLAG); textcolor(C_FLAG); // On affiche le drapeau printf("%c", A_FLAG); // On ajoute le drapeau à la liste addFlag(x, y); } else { // On affiche une erreur msgZone(C_WARNING, B_WARNING); printf("You can't use more"); gotoxy(mapX+OFFSET_X+(BORDER*2), OFFSET_Y+18); printf("than %d flags", NB_BOMBS); } } else // Sinon on enlève le drapeau existant { // On choisit nos couleurs textbackground(B_MAP); textcolor(C_MAP); // On remet un case non miné printf("%c", A_MAP); // On enleve le drapeau du tableau removeFlag(x, y); } } }
// 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é } } } }