/**
*Programme cree par The Clusters
*Intelligence Artificielle du jeu "Chkoba"
*@author The Clusters
*@version 1.0
**/

package chkoba;
import chkoba.*;
import java.util.*;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

/**
*	Classe Joueur Automatique
*/

public class JoueurAImpl extends JoueurImpl implements IJoueurA 
{
	// La priorite de ramassage maximale est 1
	/** La priorite de faire une Chkoba */
	private final int P_CHKOBA = 1;
	/** La priorite de prendre un sept de carreau */
	private final int P_7CARREAU = 2;
	/** La priorite de prendre des carreaux */
	private int p_carreau = 4;
	/** La priorite de prendre des septs */
	private int p_sept = 4;
	/** la carteRamassage affichant ce qui vient d'être ramasse */
	private CarteRamassage c;
	
	/**
	* CONSTRUCTEUR
	**/
	
	/**
	*Constructeur avec un parametre
	*@param n , chaine qui sera le nom du joueur
	*/
	public JoueurAImpl(String n) throws RemoteException
	{
		super(n);
		c = new CarteRamassage();
	}
	
	/**
	*Constructeur par defaut
	*/

	public JoueurAImpl() throws RemoteException
	{
		super();
		c = new CarteRamassage();
	}
	
	/**
	* METHODE
	**/
	
