/****************************************************************************
** ui.h extension file, included from the uic-generated form implementation.
**
** If you wish to add, delete or rename functions or slots use
** Qt Designer which will update this file, preserving your code. Create an
** init() function in place of a constructor, and a destroy() function in
** place of a destructor.
*****************************************************************************/


//fonction exécutée au démarrage de l'application
void FormMorpion::init()
{
    //initialisation du générateur de nombres aléatoires
    srand((uint) time(NULL));
    
    //lancement d'une nouvelle partie
    newPartie();
}

//fonction éxécutée lors de la création d'une nouvelle partie
void FormMorpion::newPartie()
{
    //désactivation du bouton "Rejouer"
    PushButtonRejouer->setEnabled(0);
    
    //affichage des instructions
    TextLabelMessages->setText("Alignez 3 ronds pour gagner<br>C'est vous qui commencez");
    
    //effacement du contenu de chaque bouton
    PushButton1->setText("");
    PushButton1->setEnabled(1);
    PushButton2->setText("");
    PushButton2->setEnabled(1);
    PushButton3->setText("");
    PushButton3->setEnabled(1);
    PushButton4->setText("");
    PushButton4->setEnabled(1);
    PushButton5->setText("");
    PushButton5->setEnabled(1);
    PushButton6->setText("");
    PushButton6->setEnabled(1);
    PushButton7->setText("");
    PushButton7->setEnabled(1);
    PushButton8->setText("");
    PushButton8->setEnabled(1);
    PushButton9->setText("");
    PushButton9->setEnabled(1);   
}

//fonction éxécutée lors d'un clic sur l'une des 9 cases du jeu
void FormMorpion::boutonClique()
{
    //effacement du contenu du TextLabelMessages
    TextLabelMessages->setText("");
    
    //on repère le bouton sur lequel on a cliqué
    QPushButton * bouton=(QPushButton *) sender();
    
    //récupération de la valeur du bouton cliqué
    QString valeurBut=bouton->text();
    
    //on regarde si on a déjà cliqué sur le bouton, et si c'est le cas, on quitte la fonction
    if (valeurBut!="")
    {
	return;
    }
    
    //on marque le bouton d'un O vert
    bouton->setText("O");
    bouton->setPaletteForegroundColor(QColor(0,0,255));
    
    //éxécution de la fonction test
    bool fini=testVainqueur(bouton);
    
    //si la partie n'est pas finie
    if (!fini)
    {
	//on fait jouer l'ordinateur
	joueOrdi();
    }
    
}

