# include <stdio.h>
# include <stdlib.h>
# include <graph.h>

void dessine_grille(int taille_grille) {
	int i;
	int j;
	int cote_par_carre = (400/taille_grille);
	for (i = 0; i != taille_grille; i++) {
		for (j = 0; j != taille_grille; j++) {
			ChoisirCouleurDessin(CouleurParNom("black"));
			DessinerRectangle(50 + (cote_par_carre*i), 50 + (cote_par_carre*j), cote_par_carre, cote_par_carre);
		}
	}
}

int compte_nb_cases_occupees(int grille[9][9], int taille_grille) {
	/* Renvoie le nombre de cases occupées (non vides) */
	int compteur = 0;
	int i,j;
	for (i = 0; i != taille_grille; i++) {
		for (j = 0; j != taille_grille; j++) {
			if (grille[i][j] != 0) {
				compteur++;
			}
		}
	}
	return compteur;
}

void initialise_grille(int grille[9][9], int taille_grille) {
	int i;
	int j;

	for(i = 0; i != taille_grille; i++) {
		for(j = 0; j != taille_grille; j++) {
			grille[i][j] = 0;
		}
	}
}

int choisir_emplacement_pion(int joueur, int grille[9][9], int taille_grille) {
	/* J1 : Rouge J2 : Bleu */
	/* Renvoie 1 si le joueur a cliqué sur une case ou non */
	couleur c;
	int i,j;
	int cote_par_carre = (400/taille_grille);
	if (joueur == 1) {
		c = CouleurParNom("dark red");
		printf("Red");
	}
	else {
		c = CouleurParNom("dark blue");
		printf("Blue");
	}
	for (i = 0; i != taille_grille; i++) {
		for (j = 0; j != taille_grille; j++) {
			if (souris_clique_bouton(50 + (cote_par_carre*i), 50 + (cote_par_carre*j), cote_par_carre, cote_par_carre) && grille[i][j] == 0) {
				ChoisirCouleurDessin(c);
				DessinerArc(50 + (cote_par_carre*i), 50 + (cote_par_carre*j), cote_par_carre, cote_par_carre,360,360);
				RemplirArc(50 + (cote_par_carre*i), 50 + (cote_par_carre*j), cote_par_carre, cote_par_carre,360,360);
				dessine_grille(taille_grille);
				grille[i][j] = joueur;
				return 1;
			}
		}
	}
	return 0;
}

int choisir_emplacement_croix(int joueur, int grille[9][9], int taille_grille) {
	/* J1 : Rouge J2 : Bleu */
	/* Renvoie 1 si le joueur a cliqué sur une case ou non */
	couleur c;
	int i,j;
	int cote_par_carre = (400/taille_grille);
	if (joueur == 1) {
		c = CouleurParNom("dark red");
		printf("Red");
	}
	else {
		c = CouleurParNom("dark blue");
		printf("Blue");
	}
	for (i = 0; i != taille_grille; i++) {
		for (j = 0; j != taille_grille; j++) {
			if (souris_clique_bouton(50 + (cote_par_carre*i), 50 + (cote_par_carre*j), cote_par_carre, cote_par_carre) && grille[i][j] == 0) {
				ChoisirCouleurDessin(c);
				RemplirRectangle(50 + (cote_par_carre*i), 50 + (cote_par_carre*j), cote_par_carre, cote_par_carre);
				dessine_grille(taille_grille);
				grille[i][j] = 3;
				return 1;
			}
		}
	}
	return 0;
}

int deplacement_valide(int joueur, int pos_deplacement_x, int pos_deplacement_y, int grille[9][9], int taille_grille) {
	/* Renvoie 1 si le déplacement est valide, 0 sinon. */
	int i,j;
	int pos_joueur_x, pos_joueur_y;

	for (i = 0; i != taille_grille; i++) {
		for (j = 0; j != taille_grille; j++) {
			if (grille[i][j] == joueur) {
				pos_joueur_x = i;
				pos_joueur_y = j;
			}
		}
	}

	/* Cas des 6 cases au dessus et en dessous du joueur */
	for (i = (pos_joueur_x-1); i != (pos_joueur_x+2); i++) {
		if (pos_deplacement_x == i 
			&& (pos_deplacement_y == pos_joueur_y-1 || pos_deplacement_y == pos_joueur_y+1)
		 	&& grille[pos_deplacement_x][pos_deplacement_y] == 0) {
			printf("TEST");
			return 1;
		}
	}
	/* Cas des 2 cases à gauche et à droite du joueur */
	if ((pos_deplacement_x == pos_joueur_x-1 || pos_deplacement_x == pos_joueur_x+1)
		&& pos_deplacement_y == pos_joueur_y
		&& grille[pos_deplacement_x][pos_deplacement_y] == 0) {
		return 1;
	}
	return 0;

}