	/**
	*Permet de poser une carte donnee
	*sur le plateau donne
	*@param c , la carte a poser
	*@param plateau , le plateau sur lequel poser
	*/
	public void poser(ICarte c, IPlateau plateau) throws RemoteException
	{
		try
		{
			plateau.poser(c);
			main.remove(c);
			System.out.println("plateau : "+plateau.getTapis().affiche());
		}
		
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	
	/**
	*Permet de se defausser
	*sur le plateau donne
	*@param plateau , le plateau sur lequel se defausser
	*/
	public void defausseDeLIA(IPlateau plateau) throws RemoteException
	{
		int priorite=0;//entier prenant toutes les priorites
		int nbCarreau = 0;
		int nbSept =0;
		int indSeptCarreau=-1;
		int poidDuTapis = plateau.getTapis().somme();
		
		try
		{
			ICarte c=null;
			int tailleMain=main.size();
			//~ System.out.println("La taille de la main de l'IA : "+tailleMain);
			//~ System.out.println();
			if (tailleMain==1)
			{
				//~ System.out.println("1 seul carte peu pas faire autrement");
				this.poser(main.get(0),plateau);
			}
			else
			{ 
				for(int i= 0;i!=tailleMain;i++)
				{
					if (main.get(i).getCoul()==Couleur.carreau)
						nbCarreau++;
					if(main.get(i).getValeur()==7)
						nbSept++;
					if( main.get(i).getCoul()==Couleur.carreau && main.get(i).getValeur()==7 )
					{
						indSeptCarreau=i;
						nbCarreau--;
					}
				}
				if(nbSept==0 && nbCarreau==0)
				{
					//~ System.out.println("J'ai Pas de 7 et de carreaux");
					if (poidDuTapis >=10)
					{
						//~ System.out.println("La taille du plateau est superieur ou = a 10, je pose au hazard tien ^^");
						this.poser(main.get(0),plateau);
					}
					else
					{
						//~ System.out.println("La taille du plateau est inf a 10");
						boolean  jaiPoseUneCarte= false;
						for(int i= 0;i!=tailleMain;i++)
						{
							if ( (poidDuTapis+main.get(i).getValeur())>=10)
							{
								//~ System.out.println("Si je pose cette carte l'adversaire ne pourra pas faire de chkoba");
								this.poser(main.get(i),plateau);
								jaiPoseUneCarte=true;
								break;
							}
						}
						if(jaiPoseUneCarte== false)
						{
							this.poser(main.get(0),plateau);
							//~ System.out.println("Mince suis oblige de poser celle la, il va peut etre gagner un point");
						}
					}
				}
				else if (nbSept == 0 && nbCarreau>0 && (nbSept+nbCarreau)!=tailleMain)
				{
					//~ System.out.println("J'ai pas de 7 mais des carreaux et d'autres cartes");
					for(int i= 0;i!=tailleMain;i++)
					{
						if(main.get(i).getCoul()!=Couleur.carreau)
						{	
							//~ System.out.println("Je pose donc ce qui n'est pas carreau");
							this.poser(main.get(i),plateau);
							break;
						}
					}
				}
				else if (nbSept >0 && nbCarreau==0 && (nbSept+nbCarreau)!=tailleMain)
				{
					//~ System.out.println("J'ai du 7 mais pas de carreau et d'autres cartes");
					for(int i= 0;i!=tailleMain;i++)
					{
						if (main.get(i).getValeur() != 7)									
						{
							//~ System.out.println("Je pose donc ce qui n'est pas un 7");
							this.poser(main.get(i),plateau);
							break;
						}
					}
				}
				else if (nbSept >0 && nbCarreau>0 && (nbSept+nbCarreau)!=tailleMain)
				{
					//~ System.out.println("J'ai du 7 du carreau et d'autres cartes");
					for(int i= 0;i!=tailleMain;i++)
					{
						if(main.get(i).getCoul()!=Couleur.carreau)	
						{
							if (main.get(i).getValeur() != 7)									
							{
								//~ System.out.println("Je pose donc ce qui n'est pas un 7 et/ou un carreau");
								this.poser(main.get(i),plateau);
								break;
							}
						}
					}
				}
				else if (nbCarreau==tailleMain)
				{
					//~ System.out.println("j'ai que du carreau");
					for(int i= 0;i!=tailleMain;i++)
					{
						if (i != indSeptCarreau) 
						{
							//~ System.out.println("Je pose un Carreau alors");
							this.poser(main.get(i),plateau);
							break;
						}
					}
				}
				else if (nbSept==tailleMain)
				{
					//~ System.out.println("j'ai que du sept");
					for(int i= 0;i!=tailleMain;i++)
					{
						if (i != indSeptCarreau) 
						{
							//~ System.out.println("C'est le jeu ma pauvre lucette");
							this.poser(main.get(i),plateau);
							break;
						}
					}
				}
				else if ((nbSept+nbCarreau)==tailleMain)
				{
					//~ System.out.println("j'ai du sept et du carreau je vais poser un carreau");
					for(int i= 0;i!=tailleMain;i++)
					{
						if (i != indSeptCarreau && main.get(i).getCoul()==Couleur.carreau) 
						{
							//~ System.out.println("Je vais perdre");
							this.poser(main.get(i),plateau);
							break;
						}
					}
				}
				else
					System.out.println("J'ai du oublier quelque condition");
			}
		}
		catch(Exception e)
		{
			System.out.println("Mais pourkoi ==> JoueurAImpl");
			//~ e.printStackTrace();
		}
	}
	
	/**
	*Permet de jouer
	*sur le plateau donne
	*@param plateau , le plateau sur lequel on joue
	*/
	public void jouer(IPlateau plateau) throws RemoteException
	{
		//~ System.out.println("-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!");
		//~ for ( int m = 0 ; m!= plateau.getTapis().size();m++)
				//~ System.out.println("--  "+plateau.getTapis().get(m).affiche());
		c.setVisible(false);
		switch (this.coupsPossibles(plateau))
		{
			case 0 :
				if(!main.estVide())
					defausseDeLIA(plateau);
				break;
			
			default :
				majPrio();
				//~ System.out.println("-Main de l'IA "+getNom());
				//~ System.out.println("-"+main.affiche());
				
				boolean chkoba = false;
				int i = 0;
				while(i < main.size() && !chkoba)
				{
					// On parcourt la main en regardant si une carte a la meme valeur que la somme des valeur sur le Tapis.
					if(plateau.getTapis().somme() == main.get(i).getValeur() && !chkoba)
						// Si on trouve une carte pouvant faire Chkoba, alors on passe le boolean a vrai et on garde l'indice de la carte dans i
						chkoba = true;
					else
						// Sinon on passe a la carte suivante
						i++;
				}
				
				if (chkoba)
				{
					//~ System.out.println("-L'IA peut jouer une Chkoba");
					//~ System.out.println("-l'IA joue la carte "+main.get(i).affiche()+"\n");
					this.chkoba();
					// On ajoute la carte joue au plis, puis on la retire de la main.
					plis.add(main.get(i));
					//~ main.remove(i);
					
					int carteTable = 0;
					// On parcourt ensuite le Tapis pour ramasser les cartes
					ArrayList<ICarte> ramasse = new ArrayList<ICarte>();
					while(carteTable < plateau.getTapis().size())
					{
						// On ajoute la carte au plis
						ramasse.add(plateau.getTapis().get(carteTable));
						//~ System.out.println("-Carte "+plateau.getTapis().get(carteTable).affiche()+" ramassee.");
						carteTable++;
					}
					c = new CarteRamassage(main.get(i),ramasse,"Chkoba!!!");
					c.setVisible(true);
					carteTable = 0;
					main.remove(i);
					while(carteTable < ramasse.size())
					{
						//~ System.out.println("-autres carte ramasses : "+ramasse.get(carteTable).affiche());
						plis.add(ramasse.get(carteTable));
						plateau.getTapis().remove(plateau.getTapis().get(ramasse.get(carteTable)));
						carteTable++;
					}
					if ( this.pris == false )
						this.setPris();
				}
				// Si l'on ne peut pas faire de Chkoba, regardons si un sept de carreau traine sur le Tapis
				else
				{
					
					boolean septCarreau = false;
					i = 0;
					while(i < plateau.getTapis().size() && !septCarreau)
					{
						// On parcourt le Tapis et on regarde si le sept de carreau s'y trouve
						if( (plateau.getTapis().get(i).getCoul() == Couleur.carreau) && (plateau.getTapis().get(i).getValeur() == 7) )
						{
							//~ System.out.println("-Le 7 de carreau se trouve sur le Tapis !");
							// S'il se trouve sur le Tapis, on garde sa position dans i et 3 options s'offrent a nous : 
							// ---- Avoir un sept dans la main ----
							int j = 0;
							
							while( j < main.size() && !septCarreau){
								if(main.get(j).getValeur() == 7)
								{
									septCarreau = true;
									ramasse(plateau,i,j);
									majPrio();
								}
								else
									j++;
							}
							
							// ---- Pouvoir ramasser le sept en fesant une combinaison de cartes ----
							if(!septCarreau){
								j = 0;
								ArrayList<ICarte> ramassage;
								//~ System.out.println("-Arf, pas de sept dans la main :s");
								
								while( j < main.size() && !septCarreau){
									if(carteRamassableAvec(plateau, j, i))
									{
										// Pour chaque carte de la main, on regarde s'il est possible de ramasser le 7 plus une ou plusieurs autres cartes
										ramassage = peuRamasserSept(plateau,main.get(j));
										if(!ramassage.isEmpty())
										{
											//~ System.out.println("-Pas grave je peu le ramasser avec "+main.get(j).affiche()+"\n--> en prenant en plus : "+ramassage);
											septCarreau = true;
											
											ramasse(plateau, i, j, ramassage);
											majPrio();
											
										}
									}
									j++;
								}
							}
							 
							// ---- Ne pas pouvoir le ramasser ----
							// On laisse donc septCarreau a false
							//~ System.out.println("-Zut je peu pas le ramasser ...");
							
						}
						i++;
					}
					
					if(!septCarreau)
					{
						boolean trouve = false;
						// Si on ne peut pas ramasser le sept de carreau, on va tenter de ramasser soit un sept soit un carreau celon l'ordre de priorite
						switch(p_carreau-p_sept)
						{
							case -2 : 	
								//~ System.out.println("-Carreau en 1er");
								i = 0;
								int j = 0;
								trouve = false;
								ArrayList<ICarte> ramassage = new ArrayList<ICarte>();
								
								//Carreau en 1er						
								while(i < plateau.getTapis().size() && !trouve )
								{
									// On cherche un carreau sur le Tapis, des qu'on en trouve un on regarde si on peut le ramasser
									if(plateau.getTapis().get(i).getCoul() == Couleur.carreau)
									{
										//~ System.out.println("-Oh, du carreau sur le tapis");
										while(j < main.size() && !trouve )
										{
											if(plateau.getTapis().get(i).compare(main.get(j)) == 0)
											{
												trouve = true;
												ramasse(plateau,i,j);
											}
											j++;
										}
										
										j = 0;
										while(j < main.size() && !trouve )
										{
											if(carteRamassableAvec(plateau, j, i))
											{
												ramassage = peuRamasserCarreau(plateau, j,i);
												if(!ramassage.isEmpty())
												{
													trouve = true;
													ramasse(plateau,i,j,ramassage);
												}
											}
											j++;
										}
									}
									i++;
								}
								// Si pas de Carreau on cherche les septs
								if(!trouve)
								{
									//~ System.out.println("-Snif, je peu pas ramasser le carreau");
									i = 0;
									while(i < plateau.getTapis().size() && !trouve )
									{
										if(plateau.getTapis().get(i).getValeur() == 7)
										{
											//~ System.out.println("-Oh, un sept sur le tapis");
											j = 0;
											while(j < main.size() && !trouve)
											{
												if(main.get(j).getValeur() == 7)
												{
													trouve = true;
													ramasse(plateau,i,j);
												}
												j++;
											}
											
											j = 0;
											while(j < main.size() && !trouve)
											{
												if(carteRamassableAvec(plateau, j, i))
												{
													// Pour chaque carte de la main, on regarde s'il est possible de ramasser le 7 plus une ou plusieurs autres cartes
													ramassage = peuRamasserSept(plateau,main.get(j));
													if(!ramassage.isEmpty())
													{
														//~ System.out.println("-Pas grave je peu le ramasser avec "+main.get(j).affiche()+"\n-> en prenant en plus : "+ramassage);
														septCarreau = true;
														
														ramasse(plateau, i, j, ramassage);
														majPrio();
														
													}
												}
												j++;
											}
										}
										i++;
									}
								}	
								break;
									
							case -1 :
								//~ System.out.println("-Carreau en 1er");
								//Carreau en 1er
								i = 0;
								j = 0;
								trouve = false;
								ramassage = new ArrayList<ICarte>();
								
								//Carreau en 1er						
								while(i < plateau.getTapis().size() && !trouve )
								{
									// On cherche un carreau sur le Tapis, des qu'on en trouve un on regarde si on peut le ramasser
									if(plateau.getTapis().get(i).getCoul() == Couleur.carreau)
									{
										//~ System.out.println("-Oh, du carreau sur le tapis");
										while(j < main.size() && !trouve )
										{
											if(plateau.getTapis().get(i).compare(main.get(j)) == 0)
											{
												trouve = true;
												ramasse(plateau,i,j);
											}
											j++;
										}
										
										j = 0;
										while(j < main.size() && !trouve )
										{
											if(carteRamassableAvec(plateau, j, i))
											{
												ramassage = peuRamasserCarreau(plateau, j,i);
												if(!ramassage.isEmpty())
												{
													trouve = true;
													ramasse(plateau,i,j,ramassage);
												}
											}
											j++;
										}
									}
									i++;
								}
								// Si pas de Carreau on cherche les septs
								if(!trouve)
								{
									//~ System.out.println("-Snif, je peu pas ramasser le carreau");
									i = 0;
									while(i < plateau.getTapis().size() && !trouve )
									{
										if(plateau.getTapis().get(i).getValeur() == 7)
										{
											//~ System.out.println("-Oh, un sept sur le tapis");
											j = 0;
											while(j < main.size() && !trouve)
											{
												if(main.get(j).getValeur() == 7)
												{
													trouve = true;
													ramasse(plateau,i,j);
												}
												j++;
											}
											
											j = 0;
											while(j < main.size() && !trouve)
											{
												if(carteRamassableAvec(plateau, j, i))
												{
													// Pour chaque carte de la main, on regarde s'il est possible de ramasser le 7 plus une ou plusieurs autres cartes
													ramassage = peuRamasserSept(plateau,main.get(j));
													if(!ramassage.isEmpty())
													{
														//~ System.out.println("-Pas grave je peu le ramasser avec "+main.get(j).affiche()+"\n--> en prenant en plus : "+ramassage);
														septCarreau = true;
														
														ramasse(plateau, i, j, ramassage);
														majPrio();
														
													}
												}
												j++;
											}
										}
										i++;
									}
								}	
								break;
								
							default :
								//~ System.out.println("-Sept en 1er");
								//Sept en 1er
								i = 0;
								trouve = false; 
								ramassage = new ArrayList<ICarte>();

								while(i < plateau.getTapis().size() && !trouve )
								{
									if(plateau.getTapis().get(i).getValeur() == 7)
									{
										//~ System.out.println("-Oh, un sept sur le tapis");
										j = 0;
										while(j < main.size() && !trouve)
										{
											if(main.get(j).getValeur() == 7)
											{
												trouve = true;
												ramasse(plateau,i,j);
											}
											j++;
										}
										
										if(!trouve){
											j = 0;
											while(j < main.size() && !trouve)
											{
												if(carteRamassableAvec(plateau, j, i))
												{
													// Pour chaque carte de la main, on regarde s'il est possible de ramasser le 7 plus une ou plusieurs autres cartes
													ramassage = peuRamasserSept(plateau,main.get(j));
													if(!ramassage.isEmpty())
													{
														//~ System.out.println("-Pas grave je peu le ramasser avec "+main.get(j).affiche()+"\n--> en prenant en plus : "+ramassage);
														trouve = true;
														
														ramasse(plateau, i, j, ramassage);
														majPrio();
														
													}
												}
												j++;
											}
										}
									}
									i++;
								}
								
								i = 0;
								j = 0;
								//Carreau en 2eme						
								while(i < plateau.getTapis().size() && !trouve )
								{
									// On cherche un carreau sur le Tapis, des qu'on en trouve un on regarde si on peut le ramasser
									if(plateau.getTapis().get(i).getCoul() == Couleur.carreau)
									{
										//~ System.out.println("-Oh, du carreau sur le tapis");
										while(j < main.size() && !trouve )
										{
											if(plateau.getTapis().get(i).compare(main.get(j)) == 0)
											{
												trouve = true;
												ramasse(plateau,i,j);
											}
											j++;
										}
										
										j = 0;
										while(j < main.size() && !trouve )
										{
											if(carteRamassableAvec(plateau, j, i))
											{
												ramassage = peuRamasserCarreau(plateau, j,i);
												if(!ramassage.isEmpty())
												{
													trouve = true;
													ramasse(plateau,i,j,ramassage);
												}
											}
											j++;
										}
									}
									i++;
								}
								break;
								
						}
						
						if(!trouve)
						{
							//~ System.out.println("-Pas de carreau ni de sept sur le tapis ");
							//~ System.out.println("-(ou alors je peu pas le prendre :( )");
							i = 0;
							int j = 0;
							ArrayList<ICarte> ramassage = new ArrayList<ICarte>();
							while(i < plateau.getTapis().size() && !trouve)
							{
								j = 0;
								while(j < main.size() && !trouve)
								{
									if(plateau.getTapis().get(i).getValeur() == main.get(j).getValeur())
									{
										trouve = true;
										ramasse(plateau,i,j);
									}
									if(!trouve)
									{
										if(carteRamassableAvec(plateau,j,i))
										{
											ramassage = peuRamasserCarreau(plateau, j, i);
											if(!ramassage.isEmpty())
											{
												trouve = true;
												ramasse(plateau, i, j, ramassage);
											}
										}
									}
									j++;
								}
								i++;
							}
							
						}
					}
				}
			if ( plateau.getJoueurCourant().getPris() == true )
				plateau.getJoueurCourant().setPris();
			break;
		}
	}
	
	/**
	*Permet de remettre a jour les prioritees
	*/
	public void majPrio() throws RemoteException
	{
		if(this.compteSept() > 2)
			p_sept = 5;
		else
		{
			if(this.compteSept() > 1)
				p_sept = 3;
		}
		if(this.compteCarreaux() > 5)
			p_carreau = 5;
		else
		{
			if(this.compteCarreaux() > 3)
				p_carreau = 3;
		}
		
	}
	
	
	/**
	*Test la compatibilite des cartes
	*@param plateau , le plateau qui connait tous les objets
	*@param carteMain , l'index de la carte de la main
	*@param carteTapis , l'index de la carte de la main
	*/
	public boolean carteRamassableAvec(IPlateau plateau, int carteMain, int carteTapis)throws RemoteException
	{
		boolean resultat = true;
		
		int i = 0;
		while(i < plateau.getTapis().size() && resultat)
		{
			if(i != carteTapis)
			{
				if(plateau.getTapis().get(i).getValeur() == main.get(carteMain).getValeur())
					resultat = false;
			}
			i++;
		}
		
		return resultat;
	}

	
	/**
	*Test si l'on peut ramasser un carreau
	*sur le plateau donne
	*@param plateau , le plateau qui connait tous les objets
	*@param carteMain , l'index de la carte de la main
	*@param carteTapis , l'index de la carte de la main
	*/
	public ArrayList<ICarte> peuRamasserCarreau(IPlateau plateau, int carteMain, int carteTapis)throws RemoteException
	{
		ArrayList<ICarte> ramasse ;
		int i = 0;
		int size = plateau.getTapis().size();
		int valSwitch = main.get(carteMain).getValeur() - plateau.getTapis().get(carteTapis).getValeur();
		
		// On regarde la difference entre la valeur de la carte que l'on veut ramasser et celle dans la main
		//~ System.out.println(valSwitch+"\n");
		switch(valSwitch)
		{
			
			// Et la c'est le drame ... on arrive dans la partie horrible d'une IA ç_ç
			case 1 :
				i=0;
				ramasse = new ArrayList<ICarte>();
				while(i < size)
				{
					if(i!=carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1)
						{
							//~ System.out.println("1.1");
							ramasse.add(plateau.getTapis().get(i));
							return ramasse;
						}
					}
					i++;
				}
				
				return new ArrayList<ICarte>();
				
			case 2 :
				i=0;
				ramasse = new ArrayList<ICarte>();
				while(i < size)
				{
					if(i!=carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2)
						{
							//~ System.out.println("2.1");
							ramasse.add(plateau.getTapis().get(i));
							return ramasse;
						}
					}
					i++;
				}
				
				i = 0;
				int unTrouve = 0;
				while(i < size)
				{
					if(i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1)
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
							if(unTrouve == 2){
								//~ System.out.println("2.2");
								return ramasse;
							}
						}
					}
					i++;
				}
				
				return new ArrayList<ICarte>();
				
			case 3 :
				i=0;
				ramasse = new ArrayList<ICarte>();
				while(i < size)
				{
					if(i!=carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 3)
						{
							//~ System.out.println("3.1");
							ramasse.add(plateau.getTapis().get(i));
							return ramasse;
						}
					}
					i++;
				}
				
				i = 0;
				unTrouve = 0;
				int deuxTrouve = 0;
				while(i < size)
				{
					if(i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve < 1) )
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 1 && (unTrouve < 1) )
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve == 1)&&(unTrouve == 1) ){
							//~ System.out.println("3.2");
							return ramasse;
						}
					}
					i++;
				}
				
				i = 0;
				unTrouve = 0;
				ramasse = new ArrayList<ICarte>();
				while(i < size)
				{
					if(i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1)
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
							if(unTrouve == 3){
								//~ System.out.println("3.3");
								return ramasse;
							}
						}
					}
					i++;
				}
				return new ArrayList<ICarte>();
				
			case 4 :
				i=0;
				ramasse = new ArrayList<ICarte>();
				while(i < size)
				{
					if(i!=carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 4)
						{
							//~ System.out.println("4.1");
							ramasse.add(plateau.getTapis().get(i));
							return ramasse;
						}
					}
					i++;
				}
				
				i = 0;
				unTrouve = 0;
				int troisTrouve = 0;
				while(i < size)
				{
					if( i != carteTapis)
					{	
						if(plateau.getTapis().get(i).getValeur() == 3 && troisTrouve < 1)
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 1 && unTrouve < 1)
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (troisTrouve == 1)&&(unTrouve == 1)){
							//~ System.out.println("4.2");
							return ramasse;
						}
					}
					i++;
				}
				
				i = 0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				while(i < size)
				{
					if(i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2)
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
							if(unTrouve == 2){
								//~ System.out.println("4.3");
								return ramasse;
							}
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				unTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve < 1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 1 && (unTrouve < 2))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve == 1)&&(unTrouve == 2)){
							//~ System.out.println("4.4");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 && (unTrouve < 4))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
							if(unTrouve == 4){
								//~ System.out.println("4.5");
								return ramasse;
							}
						}
					}
					i++;
				}
				
				
				return new ArrayList<ICarte>();
				
			case 5 :
				i=0;
				ramasse = new ArrayList<ICarte>();
				while(i < size)
				{
					if(i!=carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 5)
						{
							//~ System.out.println("5.1");
							ramasse.add(plateau.getTapis().get(i));
							return ramasse;
						}
					}
					i++;
				}
				i = 0;
				int quatreTrouve = 0;
				unTrouve = 0;
				while(i < size)
				{
					if(i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 4 && quatreTrouve < 1)
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 1 && unTrouve < 1)
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (quatreTrouve == 1)&&(unTrouve == 1) ){
							//~ System.out.println("5.2");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				troisTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve < 1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 && (troisTrouve <1 ))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (troisTrouve == 1)&&(deuxTrouve == 1)){
							//~ System.out.println("5.3");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				troisTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 && (unTrouve < 2))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 && (troisTrouve < 1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve == 2)&&(troisTrouve == 1)){
							//~ System.out.println("5.4");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				deuxTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 && (unTrouve < 1))
						{
							unTrouve ++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve < 2))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve == 1)&&(deuxTrouve == 2)){
							//~ System.out.println("5.5");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				deuxTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 && (unTrouve < 3))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve < 1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve == 3)&&(deuxTrouve == 1)){
							//~ System.out.println("5.6");
							return ramasse;
						}
					}
					i++;
				}
				
				return new ArrayList<ICarte>();
				
			case 6 :
				ramasse = new ArrayList<ICarte>();
				i=0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 6)
						{
							//~ System.out.println("6.1");
							ramasse.add(plateau.getTapis().get(i));
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				int cinqTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 && (unTrouve < 1 ))
						{
							unTrouve ++; 
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 5 && (cinqTrouve < 1))
						{
							cinqTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve ==1)&&(cinqTrouve == 1)){
							//~ System.out.println("6.2");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				quatreTrouve = 0;
				deuxTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 4 && (quatreTrouve < 1))
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve < 1))
						{
							deuxTrouve++; 
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (quatreTrouve == 1)&&(deuxTrouve == 1) ){
							//~ System.out.println("6.3");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				troisTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 3 && (troisTrouve < 2))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
							if(troisTrouve == 2){
								//~ System.out.println("6.4");
								return ramasse;
							}
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				quatreTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 && (unTrouve < 2))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 4 && (quatreTrouve < 1))
						{
							quatreTrouve ++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (quatreTrouve ==1)&&(unTrouve == 2)){
							//~ System.out.println("6.5");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				deuxTrouve = 0;
				troisTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 && (unTrouve < 1))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve < 1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 && (troisTrouve < 1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve ==1)&&(deuxTrouve==1)&&(troisTrouve == 1)){
							//~ System.out.println("6.6");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve < 3))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
							if(deuxTrouve == 3)
							{
								//~ System.out.println("6.7");
								return ramasse;
							}
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				troisTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 && (unTrouve < 3))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur()==3 && (troisTrouve < 1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve == 3)&&(troisTrouve == 1)){
							//~ System.out.println("6.8");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				deuxTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve < 2))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 1 && (unTrouve < 2))
						{
							unTrouve ++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve == 2)&&(unTrouve == 2)){
							//~ System.out.println("6.9");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				deuxTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 4))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve < 1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve == 4)&&(deuxTrouve == 1)){
							//~ System.out.println("6.10");
							return ramasse;
						}
					}
					i++;
				}
				
			case 7 :
				ramasse = new ArrayList<ICarte>();
				i=0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 7)
						{
							//~ System.out.println("7.1");
							ramasse.add(plateau.getTapis().get(i));
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				unTrouve = 0;
				int sixTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <1))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 6 && (sixTrouve <1))
						{
							sixTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve == 1)&&(sixTrouve ==1)){
							//~ System.out.println("7.2");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				cinqTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve < 1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 5 && (cinqTrouve < 1))
						{
							cinqTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve == 1)&&(cinqTrouve == 1 )){
							//~ System.out.println("7.3");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				troisTrouve = 0;
				quatreTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 3 && (troisTrouve < 1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 4 && (quatreTrouve < 1))
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (quatreTrouve ==1)&&(troisTrouve == 1)){
							//~ System.out.println("7.4");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				cinqTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 && (unTrouve < 2))
						{
							unTrouve ++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 5 && (cinqTrouve < 1))
						{
							cinqTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve ==2)&&(cinqTrouve == 1)){
							//~ System.out.println("7.5");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				deuxTrouve = 0;
				quatreTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 1))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve < 1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 4 && (quatreTrouve < 1))
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve ==1)&&(deuxTrouve ==1)&&(quatreTrouve ==1) ){
							//~ System.out.println("7.6");
							return ramasse;
						}
								
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				troisTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 && (unTrouve < 1))
						{
							unTrouve ++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 && (troisTrouve < 2))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve ==1)&&(troisTrouve ==2)){
							//~ System.out.println("7.7");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				troisTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve < 2))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 && (troisTrouve < 1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve == 2)&&(troisTrouve ==1)){
							//~ System.out.println("7.8");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				quatreTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 && (unTrouve < 3))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 4 && (quatreTrouve < 1))
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve == 3)&&(quatreTrouve ==1)){
							//~ System.out.println("7.9");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				deuxTrouve = 0;
				troisTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 && (unTrouve < 2))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve < 1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve < 1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve == 2)&&(deuxTrouve == 1)&&(troisTrouve ==1)){
							//~ System.out.println("7.10");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				unTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 1))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve < 3))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve ==1)&&(deuxTrouve ==3)){
							//~ System.out.println("7.11");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				troisTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 4))
						{
							unTrouve ++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve < 1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve ==4)&&(troisTrouve==1)){
							//~ System.out.println("7.12");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				unTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 3))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve < 2))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve == 3)&&(deuxTrouve == 2)){
							//~ System.out.println("7.13");
							return ramasse;
						}
					}
					i++;
				}
				
			case 8 :
				ramasse = new ArrayList<ICarte>();
				i=0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 8)
						{
							//~ System.out.println("8.1");
							ramasse.add(plateau.getTapis().get(i));
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				unTrouve = 0;
				int septTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 1))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 7 &&(septTrouve < 1))
						{
							septTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve==1)&&(septTrouve==1)){
							//~ System.out.println("8.2");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				sixTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve <1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 6 && (sixTrouve <1))
						{
							sixTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve ==1)&&(sixTrouve==1)){
							//~ System.out.println("8.3");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				troisTrouve = 0;
				cinqTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 3 && (troisTrouve < 1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 5 && (cinqTrouve < 1))
						{
							cinqTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (troisTrouve==1)&&(cinqTrouve==1)){
							//~ System.out.println("8.4");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				quatreTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 4 &&(quatreTrouve < 2))
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
							if(quatreTrouve ==2){
								//~ System.out.println("8.5");
								return ramasse;
							}
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				sixTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <2))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 6 &&(sixTrouve <1))
						{
							sixTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve ==2)&&(sixTrouve ==1)){
							//~ System.out.println("8.6");
							return ramasse;
						}
					}
					i++;
				}
						
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				deuxTrouve = 0;
				cinqTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <1))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 && (deuxTrouve <1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 5 && (cinqTrouve <1))
						{
							cinqTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve==1)&&(deuxTrouve ==1)&&(cinqTrouve==1))
						{
							//~ System.out.println("8.7");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				troisTrouve = 0;
				quatreTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 1))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve <1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 4 &&(quatreTrouve <1))
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve == 1)&&(troisTrouve == 1)&&(quatreTrouve == 1))
						{
							//~ System.out.println("8.8");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				quatreTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve < 2))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 4 &&(quatreTrouve <1))
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve == 2)&&(quatreTrouve == 1)){
							//~ System.out.println("8.9");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				troisTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve < 1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve <2))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve == 1)&&(troisTrouve == 2)){
							//~ System.out.println("8.10");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				cinqTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 3))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 5 &&(cinqTrouve < 1))
						{
							cinqTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve == 3)&&(cinqTrouve == 1)){
							//~ System.out.println("8.11");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				deuxTrouve = 0;
				quatreTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 2))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve < 1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 4 &&(quatreTrouve < 1))
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve==2)&&(deuxTrouve==1)&&(quatreTrouve==1)){
							//~ System.out.println("8.12");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				troisTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 2))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve < 2))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve ==2)&&(troisTrouve ==2)){
							//~ System.out.println("8.13");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				deuxTrouve = 0;
				troisTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 1))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve < 2))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve < 1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve ==1)&&(deuxTrouve ==2)&&(troisTrouve ==1)){
							//~ System.out.println("8.14");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve < 4))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
							if(deuxTrouve == 4){
								//~ System.out.println("8.15");
								return ramasse;
							}
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				quatreTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 4))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 4 &&(quatreTrouve < 1))
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve == 4)&&(quatreTrouve ==1))
						{
							//~ System.out.println("8.16");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				deuxTrouve = 0;
				troisTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 3))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve < 1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve < 1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve==3)&&(deuxTrouve == 1)&&(troisTrouve==1))
						{
							//~ System.out.println("8.17");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				unTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 2))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve < 3))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve == 2)&&(deuxTrouve == 3))
						{
							//~ System.out.println("8.18");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				unTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 4))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve < 2))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve==4)&&(deuxTrouve==2)){
							//~ System.out.println("8.19");
							return ramasse;
						}
					}
					i++;
				}
				return new ArrayList<ICarte>();
				
			case 9 :
				ramasse = new ArrayList<ICarte>();
				i=0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 9)
						{
							//~ System.out.println("9.1");
							ramasse.add(plateau.getTapis().get(i));
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				int huitTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <1))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 8 &&(huitTrouve < 1))
						{
							huitTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve==1)&&(huitTrouve ==1)){
							//~ System.out.println("9.2");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				septTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve < 1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 7 &&(septTrouve <1))
						{
							septTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve==1)&&(septTrouve ==1)){
							//~ System.out.println("9.3");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				troisTrouve = 0;
				sixTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve < 1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 6 &&(sixTrouve < 1))
						{
							sixTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (troisTrouve==1)&&(sixTrouve==1))
						{
							//~ System.out.println("9.4");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				quatreTrouve = 0;
				cinqTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 4 &&(quatreTrouve < 1))
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 5 &&(cinqTrouve < 1))
						{
							cinqTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (quatreTrouve==1)&&(cinqTrouve==1)){
							//~ System.out.println("9.5");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				septTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <2))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 7 &&(septTrouve <1))
						{
							septTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve ==2)&&(septTrouve==1)){
							//~ System.out.println("9.6");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				deuxTrouve = 0;
				sixTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <1))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve <1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 6 &&(sixTrouve < 1))
						{
							sixTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve==1)&&(deuxTrouve==1)&&(sixTrouve==1))
						{
							//~ System.out.println("9.7");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				troisTrouve = 0;
				cinqTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <1))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve <1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 5 &&(cinqTrouve < 1))
						{
							cinqTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve==1)&&(troisTrouve==1)&&(cinqTrouve==1))
						{
							//~ System.out.println("9.8");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				cinqTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 5 &&(cinqTrouve <1))
						{
							cinqTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve <2))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (cinqTrouve==1)&&(deuxTrouve==2)){
							//~ System.out.println("9.9");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				quatreTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <1))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 4 &&(quatreTrouve <2))
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve==1)&&(quatreTrouve==2)){
							//~ System.out.println("9.10");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				troisTrouve = 0;
				quatreTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve <1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve <1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 4 &&(quatreTrouve < 1))
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve==1)&&(troisTrouve==1)&&(quatreTrouve==1)){
							//~ System.out.println("9.11");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				troisTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve <3))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
							if(troisTrouve ==3){
								//~ System.out.println("9.12");
								return ramasse;
							}
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				sixTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <3))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 6 &&(sixTrouve <1))
						{
							sixTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve==3)&&(sixTrouve==1)){
							//~ System.out.println("9.13");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				unTrouve = 0;
				cinqTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve <1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <2))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 5 &&(cinqTrouve < 1))
						{
							cinqTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve==1)&&(unTrouve==2)&&(cinqTrouve==1)){
							//~ System.out.println("9.14");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				troisTrouve = 0;
				quatreTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <2))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve <1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 4 &&(quatreTrouve < 1))
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve==2)&&(troisTrouve==1)&&(quatreTrouve==1)){
							//~ System.out.println("9.15");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				unTrouve = 0;
				quatreTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve <2))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <1))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 4 &&(quatreTrouve < 1))
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve==2)&&(unTrouve==1)&&(quatreTrouve==1)){
							//~ System.out.println("9.16");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				troisTrouve = 0;
				unTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve <1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve <2))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 1))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve==1)&&(troisTrouve==2)&&(unTrouve==1))
						{
							//~ System.out.println("9.17");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				troisTrouve = 0;
				deuxTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve <1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve <3))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (troisTrouve==1)&&(deuxTrouve==3)){
							//~ System.out.println("9.18");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				cinqTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <4))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 5 &&(cinqTrouve <1))
						{
							cinqTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve==4)&&(cinqTrouve==1))
						{
							//~ System.out.println("9.19");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				quatreTrouve = 0;
				unTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve <1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 4 &&(quatreTrouve <1))
						{
							quatreTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 3))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve==1)&&(quatreTrouve==1)&&(unTrouve==3))
						{
							//~ System.out.println("9.20");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				troisTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <3))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve <2))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve==3)&&(troisTrouve==2)){
							//~ System.out.println("9.21");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				troisTrouve = 0;
				unTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve <2))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve <1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 2))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve==2)&&(troisTrouve==1)&&(unTrouve==2)){
							//~ System.out.println("9.22");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				deuxTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <1))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve <4))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve==1)&&(deuxTrouve==4)){
							//~ System.out.println("9.23");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				unTrouve = 0;
				deuxTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve <3))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve <3))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (unTrouve==3)&&(deuxTrouve==3))
						{
							//~ System.out.println("9.24");
							return ramasse;
						}
					}
					i++;
				}
				
				i=0;
				ramasse = new ArrayList<ICarte>();
				deuxTrouve = 0;
				troisTrouve = 0;
				unTrouve = 0;
				while(i < size )
				{
					if( i != carteTapis)
					{
						if(plateau.getTapis().get(i).getValeur() == 2 &&(deuxTrouve <1))
						{
							deuxTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 3 &&(troisTrouve <1))
						{
							troisTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if(plateau.getTapis().get(i).getValeur() == 1 &&(unTrouve < 4))
						{
							unTrouve++;
							ramasse.add(plateau.getTapis().get(i));
						}
						if( (deuxTrouve==1)&&(troisTrouve==1)&&(unTrouve==4)){
							//~ System.out.println("9.25");
							return ramasse;
						}
					}
					i++;
				}
				return new ArrayList<ICarte>();
				
				default : 
					return new ArrayList<ICarte>();
		}
		
	}
	
	
	/**
	*Ramasse une carte
	*sur le plateau donne
	*@param plateau , le plateau qui connait tous les objets
	*@param carteMain , l'index de la carte de la main
	*@param carteTapis , l'index de la carte de la main
	*/
	public void ramasse(IPlateau plateau,int carteTapis, int carteMain) throws RemoteException
	{
		//~ System.out.println("-Oh ! la bonne carte dans la main ;)");
		
		c = new CarteRamassage(main.get(carteMain),plateau.getTapis().get(carteTapis),"A PRIS");
		c.setVisible(true);
		
		// On ajoute le sept de carreau au plis et on le retire du Tapis
		//~ System.out.println("-Je ramasse "+plateau.getTapis().get(carteTapis).affiche());
		plis.add(plateau.getTapis().get(carteTapis));
		plateau.getTapis().remove(carteTapis);

		// On retire la carte joue de la main pour l'ajouter au plis
		//~ System.out.println("-avec "+main.get(carteMain).affiche());
		plis.add(main.get(carteMain));
		main.remove(carteMain);	
		
		if ( this.pris == false )
			this.setPris();
	}
	
	
	/**
	*Ramasse plusieurs cartes
	*sur le plateau donne
	*@param plateau , le plateau qui connait tous les objets
	*@param carteMain , l'index de la carte de la main
	*@param carteTapis  l'index de la carte de la main
	*@param ramassage , arraylist de cartes a ramasser
	*/
	public void ramasse(IPlateau plateau,int carteTapis, int carteMain, ArrayList<ICarte> ramassage)throws RemoteException
	{
		
		c = new CarteRamassage(main.get(carteMain),plateau.getTapis().get(carteTapis),ramassage,"A PRIS");
		c.setVisible(true);
		
		// On ajoute le sept de carreau au plis et on le retire du Tapis
		//~ System.out.println("-Je ramasse "+plateau.getTapis().get(carteTapis).affiche());
		plis.add(plateau.getTapis().get(carteTapis));
		plateau.getTapis().remove(carteTapis);
		
		// On retire la carte joue de la main pour l'ajouter au plis
		//~ System.out.println("-avec "+main.get(carteMain).affiche());
		plis.add(main.get(carteMain));
		main.remove(carteMain);
		
		// On retire les autres cartes ramasses
		int j = 0;
		while(j < ramassage.size())
		{
			//~ System.out.println("-autres carte ramasses : "+ramassage.get(j).affiche());
			plis.add(ramassage.get(j));
			plateau.getTapis().remove(plateau.getTapis().get(ramassage.get(j)));
			j++;
		}
		
		if ( this.pris == false )
			this.setPris();
	}
	
	/**
	*Test si l'on peut ramasser un sept
	*en plus d'autres cartes
	*@param plateau , le plateau connaissant tous les objets
	*@param carte , la carte avec laquelle on veut ramasser
	*/
	public ArrayList<ICarte> peuRamasserSept(IPlateau plateau,ICarte carte)throws RemoteException
	{
		// cmp nous permettra de parcourir le Tapis, trouve nous dira si nous avons le compte necessaire pour ramasser le sept
		// et ramassage sera une ArrayList de ICarte regroupant les cartes qu'il faut ramasser en plus du sept
		int cmp = 0;
		boolean trouve = false;
		ArrayList<ICarte> ramassage = new ArrayList<ICarte>();
		
		// On regarde la valeur de la carte passee en parametre pour savoir combien de point il manque au sept
		switch(carte.getValeur()-7){
		
			case 1 :
				// On cherche dans ce cas un 1 
				while(cmp < plateau.getTapis().size() && !trouve){
					if(plateau.getTapis().get(cmp).getValeur() == 1)
					{
						ramassage.add(plateau.getTapis().get(cmp));
						trouve = true;
					}
					cmp++;
				}
				return ramassage;
				
			case 2 :
				// Ici deux chois possibles : un 2 ou deux 1
				while(cmp < plateau.getTapis().size() && !trouve)
				{
					if(plateau.getTapis().get(cmp).getValeur() == 2)
					{
						ramassage.add(plateau.getTapis().get(cmp));
						trouve = true;
					}
					cmp++;
				}
				
				// Si l'on ne trouve pas de 2, on cherche des 1
				if(!trouve)
				{
					cmp = 0;
					int unTrouve = 0;
					
					while(cmp < plateau.getTapis().size() && !trouve)
					{
						if(plateau.getTapis().get(cmp).getValeur() == 1)
						{
							ramassage.add(plateau.getTapis().get(cmp));
							unTrouve++;
							trouve = (unTrouve == 2);
						}	
						
						cmp++;
					}
					if(!trouve)
						// Si l'on n'a pas trouve deux 1 alors on renvoi une ArrayList vide
						return new ArrayList<ICarte>();
					return ramassage;
				}
				return ramassage;
				
			case 3 :
				// Ici trois chois possibles : un 3, un 2 et un 1, ou trois 1
				while(cmp < plateau.getTapis().size() && !trouve)
				{
					if(plateau.getTapis().get(cmp).getValeur() == 3)
					{
						ramassage.add(plateau.getTapis().get(cmp));
						trouve = true;
					}
					
					cmp++;
				}
				
				if(!trouve)
				{
					int unTrouve = 0;
					int deuxTrouve = 0;
					cmp = 0;
					
					while(cmp < plateau.getTapis().size() && !trouve)
					{
						if(plateau.getTapis().get(cmp).getValeur() == 2 && (deuxTrouve < 1))
						{
							ramassage.add(plateau.getTapis().get(cmp));
							deuxTrouve++;
						}	
						
						if(plateau.getTapis().get(cmp).getValeur() == 1 && (unTrouve < 1))
						{
							ramassage.add(plateau.getTapis().get(cmp));
							unTrouve++;
						}
						
						trouve = ( (unTrouve==1)&&(deuxTrouve==1) );
						cmp++;
					}
					
					if(!trouve)
					{
						// On pense a remettre ramassage a vide pour ne pas garder une des cartes trouve precedement
						ramassage = new ArrayList<ICarte>();
						unTrouve = 0;
						cmp = 0;
						
						while(cmp < plateau.getTapis().size() && !trouve)
						{
							if(plateau.getTapis().get(cmp).getValeur() == 1)
							{
								ramassage.add(plateau.getTapis().get(cmp));
								unTrouve++;
								trouve = (unTrouve == 3);
							}	
							
							cmp++;
						}
						
						if(!trouve)
							return new ArrayList<ICarte>();
						return ramassage;
					}
					return ramassage;
					
				}
				return ramassage;
				
				default :
					// Dans ce cas, le resultat de la valeur de la carte moins 7 est negatif (ou nul ) donc on renvoi directement un ArrayList vide
					return ramassage;
		}
	}
	
	public String affiche()throws RemoteException{
		return ("Nom : "+nom+"\n");
	}
	
	/**
	*Calcul le minimum de coups
	*possible sur le plateau
	*@param plateau , le plateau connaissant tous les objets
	*/
	public int coupsPossibles( IPlateau plateau ) throws RemoteException
	{
		int carteMax=0;
		ICarte c;
		
		try
		{
			for (int j=0; j<plateau.getTapis().size(); j++)
			{
				for ( int i=0; i<plateau.getJoueurCourant().getMain().size();i++)
				{
					c=plateau.getJoueurCourant().getMain().get(i);
					
					if(c.getValeur() == plateau.getTapis().get(j).getValeur())
					{
						carteMax=1;
						break;
					}
				}
			}
			
			for ( int i=0; i<plateau.getJoueurCourant().getMain().size();i++)
			{
				c=plateau.getJoueurCourant().getMain().get(i);
				
				if ( c.getValeur() == 10 && plateau.getTapis().somme() == 10 && plateau.getTapis().size() == 7 )
					carteMax=7;
				else
				{
					if(deuxCartes(c,plateau) && carteMax<2 )
						carteMax=2;
					else if(troisCartes(c,plateau) && carteMax<3 )				
						carteMax=3;
					else if(quatreCartes(c,plateau) && carteMax<4 )
						carteMax=4;
					else if(cinqCartes(c,plateau) && carteMax<5 )
						carteMax=5;
					else if(sixCartes(c,plateau) && carteMax<6 )
						carteMax=6;
				}
			}
		}
		catch(Exception e) 
		{
			e.printStackTrace();
		}
		return carteMax;
	}
	
	
	
	/**
	*Test les possibilitees de prendre deux cartes
	*avec la carte en parametre
	*@param c , la carte sur laquelle on veut tester
	*@param plateau , le plateau connaissant tous les objets
	**/
	public boolean deuxCartes (ICarte c, IPlateau plateau) throws RemoteException
	{
		int i, j; // indices permettant de parcourir 2 a 2 le tapis
		int size=plateau.getTapis().size(); //taille du tapis
		
		for (i=0;i<size;i++)
		{
			for(j=0;j<size;j++)
			{
				if(j!=i) // on verifie que l'indice des 2 cartes du tapis est different
				{
					//si la valeur de la carte est egale a la somme des 2 cartes on retourne true.
					if(c.getValeur()==(plateau.getTapis().get(i).getValeur()+plateau.getTapis().get(j).getValeur()))
						return true;
				}
			}
		}
		return false;
	}
	
	/**
	*Test les possibilitees de prendre trois cartes
	*avec la carte en parametre
	*@param c , la carte sur laquelle on veut tester
	*@param plateau , le plateau connaissant tous les objets
	**/
	public boolean troisCartes(ICarte c, IPlateau plateau) throws RemoteException
	{
		int i, j,k; // indices permettant de parcourir 3 a 3 le tapis
		int size=plateau.getTapis().size();//taille du tapis
		
		for (i=0;i<size;i++)
		{
			for(j=0;j<size;j++)
			{
				for(k=0;k<size;k++)
				{
					if(k!=i && k!=j && j!=i) // on verifie que l'indice des 3 cartes du tapis est different
					{
						//si la valeur de la carte est egale a la somme des 3 cartes on retourne true.
						if(c.getValeur()==(plateau.getTapis().get(i).getValeur()+plateau.getTapis().get(j).getValeur()+plateau.getTapis().get(k).getValeur()))
							return true;
					}
				}
			}
		}
		return false;
	}
	
	/**
	*Test les possibilitees de prendre quatres cartes
	*avec la carte en parametre
	*@param c , la carte sur laquelle on veut tester
	*@param plateau , le plateau connaissant tous les objets
	**/
	public boolean quatreCartes(ICarte c, IPlateau plateau) throws RemoteException
	{
		int i, j,k,l; // indices permettant de parcourir 4 a 4 le tapis
		int size=plateau.getTapis().size(); //taille du tapis
		
		for (i=0;i<size;i++)
		{
			for(j=0;j<size;j++)
			{
				for(k=0;k<size;k++)
				{
					for(l=0;l<size;l++)
					{
						if(l!=i && l!=j && l!=k && k!=i && k!=j && j!=i) // on verifie que l'indice des 4 cartes du tapis est different
						{
							//si la valeur de la carte est egale a la somme des 4 cartes on retourne true.
							if(c.getValeur()==(plateau.getTapis().get(i).getValeur()+plateau.getTapis().get(j).getValeur()+plateau.getTapis().get(k).getValeur()+plateau.getTapis().get(l).getValeur()))
								return true;
						}
					}
				}
			}
		}
		return false;
	}
	
	/**
	*Test les possibilitees de prendre cinq cartes
	*avec la carte en parametre
	*@param c , la carte sur laquelle on veut tester
	*@param plateau , le plateau connaissant tous les objets
	**/
	public boolean cinqCartes(ICarte c, IPlateau plateau) throws RemoteException
	{
		int i, j,k,l,m; // indices permettant de parcourir 5 a 5 le tapis
		int size=plateau.getTapis().size(); //taille du tapis
		
		for (i=0;i<size;i++)
		{
			for(j=0;j<size;j++)
			{
				for(k=0;k<size;k++)
				{
					for(l=0;l<size;l++)
					{
						for(m=0;m<size;m++)
						{
							if(m!=i && m!=j && m!=k && m!=l && l!=i && l!=j && l!=k && k!=i && k!=j && j!=i) // on verifie que l'indice des 3 cartes du tapis est different
							{
								//si la valeur de la carte est egale a la somme des 5 cartes on retourne true.
								if(c.getValeur()==(plateau.getTapis().get(i).getValeur()+plateau.getTapis().get(j).getValeur()+plateau.getTapis().get(k).getValeur()+plateau.getTapis().get(l).getValeur()+plateau.getTapis().get(m).getValeur()))
									return true;
							}
						}
					}
				}
			}
		}
		return false;
	}
	
	/**
	*Test les possibilitees de prendre six cartes
	*avec la carte en parametre
	*@param c , la carte sur laquelle on veut tester
	*@param plateau , le plateau connaissant tous les objets
	**/
	public boolean sixCartes(ICarte c, IPlateau plateau) throws RemoteException
	{
		int i, j,k,l,m,n; // indices permettant de parcourir 6 a 6 le tapis
		int size=plateau.getTapis().size(); //taille du tapis
		
		for (i=0;i<size;i++)
		{
			for(j=0;j<size;j++)
			{
				for(k=0;k<size;k++)
				{
					for(l=0;l<size;l++)
					{
						for(m=0;m<size;m++)
						{
							for(n=0;n<size;n++)
							{
								if(n!=i && n!=j && n!=k && n!=l && n!=m && m!=i && m!=j && m!=k && m!=l && l!=i && l!=j && l!=k && k!=i && k!=j && j!=i) // on verifie que l'indice des 6 cartes du tapis est different
								{
									//si la valeur de la carte est egale a la somme des 6 cartes on retourne true.
									if(c.getValeur()==(plateau.getTapis().get(i).getValeur()+plateau.getTapis().get(j).getValeur()+plateau.getTapis().get(k).getValeur()+plateau.getTapis().get(l).getValeur()+plateau.getTapis().get(m).getValeur()+plateau.getTapis().get(n).getValeur()))
										return true;
								}
							}
						}
					}
				}
			}
		}
		return false;
	}	
}