//fonction servant à tester si l'action réalisée par un joueur entraine sa victoire
bool FormMorpion::testVainqueur(QPushButton * but)
{
    //récupération de la valeur du bouton cliqué
    QString valeurBut=but->text();
    
     //on récupère le texte (O,X ou rien) de chaque case
    QString val1=PushButton1->text();
    QString val2=PushButton2->text();
    QString val3=PushButton3->text();
    QString val4=PushButton4->text();
    QString val5=PushButton5->text();
    QString val6=PushButton6->text();
    QString val7=PushButton7->text();
    QString val8=PushButton8->text();
    QString val9=PushButton9->text();
    
    //on met le booléen vainqueur à false (tant qu'il n'y a pas de vainqueur)
    bool vainqueur=false;
    
    //selon le nom de la case sur laquelle on a cliqué, on regarde les autres cases pour savoir
    //si 3 cases identiques sont alignées. Si c'est le cas, on met la variable vainqueur à true
    QString nom=but->name();
    if (nom=="PushButton1")
    {
	if (((val1==val2)&&(val1==val3))||((val1==val4)&&(val1==val7))||((val1==val5)&&(val1==val9)))
	{ vainqueur=true; }
    }
    
    if (nom=="PushButton2")
    {
	if (((val2==val1)&&(val2==val3))||((val2==val5)&&(val2==val8)))
	{ vainqueur=true; }
    }
    
    if (nom=="PushButton3")
    {
	if (((val3==val2)&&(val3==val1))||((val3==val6)&&(val3==val9))||((val3==val5)&&(val5==val7)))
	{ vainqueur=true; }
    }
    
    if (nom=="PushButton4")
    {
	if (((val4==val1)&&(val4==val7))||((val4==val5)&&(val4==val6)))
	{ vainqueur=true; }
    }
    
    if (nom=="PushButton5")
    {
	if (((val5==val1)&&(val5==val9))||((val5==val2)&&(val5==val8))||((val5==val3)&&(val5==val7))||((val5==val4)&&(val5==val6)))
	{ vainqueur=true; }
    }
    
    if (nom=="PushButton6")
    {	
	if (((val6==val3)&&(val6==val9))||((val6==val4)&&(val6==val5)))
	{ vainqueur=true; }
    }

    if (nom=="PushButton7")
    {
	if (((val7==val1)&&(val7==val4))||((val7==val8)&&(val7==val9))||((val7==val5)&&(val7==val3)))
	{ vainqueur=true; }
    }
	
    if (nom=="PushButton8")
    {
	if (((val8==val2)&&(val8==val5))||((val8==val7)&&(val8==val9)))
	{ vainqueur=true; }
    }
	
    if (nom=="PushButton9")
    {
	if (((val9==val8)&&(val9==val7))||((val9==val6)&&(val9==val3))||((val9==val1)&&(val9==val5)))
	{ vainqueur=true; }
    }
    
    //s'il y a un vainqueur
    if (vainqueur)
    {
	//si le vainqueur est l'humain
	if (valeurBut=="O")
	{
	    //affichage d'un message annoncant la victoire
	    TextLabelMessages->setText("Vous avez gagné !");
	}
	    
	//si le vainqueur est l'ordinateur
	if (valeurBut=="X")
	{
	    //affichage d'un message annoncant la défaite
	    TextLabelMessages->setText("Vous avez perdu !");
	}
	
	//on désactive toutes les cases dont le contenu est vide
	if (PushButton1->text()=="") {PushButton1->setEnabled(0); }
	if (PushButton2->text()=="") {PushButton2->setEnabled(0); }
	if (PushButton3->text()=="") {PushButton3->setEnabled(0); }
	if (PushButton4->text()=="") {PushButton4->setEnabled(0); }
	if (PushButton5->text()=="") {PushButton5->setEnabled(0); }
	if (PushButton6->text()=="") {PushButton6->setEnabled(0); }
	if (PushButton7->text()=="") {PushButton7->setEnabled(0); }
	if (PushButton8->text()=="") {PushButton8->setEnabled(0); }
	if (PushButton9->text()=="") {PushButton9->setEnabled(0); }
	
	//activation du bouton "Rejouer"
	PushButtonRejouer->setEnabled(1);
    }
    
    //renvoie du résultat du test (true s'il y a un vainqueur, false s'il n'y en a pas)
    return(vainqueur);
}


