#include<stdlib.h>
#include<time.h>
#include<stdio.h>
#include<string.h>
#define N 5

//********************************************
//Définition des structures de données
//********************************************


typedef enum{FAUX, VRAI} Booleen;


//Le type Etat sert à caractériser l'état d'une case
typedef enum{CACHE,DECOUVERT,MARQUE} Etat;


// La structure Case comprend 3 paramètres
// - Un booléen indiquant la présence/absence d'une mine
// - Un entier indiquant le nombre de mine  sur les cases adjacentes
// - Un type énumation qui informe de l'état courant de la case
typedef struct{ // on définit le type case
  Booleen presenceMine;
  int nbMinesVoisines;
  Etat etatMine;
} Case;

//Création d'une structure de position pour repérer une case dans la grille
typedef struct{
	int numColonne;
	int numLigne;
}Position;

//On crée une structure de configuration pour l'initialisation de la partie contenant le nombre de mines, et la taille de la grille (nombre de lignes et de colonnes)
typedef struct{
  int nbLi;
  int nbCo;
  int nbMines;
 }Configuration;

 //Structure contenant les informations de jeu
typedef struct{
	Booleen isOver;
	Booleen isWinner;
	Booleen isBest;
	int startTime;
}Jeu;

//La grille du démineur est une matrice de cases (type Case)
typedef struct{
    Configuration config;
    Jeu jeu;
    Case tab[N][N];
}Grille;

//********************************************
//Déclaration des signatures des fonctions
//********************************************

void compteur(Grille *damier);
Grille creerGrille();
void clicDroit(Grille *damier, int i, int j);
void finDePartie(Grille *damier);
void decouvrirCase(Grille *damier, int i, int j);
void clicGauche(Grille *damier, int i, int j);
void afficherGrille(Grille grille);
void testGenerationGrille(Grille grille);
int main();
