/*
 *  Max.cpp
 *  TicTaeToe
 *
 *  Created by Lionel BUCHELE on 04/05/11.
 *  Copyright 2011 EFREI. All rights reserved.
 *
 */

#include "Thebault-Buchele-Max.h"
#include "Thebault-Buchele-Min.h"
#include "Thebault-Buchele-plateau.h"
Max::Max()
{
}

Max::Max(Case *a, MinMax *pred, int prof):MinMax(a, prof)
{
	this->predecesseur = pred;
	this->successeur.resize(plateau::getLibre());
	this->heuristique = 9999999;
	//for(int x = 0; x<plateau::getLibre();x++)this->successeur[x] = new Min();
}

void Max::play()
{
	
	//cout<<"La profondeur de ce noeud Max est "<<this->profondeurActuelle<<endl;
	if(this->victoire == true){this->AffectationHeuristiqueFeuille();this->feuille = true;return;}
	if(MinMax::profondeurDonnee == this->profondeurActuelle){this->AffectationHeuristiqueFeuille();return;}
	plateau *game = plateau::getInstance();
	plateau::setLibre(plateau::getLibre()-1);
	this->feuille = false;
	int index = 0;
	for(int x = 0; x<plateau::getN();x++)
	{
		for(int y = 0; y<plateau::getM();y++)
		{
			if(*game->cellule[x][y] == 0)
			{
				this->successeur[index] = new Min(game->cellule[x][y],this, this->profondeurActuelle+1);
				//Je vérifie si victoire
				this->successeur[index]->coup->setAvailable_case(1);
				if(game->victory(this->successeur[index]->coup) >0)this->successeur[index]->victoire = true;
				this->successeur[index]->play();
				this->successeur[index]->coup->setAvailable_case(0);
				index++;
			}
		}
	}
	plateau::setLibre(plateau::getLibre()+1);
}

void Max::parcourirArbre(int i)
{
	if(i==0)this->coup->setAvailable_case(0);
	else this->coup->setAvailable_case(1);
	MinMax::parcourirArbre(i);
}


void Max::AffectationHeuristique()
{
	float val = -9999999;
	bool start = true;
	for(int x = 0; x < this->successeur.size();x++)
	{ 
		if(this->successeur[x]->heuristique == val)
			this->successeur[x]->AffectationHeuristique();
	}

	for(int x = 0; x < this->successeur.size();x++)if(this->successeur[x]->heuristique > val)val = this->successeur[x]->heuristique;
	this->heuristique =val;
	cout<<"Noeud Max "<<endl;
	MinMax::AffectationHeuristique();
}

void Max::AffectationHeuristiqueFeuille()
{
	cout<<"Feuille Max "<<endl<<"Profondeur : "<<this->profondeurActuelle<<endl;
	if(this->victoire == true)
	{
		this->heuristique = -9999999;
		this->alpha = -9999999;
		this->beta = -9999999;
		cout<<"Heuristique : "<<this->heuristique<<endl;
		plateau::getInstance()->affichage();
	}
	else MinMax::AffectationHeuristiqueFeuille();
}

//____________________________
//Date : 5/05/2011
//Fonction : Elagage Noeud Max
//____________________________
void Max::Elagage()
{
	bool start = true;
	int i = 0;
	while( start == true && i < this->successeur.size() )
	{

		if(this->successeur[i]->feuille == false)this->successeur[i]->Elagage();
		
		//cout<<"Boucle "<<i<<" taille "<<this->successeur.size()<<endl;
		if(this->successeur[i]->alpha >= this->beta)
		{
			//cout<<"Je suis dans une boucle Max "<<this->successeur[i]->alpha<<endl<<endl;
			this->beta = this->successeur[i]->alpha ;
			if(this->beta == -9999999){return;start = false;}
			if(this->beta >= this->alpha)start = false;
		}
		else if(this->successeur[i]->alpha == -9999999)
		{
			this->beta = this->successeur[i]->beta ;
			return;
		}
		i++;
		
	}
}