void FormMorpion::joueOrdi()
{
    //liste contenant les boutons sur lesquels il est encore possible de cliquer
    QStringList possibles;
    
    //on récupère le texte (O,X ou rien) de chaque case
    QString val1=PushButton1->text();
    QString val2=PushButton2->text();
    QString val3=PushButton3->text();
    QString val4=PushButton4->text();
    QString val5=PushButton5->text();
    QString val6=PushButton6->text();
    QString val7=PushButton7->text();
    QString val8=PushButton8->text();
    QString val9=PushButton9->text();
    
    //pour chaque bouton : si son contenu est vide, on l'ajoute à la liste "possibles"
    if (val1=="") { possibles.append("PushButton1"); }
    if (val2=="") { possibles.append("PushButton2"); }
    if (val3=="") { possibles.append("PushButton3"); }
    if (val4=="") { possibles.append("PushButton4"); }
    if (val5=="") { possibles.append("PushButton5"); }
    if (val6=="") { possibles.append("PushButton6"); }
    if (val7=="") { possibles.append("PushButton7"); }
    if (val8=="") { possibles.append("PushButton8"); }
    if (val9=="") { possibles.append("PushButton9"); }
    
    //s'il n'y a plus de bouton sur lequel cliquer (la partie est finie)
    if (possibles.count()==0)
    {
	//message indiquant que la partie est finie
	TextLabelMessages->setText("Match nul ! Essayez encore...");
	
	//activation du bouton "Rejouer"
	PushButtonRejouer->setEnabled(1);
	
	//on sort de la fonction
	return;
    }
	
    //liste qui va contenir les choix "intelligents" possibles
    QStringList rep;
    
    //pour chaque bouton possible
    for (uint i=0;i<possibles.count();i++)
    {
	//pour chaque bouton, on va regarder si le fait de le jouer va entrainer la création d'une ligne complète
	//(que ce soit pour l'humain ou pour l'ordinateur). Si c'est le cas, on ajoute ce bouton à la liste
	//des choix "intelligents"
	if (possibles[i]=="PushButton1")
	{
	    if (((val2==val3)&&(val2!=""))||((val4==val7)&&(val4!=""))||((val5==val9)&&(val5!="")))
	    { rep.append("PushButton1"); }
	}
	
	if (possibles[i]=="PushButton2")
	{
	    if (((val1==val3)&&(val1!=""))||((val5==val8)&&(val5!="")))
	    { rep.append("PushButton2"); }
	}
    
	if (possibles[i]=="PushButton3")
	{
	    if (((val1==val2)&&(val1!=""))||((val6==val9)&&(val6!=""))||((val5==val7)&&(val5!="")))
	    { rep.append("PushButton3"); }
	}
	
	if (possibles[i]=="PushButton4")
	{
	    if (((val1==val7)&&(val1!=""))||((val5==val6)&&(val5!="")))
	    { rep.append("PushButton4"); }
	}
	
	if (possibles[i]=="PushButton5")
	{
	    if (((val1==val9)&&(val1!=""))||((val2==val8)&&(val2!=""))||((val3==val7)&&(val3!=""))||((val4==val6)&&(val4!="")))
	    { rep.append("PushButton5"); }
	}
	
	if (possibles[i]=="PushButton6")
	{
	    if (((val4==val5)&&(val4!=""))||((val3==val9)&&(val3!="")))
	    { rep.append("PushButton6"); }
	}
	
	if (possibles[i]=="PushButton7")
	{
	    if (((val1==val4)&&(val1!=""))||((val8==val9)&&(val8!=""))||((val3==val5)&&(val3!="")))
	    { rep.append("PushButton7"); }
	}
	
	if (possibles[i]=="PushButton8")
	{
	    if (((val7==val9)&&(val7!=""))||((val2==val5)&&(val2!="")))
	    { rep.append("PushButton8"); }
	}
	
	if (possibles[i]=="PushButton9")
	{
	    if (((val7==val8)&&(val7!=""))||((val3==val6)&&(val3!=""))||((val1==val5)&&(val1!="")))
	    { rep.append("PushButton9"); }
	}
    }
    
    //on récupère le nombre de choix "intelligents"
    int nbChoix=rep.count();
    
    QString choix;
    
    //si la liste des choix "intelligents" n'est pas vide
    if (nbChoix!=0)
    {
	//on fait un choix au hasard
	int numChoix=rand()%nbChoix;
	
	//on récupère le nom du bouton correspondant au choix
	choix=rep[numChoix];	
    }
    
    //s'il n'y a aucun choix "intelligent" à faire
    else
    {
	//on récupère le nombre de choix possibles
	nbChoix=possibles.count();
	
	//on fait un choix au hasard
	int numChoix=rand()%nbChoix;
	
	//on récupère le nom du bouton correspondant au choix
	choix=possibles[numChoix];
    }
    
    //on crée un pointeur vers le bouton voulu : pour cela, on regarde pour chaque bouton
    //si le choix porte sur celui-ci et on crée un pointeur si c'est le cas
    QPushButton * bouton;
    if (choix=="PushButton1") { bouton=PushButton1; }    
    if (choix=="PushButton2") { bouton=PushButton2; }
    if (choix=="PushButton3") { bouton=PushButton3; }
    if (choix=="PushButton4") { bouton=PushButton4; }
    if (choix=="PushButton5") { bouton=PushButton5; }
    if (choix=="PushButton6") { bouton=PushButton6; }
    if (choix=="PushButton7") { bouton=PushButton7; }
    if (choix=="PushButton8") { bouton=PushButton8; }
    if (choix=="PushButton9") { bouton=PushButton9; }
    
    //on marque le bouton que l'ordinateur a choisi d'un X rouge et on le désactive
    bouton->setText("X");
    bouton->setPaletteForegroundColor(QColor(255,0,0));
    
    //éxécution de la fonction test
    testVainqueur(bouton);
    
}