int deplacer_pion(int joueur, int grille[9][9], int taille_grille) {
	/* Renvoie 1 si le déplacement s'est bien effectué, 0 sinon */
	int i,j;
	int cote_par_carre = (400/taille_grille);
	int pos_deplacement_x, pos_deplacement_y;
	int pos_joueur_x, pos_joueur_y;

	for (i = 0; i != taille_grille; i++) {
		for (j = 0; j != taille_grille; j++) {
			if (souris_clique_bouton(50 + (cote_par_carre*i), 50 + (cote_par_carre*j), cote_par_carre, cote_par_carre)) {
				pos_deplacement_x = i;
				pos_deplacement_y = j;
			}
		}
	}

	for (i = 0; i != taille_grille; i++) {
		for (j = 0; j != taille_grille; j++) {
			if (grille[i][j] == joueur) {
				pos_joueur_x = i;
				pos_joueur_y = j;
			}
		}
	}

	if (deplacement_valide(joueur, pos_deplacement_x, pos_deplacement_y, grille, taille_grille)) {
		int cote_par_carre = 400/taille_grille;
		couleur c;
		grille[pos_deplacement_x][pos_deplacement_y] = joueur;
		grille[pos_joueur_x][pos_joueur_y] = 0;
		if (joueur == 1) {
			c = CouleurParNom("dark red");
			printf("Red");
		}
		else {
			c = CouleurParNom("dark blue");
			printf("Blue");
		}
		ChoisirCouleurDessin(c);
		DessinerArc(50 + (cote_par_carre*pos_deplacement_x), 50 + (cote_par_carre*pos_deplacement_y), cote_par_carre, cote_par_carre,360,360);
		RemplirArc(50 + (cote_par_carre*pos_deplacement_x), 50 + (cote_par_carre*pos_deplacement_y), cote_par_carre, cote_par_carre,360,360);
		ChoisirCouleurDessin(CouleurParNom("white"));
		RemplirRectangle(50 + (cote_par_carre*pos_joueur_x), 50 + (cote_par_carre*pos_joueur_y), cote_par_carre, cote_par_carre);
		dessine_grille(taille_grille);
		return 1;
	}
	return 0;
}


int partie_a_deux_joueurs(int taille_grille) {
	int joueur = 1;
	int grille[9][9];
	unsigned long cycle = 10000L;
	unsigned long suivant = Microsecondes() + cycle;
	int deplacement_fini = 0;
	InitialiserGraphique();
	CreerFenetre(100,100,500,500);
	initialise_grille(grille, taille_grille);
	dessine_grille(taille_grille);

	/* Phase de placement des pions */
	while (compte_nb_cases_occupees(grille, taille_grille) < 2) {
		if (Microsecondes() > suivant) {
			suivant = Microsecondes() + cycle;
			if (joueur == 1) {

				ChoisirCouleurDessin(CouleurParNom("dark red"));
				EcrireTexte(250-(TailleChaineEcran("Tour du Joueur 1",1)/2), 475, "Tour du Joueur 1", 1);
			}
			else {
				ChoisirCouleurDessin(CouleurParNom("white"));
				RemplirRectangle(0,460,500,25);
				ChoisirCouleurDessin(CouleurParNom("dark blue"));
				EcrireTexte(250-(TailleChaineEcran("Tour du Joueur 2",1)/2), 475, "Tour du Joueur 2", 1);
			}
			if (SourisCliquee()) {
				int nb_cases = compte_nb_cases_occupees(grille, taille_grille);
				choisir_emplacement_pion(joueur, grille, taille_grille);
				/* Permet d'éviter de passer au joueur suivant si on clique sur une case non vide */
				if (nb_cases != compte_nb_cases_occupees(grille, taille_grille)) {
					if (joueur == 1) {
						joueur = 2;
					}
					else {
						joueur = 1;
					}
				}
				ChoisirCouleurDessin(CouleurParNom("white"));
				RemplirRectangle(0,460,500,25);
			}
		}
	}

	/* Alterne les tours jusqu'à ce que la grille soit remplie */
	while (compte_nb_cases_occupees(grille, taille_grille) < taille_grille*taille_grille) {
		if (Microsecondes() > suivant) {
			suivant = Microsecondes() + cycle;
			if (joueur == 1) {

				ChoisirCouleurDessin(CouleurParNom("dark red"));
				EcrireTexte(250-(TailleChaineEcran("Tour du Joueur 1",1)/2), 475, "Tour du Joueur 1", 1);
			}
			else {
				ChoisirCouleurDessin(CouleurParNom("white"));
				RemplirRectangle(0,460,500,25);
				ChoisirCouleurDessin(CouleurParNom("dark blue"));
				EcrireTexte(250-(TailleChaineEcran("Tour du Joueur 2",1)/2), 475, "Tour du Joueur 2", 1);
			}
			if (SourisCliquee()) {
				int nb_cases = compte_nb_cases_occupees(grille, taille_grille);
				if (!deplacement_fini) {
					deplacement_fini = deplacer_pion(joueur, grille, taille_grille);
				}
				else {
					choisir_emplacement_croix(joueur, grille, taille_grille); 
					/* Permet d'éviter de passer au joueur suivant si on clique sur une case non vide */
					if (nb_cases != compte_nb_cases_occupees(grille, taille_grille)) {
						if (joueur == 1) {
							joueur = 2;
						}
						else {
							joueur = 1;
						}
						deplacement_fini = 0;
					}
				}
				ChoisirCouleurDessin(CouleurParNom("white"));
				RemplirRectangle(0,460,500,25);
			}
		}
	}
}