/***********************************/
/* --- correction Puissance 4------*/
/* --- Isabelle Sivignon, dec 2003-*/
/***********************************/

#include<stdio.h>
#define L 5
#define C 7

/*variables dites "globales"*/
int Jeu[L][C];
int LigneJouable[C];
int Gagnant=0;

/********* Question 1 *************/
void Affichage()
{
  int i,j;
  
  for(i=L-1;i>=0;i--)
    {
      for(j=0;j<C;j++)
	printf("%d\t",Jeu[i][j]);
      printf("\n");
    }
  printf("\n");
}

/********* Question 2 *************/
int FinDePartie()
{
  int i=0;
  
  while(LigneJouable[i] > 4 && i<C)
    i++;
  
  if(i==C)
    return 1;
  else
    return 0;
}     

/*********** Question 3 ************/
int AligneVertical(int colonne, int couleur)
{
  int i;
  int cpt=1;

  i = LigneJouable[colonne]-1;
  while(Jeu[i][colonne] == couleur && i>=0)
    {
      cpt ++;
      i--;
    }
  return cpt;
}

/*********** Question 4 *************/
int AligneHorizontal(int colonne, int couleur)
{
  int l;
  int i;
  int cpt=1;
  l = LigneJouable[colonne];
  
  i = colonne-1;;
  while(Jeu[l][i] == couleur && i>=0)
    {
      cpt ++;
      i --;
    }
  
  i = colonne + 1;
  while(Jeu[l][i] == couleur && i < C)
    {
      cpt ++;
      i ++;
    }
  
  return cpt;
}

/********** Question 5 ************/

int AligneDiagonal1(int colonne, int couleur)
{
  int l;
  int c = -1;
  int cpt = 1;
  
  l = LigneJouable[colonne];
  
  while(Jeu[l-c][colonne+c] == couleur && l-c < L && colonne+c>=0)
    {
      cpt ++;
      c --;
    }  
  c = 1;
  while(Jeu[l-c][colonne+c] == couleur && l-c >=0 && colonne+c<C)
    {
      cpt ++;
      c ++;
    }
  return cpt;
}

int AligneDiagonal2(int colonne, int couleur)
{
  int l;
  int c = -1;
  int cpt = 1;
  
  l = LigneJouable[colonne];
  
  while(Jeu[l+c][colonne+c] == couleur && l+c >=0 && colonne+c>= 0)
    {
      cpt ++;
      c --;
    }
  c = 1;
  while(Jeu[l+c][colonne+c] == couleur && l+c <L && colonne+c<=C)
    {
      cpt ++;
      c ++;
    }
  return cpt;
}

/********** Question 6 *************/
int max2(int a, int b)
{
  if(a<b)
    return b;
  else
    return a;
}

int AligneMax(int colonne, int couleur)
{  
  int m1;
  int m2;
  m1 = max2(AligneVertical(colonne, couleur), AligneHorizontal(colonne,couleur));
  m2 = max2(AligneDiagonal1(colonne, couleur), AligneDiagonal2(colonne,couleur));
  return (max2(m1,m2));
}

/********** Question 7 *************/ 
int CoupGagnant(int colonne, int couleur)
{
  if(AligneVertical(colonne, couleur) == 4 ||
     AligneHorizontal(colonne, couleur) == 4 ||
     AligneDiagonal1(colonne,couleur) == 4 ||
     AligneDiagonal2(colonne,couleur) == 4)
    return 1;
  else
    return 0;
}

/********** Question 8 ************/
void JeuUtilisateur()
{
  int colonne;
  printf("Quelle colonne ?\n");
  scanf("%d",&colonne);

  while(LigneJouable[colonne] >4)
    {
      printf("Quelle colonne ?\n");
      scanf("%d",&colonne);
    }
  if(CoupGagnant(colonne,2)) {Gagnant = 2;;}
  Jeu[LigneJouable[colonne]][colonne] = 2;
  LigneJouable[colonne] ++;
}

/********** Question 9 ************/
int Notation(int N[C])
{
  int j;
  int v,h,d1,d2;

  for(j=0;j<C;j++)
    if(LigneJouable[j] >4)
      N[j] = -1;
    else
      if(CoupGagnant(j,1))
	N[j] = 100;
      else
	if(CoupGagnant(j,2))
	  N[j] = 50;
	else
	  N[j] = AligneMax(j,1);
}     

/************* Question 10 **********/
void JeuOrdinateur()
{
  int i;
  int cmax;
  int Notes[C];

  Notation(Notes);
  
  cmax = 0;;
  for(i=1;i<C;i++)
    if(Notes[i] > Notes[cmax])
      cmax = i;
  
  printf("Je joue dans la colonne %d\n",cmax);
  
  if(Notes[cmax] == 100)
    Gagnant = 1;
  
  Jeu[LigneJouable[cmax]][cmax] = 1;
  LigneJouable[cmax] ++;
}

/********** Question 11 **************/
int main()
{
  int i,j;
  int Notes[C];
  int tour = 0;

  for(i=0;i<L;i++)
    for(j=0;j<C;j++)
      Jeu[i][j] = 0;
  while(Gagnant == 0)
    {
      if(tour%2 == 0)
	JeuUtilisateur();
      else
	JeuOrdinateur();
      Affichage();
      tour ++;
    }
  if(Gagnant ==2)
    printf("Bravo, vous avez gagné !\n");
  else
    printf("Désolé, vous avez perdu !\n");

  return 0;
}

