#include "Grille.h"
#include "Tests.h"


Grille::Grille()
  //construit et initialise la grille de jeu
{
  int i,j;
  
  for (i=0;i<6;i++)
    {
      for (j=0;j<7;j++) {grille[i][j]=0;}
    }
   for (j=0;j<7;j++) {card[j]=0;}
   verbose=0;
}



void Grille::Afficher()
  //affiche la grille et les jetons
{
  int i,j;
  for (i=5;i>=0;i--)
    {
      cout<<endl<<"|";
      for (j=0;j<7;j++)
	{if (grille[i][j]!=0) {cout<<grille[i][j];} else {cout<<" ";}
	cout<<"|";}  
    }
  cout<<endl;
}



int Grille::Tester(int &joueur,int &col)
  //test si un numéro de colonne sélectionné (de 0 à 6) peut être joué
{
  if ((joueur==1)||(joueur==2))
    {
      if ((col>6)||(col<0)) 
	{//cout<<endl<<"Erreur: colonne invalide!"<<endl;
	  return(0);}
      if (card[col]<6)
	{return(1);}
      else {//cout<<endl<<"Erreur: colonne pleine!"<<endl;
	return(0);}
    }  
  else 
    {cout<<endl<<"Erreur: mauvais joueur"<<endl;return(0);}
}



void Grille::Jouer(int &joueur,int &col)
  //ajoute un pion dans la colonne choisie portant le num. du joueur
{
  grille [ card[col] ] [ col ] = joueur;
  card[col]++;
   
}


      
void Grille::DeJouer(int &joueur,int &col)
  //anulle le dernier coup joué
{
  grille [ card[col]-1 ] [ col ] = 0 ;
  card[col]--;
  
}



void Grille::InverseJoueur(int &joueur)
  //Donne la main à l'autre joueur
{
  if (joueur==1) {joueur=2;} else {joueur=1;}
}




int Grille::Evaluer(int &joueur)
  //donne une valeur à  une position de joueur
{
  int j,j1,j2,trash;
  
  j=1;
  j1=EvaluerLigne(grille,j);
  j1=j1+EvaluerColonne(grille,card,j,trash);
  
  j=2;
  j2=EvaluerLigne(grille,j);
  j2=j2+EvaluerColonne(grille,card,j,trash); 
  
  if (joueur==1) {return(j1-j2);} else {return(j2-j1);}
}



//****************************************************************************************

int Grille::TesterVictoire(int &joueur)
  //Fonction Generique MinMax()
  //retourne une valeur non nulle en cas de victoire
  //1 si victoire du joueur, -1 en cas de victoire du joueur adverse
{
  int trash,victoireL,victoireC;
  // TesterLigne teste une victoire éventuelle sur une ligne. 
  // Méthode beaucoup plus directe que EvaluerLigne()
  victoireL=TesterLigne(grille,joueur);  
  // EvaluerColonne effectue le travail demandé sans surcharge: employons-la
  trash=EvaluerColonne(grille,card,joueur,victoireC);
  //if (victoireL||victoireC) {cout<<joueur<< " gagne"<<endl;}

  return(victoireL||victoireC);
}

//****************************************************************************************


int& Grille::CardinalColonne(int &col)
  //renvoie le nombre de pièces contenues dans la colmonne en question
{
  return(card[col]);
}

void Grille::Verbose()
  //sélectionne le mode commentaires
{
  verbose=1;
}

void Grille::ShutUp()
  //Déselectionne ce meme mode
{
  verbose=0;
}












