package modele;
/**
 * La classe joueur définit un joueur avec beaucoup d'attributs dont un vector contenant tous les biens du joueur
 * @author Emilie Collasse, Cynthia Fong, Salma Zaghloul
 * @version 1.0
 */
import java.util.*;

import javax.swing.JOptionPane;

import IHM.Encheres;
import IHM.IHMjoueur;
import IHM.IHMmonopoly;

import mains.monopolyConsole;

public class joueur {
	protected String nomJoueur;
	protected int positionX;
	protected int positionY;
	protected double argent;
	protected int nbDoubles;
	protected boolean enPrison;
	protected boolean possedeCarteSortirDePrison1;
	protected boolean possedeCarteSortirDePrison2;
	protected boolean aFaitFaillite;
	protected int NbToursEnPrison;
	protected Vector <possessionPossible> proprietes;
	protected double doitPayer;
	/**
	 * initialise un nouveau joueur
	 * @param nomJoueur
	 */
	public joueur(String nomJoueur){
		this.nomJoueur=nomJoueur;
		doitPayer=0.0;
		positionX=10;
		positionY=10;
		argent=1500; 
		proprietes=new Vector<possessionPossible>(28);
		nbDoubles=0;
		enPrison=false;
		NbToursEnPrison=0;
		possedeCarteSortirDePrison1=false;
		possedeCarteSortirDePrison2=false;
		aFaitFaillite=false;
	}
	/**
	 * 
	 * @return la valeur de DoitPayer qui est la valeur que le joueur doit trouver pour payer ce qu'il doit. Cette variable est utilisée seulement dans la partie IHM
	 */
	public double getDoitPayer(){
		return doitPayer;
	}
	/**
	 * change le nombre de tours passés en prison
	 * @param difference
	 */
	public void setNbToursEnPrison(int difference){
		NbToursEnPrison+=difference;
	}
	/**
	 * permet au joueur d'avancer d'un certain nombre de cases
	 * @param n nombre de cases que le joueur doit parcourir
	 */
	public void seDeplacerDe(int n){
		while (n!=0){
			deplacement();
			if ((positionX==10)&&(positionY==10)){
				argent=argent+200;
				System.out.println("Vous passez par la case départ. Vous touchez votre salaire de 200€.");
			}
			n-=1;
		}
	}
	/**
	 * Même fonction que pour la partie console mais les System.out.println sont remplacer par des JDialog
	 * @param n nombre de cases que le joueur doit parcourir
	 */
	public void seDeplacerDeIHM(int n){
		while (n!=0){
			deplacement();
			if ((positionX==10)&&(positionY==10)){
				argent=argent+200;
				JOptionPane.showMessageDialog(null,nomJoueur+", vous passez par la case départ. Vous touchez votre salaire de 200€.","",JOptionPane.INFORMATION_MESSAGE);
			}
			n-=1;
		}
	}
	/**
	 * 
	 * @return l'état du joueur ( si il a perdu ou pas )
	 */
	public boolean aPerdu(){
		return aFaitFaillite;
	}
	/**
	 * modifie l'état du joueur ( s'il est en prison ou pas )
	 * @param true si le joueur est envoyé en prison
	 */
	public void setEstEnPrison(boolean booleen){
		enPrison=booleen;
	}
	/**
	 * 
	 * @return l'état du joueur ( en prison ou non )
	 */
	public boolean getEnPrison(){
		return enPrison;
	}
	/**
	 * 
	 * @return la position du joueur ( n° de colonne)
	 */
	public int getPositionX(){
		return positionX;
	}
	/**
	 * 
	 * @return la position du joueur (n° de ligne)
	 */
	public int getPositionY(){
		return positionY;
	}
	/**
	 * permet de gérer les actions à effectuer sur les cases.
	 * @param c case où se situe le joueur
	 * @param p plateau de jeu
	 * @param joueurs ensemble de tous les joueurs de la partie
	 * @param b banque
	 */
	public void gererActionsCase(Case c,plateau p, Vector<joueur> joueurs,Banque b){
		String action=c.actionnerCase(this);
		String[] tabAction=action.split("/");
		System.out.println(tabAction[0]);
		String [] tabAction2=tabAction[1].split("-");
		if (tabAction2[0].equals("recevez")){
			if (!tabAction2[1].equals("argentMilieu"))
				argent=argent+Integer.parseInt(tabAction2[1]);
			else {
				argent=argent+plateau.getArgentMilieu();
				plateau.viderArgentMilieu();
			}
		}
		if (tabAction2[0].equals("payez")){
			if (!tabAction2[1].equals("40parMaison115parHotel")&&!tabAction2[1].equals("25parMaison100parHotel")){
				payerFrais(Integer.parseInt(tabAction2[1]),joueurs,b);
			}
			else {
				int nbMaisons=0;
				int nbHotels=0;
				for (int i=0;i<proprietes.size();i++){
					if ((""+proprietes.get(i).getClass()).equals("class modele.propriete")){
						if (((propriete)proprietes.get(i)).getNbDeConstruction()<5)
							nbMaisons+=((propriete)proprietes.get(i)).getNbDeConstruction();
						else
							nbHotels+=1;
					}
				}
				System.out.println("Vous possédez "+nbMaisons+" maison(s) et "+nbHotels+" hôtel(s).");
				if (tabAction2.equals("25parMaison100parHotel")){
					System.out.println("Vous devez donc payer "+(25*nbMaisons+100*nbHotels)+"€.");
					payerFrais(25*nbMaisons+100*nbHotels,joueurs,b);
				}
				else {//payez-40parMaison115parHotel
					System.out.println("Vous devez donc payer "+(40*nbMaisons+115*nbHotels)+"€.");
					payerFrais(40*nbMaisons+115*nbHotels,joueurs,b);	
				}
			}
		}
		if (tabAction2[0].equals("achatPossible")){
			System.out.println("Vous possédez "+argent+"€.");
			System.out.println("Souhaitez-vous l'acheter ? Si ce n'est pas le cas, la case sera mise aux enchères.");
			String reponse=Keyboard.readString();
			while ((!reponse.equals("oui"))&&(!reponse.equals("non"))){
				System.out.println("Reponse invalide. Répondez par oui ou non.");
				reponse=Keyboard.readString();
			}
			if (reponse.equals("oui")){
				if (argent>=((possessionPossible)c).getPrix()){
					acheter((possessionPossible)c);
					System.out.println("Vous avez acheté la propriété "+c.getNom());
				}
				else {
					if (trouverArgent(((possessionPossible)c).getPrix(),joueurs,b))
						acheter((possessionPossible)c);
					else {
						System.out.println("Vous n'avez pas trouver assez d'argent. Vous ne pouvez pas acheter cette propriété. Elle est donc mise aux enchères.");
						monopolyConsole.miseAuxEncheres((possessionPossible)c);
					}
				}
			}
			if (reponse.equals("non"))
				monopolyConsole.miseAuxEncheres((possessionPossible)c);
		}
		if (tabAction2[0].equals("payerLoyer")){ 
			payerFrais(Integer.parseInt(tabAction2[1]),joueurs,b);
			if (!aFaitFaillite)
				((possessionPossible)c).getProprietaire().recevoirArgent(Integer.parseInt(tabAction2[1]));
			else
				((possessionPossible)c).getProprietaire().recevoirArgent(argent);
		}
		if (tabAction2[0].equals("deplacement")){
			if (tabAction2[1].equals("10x0")){
				positionX=0;
				positionY=10;
				enPrison=true;
			}
			else { 
				String[] deplacement=tabAction2[1].split("x");
				seDeplacerJusqua(Integer.parseInt(deplacement[0]),Integer.parseInt(deplacement[1]));
				gererActionsCase(p.getCase(positionY,positionX),p,joueurs,b);	
			}
		}
		if (tabAction2[0].equals("recul")){
			recul();
			recul();
			recul();
			gererActionsCase(p.getCase(positionY,positionX),p,joueurs,b);
		}
		if (tabAction2[0].equals("cartePrison")){			
			ajouterCartePrison();
		}
		if (tabAction2[0].equals("recevezChaqueJoueur")){	
			for (int i=0; i<joueurs.size();i++){
				if (!(joueurs.get(i).getNom().equals(nomJoueur))){
					joueurs.get(i).payerFrais(10,joueurs,b);
					if (!joueurs.get(i).aPerdu())
						argent=argent+10;
					else 
						argent+=joueurs.get(i).getArgent();
				}
			}
			System.out.println("Vous possédez désormais "+argent+"€.");
		}
		if (tabAction2[0].equals("payezOuCarteChance")){
			System.out.println("Souhaitez-vous payer (tapez 1) ou tirer une carte chance (tapez 2) ?");
			int reponse2=Keyboard.readInt();
			while (reponse2!=1&&reponse2!=2){
				System.out.println("Réponse invalide. Tapez 1 ou 2.");
				reponse2=Keyboard.readInt();
			}
			if (reponse2==1){
				payerFrais(10,joueurs,b);
			}
			else {
				gererActionsCase(p.getCase(10, 3),p,joueurs,b);
			}
		}
		if (tabAction2[0].equals("payezOu10%")){
			System.out.println("Vous possédez "+argent+"€. Voulez vous : ");
			System.out.println("1 - Payez 10% de votre revenu, soit "+(argent*(0.1))+"€.");
			System.out.println("2 - Payez un montant de 200€.");
			int reponse3=Keyboard.readInt();
			while (reponse3!=1&&reponse3!=2){
				System.out.println("Erreur. Répondez par 1 ou 2.");
				reponse3=Keyboard.readInt();
			}
			if (reponse3==1){
				payerFrais(argent*0.1,joueurs,b);
			}
			else{
				payerFrais(200,joueurs,b);
			}
		}
	}
	/**
	 *  même méthode que gererActionsCase mais tous les System.out.println sont remplacés par des JDialog 
	 * @param c
	 * @param p
	 * @param joueurs
	 * @param b
	 * @param monop
 	*/
	public void gererActionsCaseIHM(Case c,plateau p, Vector<IHMjoueur> joueurs,Banque b,IHMmonopoly monop){
		String action=c.actionnerCaseIHM(this);
		String[] tabAction=action.split("/");
		String [] tabAction2=tabAction[1].split("-");
		if (tabAction2[0].equals("recevez")){
			JOptionPane.showMessageDialog(null,tabAction[0],"",JOptionPane.INFORMATION_MESSAGE);
			if (!tabAction2[1].equals("argentMilieu"))
				argent=argent+Integer.parseInt(tabAction2[1]);
			else {
				argent=argent+plateau.getArgentMilieu();
				plateau.viderArgentMilieu();
			}
		}
		if (tabAction2[0].equals("payez")){
			if (!tabAction2[1].equals("40parMaison115parHotel")&&!tabAction2[1].equals("25parMaison100parHotel")){
				JOptionPane.showMessageDialog(null, tabAction[0],"",JOptionPane.INFORMATION_MESSAGE);
				payerFraisIHM(Integer.parseInt(tabAction2[1]),joueurs,b,monop);
			}
			else {
				int nbMaisons=0;
				int nbHotels=0;
				for (int i=0;i<proprietes.size();i++){
					if ((""+proprietes.get(i).getClass()).equals("class modele.propriete")){
						if (((propriete)proprietes.get(i)).getNbDeConstruction()<5)
							nbMaisons+=((propriete)proprietes.get(i)).getNbDeConstruction();
						else
							nbHotels+=1;
					}
				}
				if (tabAction2.equals("25parMaison100parHotel")){
					JOptionPane.showMessageDialog(null,tabAction[0]+"\n\nVous possédez "+nbMaisons+" maison(s) et "+nbHotels+" hôtel(s).\nVous devez donc payer "+(25*nbMaisons+100*nbHotels)+"€.","",JOptionPane.INFORMATION_MESSAGE);
					payerFraisIHM(25*nbMaisons+100*nbHotels,joueurs,b,monop);
				}
				else {//payez-40parMaison115parHotel
					JOptionPane.showMessageDialog(null,tabAction[0]+"\n\nVous possédez "+nbMaisons+" maison(s) et "+nbHotels+" hôtel(s).\nVous devez donc payer "+(40*nbMaisons+115*nbHotels)+"€.");
					payerFraisIHM(40*nbMaisons+115*nbHotels,joueurs,b,monop);	
				}
			}
		}
		if (tabAction2[0].equals("achatPossible")){
			String[]Options={"Achat","Mise aux enchères"};
			int reponse=JOptionPane.showOptionDialog(null,tabAction[0]+"\nVous possédez "+argent+"€.\nSouhaitez-vous l'acheter ? Si ce n'est pas le cas, la case sera mise aux enchères.","",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,null,Options,Options[0]);
			if (reponse==JOptionPane.YES_OPTION){
				if (argent>=((possessionPossible)c).getPrix()){
					acheter((possessionPossible)c);
					JOptionPane.showMessageDialog(null, "Vous avez acheté la propriété "+c.getNom(),"Achat",JOptionPane.INFORMATION_MESSAGE);
				}
				else {
					payerFraisIHM((double)(((possessionPossible)c).getPrix()),joueurs,b,monop);
					acheter((possessionPossible)c);
				}
			}
			if (reponse==JOptionPane.NO_OPTION)
				new Encheres(monop,monop.getListeJoueurs(),(possessionPossible)c);
		}
		if (tabAction2[0].equals("payerLoyer")){ 
			JOptionPane.showMessageDialog(null,tabAction[0],"",JOptionPane.INFORMATION_MESSAGE);
			payerFraisIHM(Integer.parseInt(tabAction2[1]),joueurs,b,monop);
			if (!aFaitFaillite)
				((possessionPossible)c).getProprietaire().recevoirArgent(Integer.parseInt(tabAction2[1]));
			else
				((possessionPossible)c).getProprietaire().recevoirArgent(argent);
		}
		if (tabAction2[0].equals("deplacement")){
			JOptionPane.showMessageDialog(null,tabAction[0],"",JOptionPane.INFORMATION_MESSAGE);
			if (tabAction2[1].equals("10x0")){
				positionX=0;
				positionY=10;
				enPrison=true;
			}
			else { 
				String[] deplacement=tabAction2[1].split("x");
				seDeplacerJusquaIHM(Integer.parseInt(deplacement[0]),Integer.parseInt(deplacement[1]));
				gererActionsCaseIHM(p.getCase(positionY,positionX),p,joueurs,b,monop);	
			}
		}
		if (tabAction2[0].equals("recul")){
			JOptionPane.showMessageDialog(null,tabAction[0],"",JOptionPane.INFORMATION_MESSAGE);
			recul();
			recul();
			recul();
			gererActionsCaseIHM(p.getCase(positionY,positionX),p,joueurs,b,monop);
		}
		if (tabAction2[0].equals("cartePrison")){			
			JOptionPane.showMessageDialog(null,tabAction[0],"",JOptionPane.INFORMATION_MESSAGE);
			ajouterCartePrison();
		}
		if (tabAction2[0].equals("recevezChaqueJoueur")){	
			JOptionPane.showMessageDialog(null,tabAction[0],"",JOptionPane.INFORMATION_MESSAGE);
			for (int i=0; i<joueurs.size();i++){
				if (!(joueurs.get(i).getJoueur().getNom().equals(nomJoueur))){
					joueurs.get(i).getJoueur().payerFraisIHM(10,joueurs,b,monop);
					if (!joueurs.get(i).getJoueur().aPerdu())
						argent=argent+10;
					else 
						argent+=joueurs.get(i).getJoueur().getArgent();
				}
			}
			JOptionPane.showMessageDialog(null,"Vous possédez désormais "+argent+"€.","",JOptionPane.INFORMATION_MESSAGE);
		}
		if (tabAction2[0].equals("payezOuCarteChance")){
			Object[] boutonsOption={"Payer","Carte Chance"};
			int reponse2=JOptionPane.showOptionDialog(null,tabAction[0],"",JOptionPane.INFORMATION_MESSAGE,JOptionPane.YES_NO_OPTION,null,boutonsOption,boutonsOption[0]);
			if (reponse2==JOptionPane.YES_OPTION){
				payerFraisIHM(10,joueurs,b,monop);
			}
			else {
				gererActionsCaseIHM(p.getCase(10, 3),p,joueurs,b,monop);
			}
		}
		if (tabAction2[0].equals("payezOu10%")){
			Object [] possibilites={"Payez 10% de votre revenu, soit "+(argent*(0.1))+"€.","Payez un montant de 200€."};
			String s=(String)JOptionPane.showInputDialog(null,tabAction[0],"",JOptionPane.INFORMATION_MESSAGE,null,possibilites,"Payez 10% de votre revenu, soit "+(argent*(0.1))+"€.");
			if ((s != null) && (s.length() > 0)) {
				if (s.substring(0, 8).equals("Payez 10")){
						payerFraisIHM(argent*0.1,joueurs,b,monop);
				}
				else{
						payerFraisIHM(200,joueurs,b,monop);
				}
			}
			else {
				JOptionPane.showMessageDialog(null, "Vous n'avez pas cliqué sur OK. L'option choisie par défaut est de payer 10%.","Erreur",JOptionPane.ERROR_MESSAGE);
				payerFraisIHM(argent*0.1,joueurs,b,monop);
			}
		}
		if (tabAction2[0].equals("NothingToDo"))
			JOptionPane.showMessageDialog(null,tabAction[0],"",JOptionPane.INFORMATION_MESSAGE);
	}
	/**
	 * 
	 * @return le nombre de tours en prison
	 */
	public int getNbToursEnPrison(){
		return NbToursEnPrison;
	}
	/**
	 * déplace le joueur jusqu'à une certaine case donnée
	 * @param i n° de ligne
	 * @param j n° de colonne
	 */
	public void seDeplacerJusqua(int i, int j){
		while (positionX!=j||positionY!=i){
			deplacement();
			if (positionX==10&&positionY==10){
				System.out.println("Vous passez par la case départ. Vous touchez votre salaire de 200€.");
				argent=argent+200;
			}
		}
	}
	/**
	 * meme méthode que seDeplacerJusqua avec en plus des JDialog
	 * @param i
	 * @param j
	 */
	public void seDeplacerJusquaIHM(int i,int j){
		while (positionX!=j||positionY!=i){
			deplacement();
			if (positionX==10&&positionY==10){
				JOptionPane.showMessageDialog(null,nomJoueur+", vous passez par la case départ. Vous touchez votre salaire de 200€.","",JOptionPane.INFORMATION_MESSAGE);
				argent=argent+200;
			}
		}
	}
	/**
	 * ajoute une carte sortie de prison dans les possessions du joueur. Le joueur peut en posséder 2.
	 */
	public void ajouterCartePrison(){
		if (possedeCarteSortirDePrison1==false)
			possedeCarteSortirDePrison1=true;
		else
			possedeCarteSortirDePrison2=true;
	}
	/**
	 * supprime une des cartes de sortie de prison du joueur
	 */
	public void enleverCartePrison(){
		if (possedeCarteSortirDePrison2)
			possedeCarteSortirDePrison2=false;
		else
			possedeCarteSortirDePrison1=false;
	}
	/**
	 * 
	 * @return si le joueur possède une carte pour sortir de prison ou pas
	 */
	public int possedeCarteSortieDePrison(){
		if (possedeCarteSortirDePrison2)
			return 2;
		else{
			if (possedeCarteSortirDePrison1)
				return 1;
			else
				return 0;
		}
	}
	/**
	 * 
	 * @return le nombre de doubles effectué par le joueur
	 */
	public int getNbDoubles(){
		return nbDoubles;
	}
	/**
	 * change le nombre de doubles
	 * @param difference
	 */
	public void setNbDoubles(int difference){
		nbDoubles=nbDoubles+difference;
	}
	/**
	 * permet d'acheter une case au prix de départ
	 * @param achat
	 */
	public void acheter(possessionPossible achat){ 
		achat.setProprietaire(this);
		proprietes.addElement(achat);
		argent=argent-achat.getPrix();
	}
	/**
	 * Permet de trouver de l'argent quand le joueur veut acheter quelque chose.
	 * Néanmoins, si le joueur n'obtient pas assez d'argent, la méthode renvoit 'false' et l'objet convoité n'est pas obtenu.
	 * Le joueur peut ainsi hypothéquer, vendre des constructions ou vendre ses biens à d'autres joueurs.
	 * @param n somme à trouver pour obtenir le bien convoité 
	 * @param joueurs ensemble des joueurs de la partie
	 * @param b banque
	 * @return si le joueur a trouvé assez d'argent pour acheter le bien
	 */
	public boolean trouverArgent(int n,Vector<joueur> joueurs,Banque b){ 
		System.out.println(nomJoueur+", vous n'avez pas assez d'argent pour payer.");
		if (proprietes.isEmpty()&&!possedeCarteSortirDePrison1){
			System.out.println("Vous n'avez aucune propriété à vendre ni de carte sortie de prison à vendre. Vous ne pouvez acheter cette propriété.");
			return false;
		}
		else {
			int interaction=0;
			int choix=0;
			boolean continuer=true;
			while (argent<n&&continuer){
				monopolyConsole.affichagePossessions(this);
				System.out.println("Voulez vous :");
				System.out.println("1 - Vendre des constructions à la banque ?");
				System.out.println("2 - Hypothéquer ?");
				System.out.println("3 - Vendre un de vos biens à un autre joueur ?");
				System.out.println("4 - Ne pas acheter cette propriété et ne plus chercher à trouver de l'argent ?");
				interaction=Keyboard.readInt();
				switch (interaction){
				case 1:
					if (proprietes.isEmpty()){
						System.out.println("Vous ne possédez aucune propriété. Vous ne pouvez pas vendre de construction à la banque.");
					}
					else {
						if (possibiliteVendreConst()){
							System.out.println("Sur quelle propriété voulez vous vendre les constructions ?");
							choix=Keyboard.readInt();
							if ((""+proprietes.get(choix).getClass()).equals("class modele.propriete"))
								vendreConstructionBanque((propriete)proprietes.get(choix),b);
							else
								System.out.println("Cette propriété n'est pas un terrain constructible.");
						}
						else {
							System.out.println("Aucun de vos terrains ne possède de construction. Vous ne pouvez pas vendre de construction.");
						}
					}
					break;
				case 2:
					if (proprietes.isEmpty()){
						System.out.println("Vous ne possédez que la carte de sortie de prison à vendre. Souhaitez-vous la vendre ?");
						String reponse=Keyboard.readString();
						while (!reponse.equals("oui")&&!reponse.equals("non")){
							System.out.println("Erreur. Répondez par oui ou non");
							reponse=Keyboard.readString();
						}
						if (reponse.equals("oui")){
							venteCartePrison(joueurs,b);
						}
						else 
							System.out.println("Vous n'avez rien d'autre à vendre.");
					}
					else { // vente de prison ou propriété
						System.out.println(" Quelle propriété voulez-vous vendre ?");
						if (possedeCarteSortirDePrison1)
							System.out.println("Tapez 'prison' si vous voulez vendre votre carte sortie de prison.");
						String choix2=Keyboard.readString();
						if (choix2.equals("prison")){
							venteCartePrison(joueurs,b);
						}
						else {
							int choix3=Integer.parseInt(choix2);
							while (choix3<0||choix3>proprietes.size()){
								System.out.println("Vous avez donné un n° de propriété invalide. Donnez un n° entre 0 et "+(proprietes.size()-1));
								choix3=Keyboard.readInt();
							}
							System.out.println("A quel prix voulez-vous vendre "+proprietes.get(choix3).getNom());
							int prix=Keyboard.readInt();
							System.out.println("Est-ce qu'un joueur veut acheter "+proprietes.get(choix3).getNom()+" de "+nomJoueur+" au prix de "+prix+" € ?");
							String reponse=Keyboard.readString();
							while (!reponse.equals("oui")&&!reponse.equals("non")){
								System.out.println("Erreur. Répondez par oui ou non");
								reponse=Keyboard.readString();
							}
							if (reponse.equals("oui")){
								System.out.println("Quel est le nom du joueur intéressé ?");
								String nj=Keyboard.readString();
								joueur J=null;
								do {
									for (int i=0; i<joueurs.size();i++){
										if (joueurs.get(i).getNom().equals(nj))
											J=joueurs.get(i);
									}
									if (J==null){
										System.out.println(nj+" est un nom de joueur invalide. Vérifiez l'orthographe.");
										nj=Keyboard.readString();
									}
								}while(J==null);
								if (J.getArgent()>=prix){
									System.out.println(J.getNom()+" achète "+proprietes.get(choix3).getNom()+" appartenant à "+nomJoueur+" au prix de "+prix+" €.");
									J.payerFrais((double)prix, joueurs,b);
									J.acheter(proprietes.get(choix3),prix);
									this.enleverProp(proprietes.get(choix3));
									argent+=prix;
								}
								else {
									if (J.trouverArgent(prix, joueurs, b)){
										System.out.println(J.getNom()+" achète "+proprietes.get(choix3).getNom()+" appartenant à "+nomJoueur+" au prix de "+prix+" €.");
										J.payerFrais((double)prix, joueurs,b);
										J.acheter(proprietes.get(choix3),prix);
										this.enleverProp(proprietes.get(choix3));
										argent+=prix;
									}
									else //l'acheteur n'a pas trouvé assez d'argent
										System.out.println(nomJoueur+", vous ne pouvez pas vendre votre propriété à "+J.getNom());
								}
							}
							else //pas de joueurs intéressé
								System.out.println("Aucun des joueurs ne veut acheter cette propriété au prix de "+prix);
						}
					}
					break;
				case 3 :
					if (proprietes.isEmpty())
						System.out.println("Vous ne possédez aucune propriété. Vous ne pouvez pas hypothéquer.");
					else{
						if (possibiliteDHypothequer()){
							System.out.println("Quelle propriété voulez vous hypothéquer ?");
							choix=Keyboard.readInt();
							hypothequer(proprietes.get(choix));
						}
						else 
							System.out.println("Toutes vos propriétés sont déjà hypothéquées. Vous ne pouvez pas hypothéquer d'avantage.");
					}
					break;
				case 4: 
					continuer=false;
					break;
				}
			}
			if (!continuer){
				System.out.println("Vous ne voulez plus vendre ou hypothéquer. Vous ne pouvez donc pas acheter la propriété.");
				return false;
			}
			else {
				System.out.println("Vous disposez désormais de "+argent+" €. Vous avez trouvé assez d'argent pour acheter la propriété.");
				return true;
			}
		}
	}
	/**
	 * Vend une des cartes de sortie de prison 
	 * @param joueurs ensemble des joueurs de la partie
	 * @param b banque
	 * @return un booléen disant si la carte prison intéresse un des joueurs.
	 */
	public boolean venteCartePrison(Vector<joueur> joueurs, Banque b){
		String reponse="";
		System.out.println("A quel prix voulez-vous la vendre ?");
		int prix=Keyboard.readInt();
		System.out.println("Est-ce qu'un joueur veut acheter la carte de sortie de prison de "+nomJoueur+" au prix de "+prix+" € ?");
		reponse=Keyboard.readString();
		while (!reponse.equals("oui")&&!reponse.equals("non")){
			System.out.println("Erreur. Répondez par oui ou non");
			reponse=Keyboard.readString();
		}
		if (reponse.equals("oui")){
			System.out.println("Quel est le nom du joueur intéressé ?");
			String nj=Keyboard.readString();
			joueur J=null;
			do {
				for (int i=0; i<joueurs.size();i++){
					if (joueurs.get(i).getNom().equals(nj))
						J=joueurs.get(i);
				}
				if (J==null){
					System.out.println(nj+" est un nom de joueur invalide. Vérifiez l'orthographe.");
					nj=Keyboard.readString();
				}
			}while(J==null);
			if (J.getArgent()>=prix){
				System.out.println(J.getNom()+" achète la carte de sortie de prison de "+nomJoueur+" au prix de "+prix+" €.");
				J.payerFrais((double)prix, joueurs,b);
				J.ajouterCartePrison();
				this.enleverCartePrison();
				argent+=prix;
				return true;
			}
			else {
				if (J.trouverArgent(prix, joueurs, b)){
					System.out.println(J.getNom()+" achète la carte de sortie de prison de "+nomJoueur+" au prix de "+prix+" €.");
					J.payerFrais((double)prix, joueurs,b);
					J.ajouterCartePrison();
					this.enleverCartePrison();
					argent+=prix;
					return true;
				}
				else{ //l'acheteur n'a pas trouvé assez d'argent
					System.out.println(nomJoueur+", vous ne pouvez pas vendre votre carte prison à "+J.getNom());
					return true;
				}
			}
		}
		else {//pas de joueurs intéressé
			System.out.println("Aucun des joueurs ne veut acheter votre carte prison au prix de "+prix);
			return false;
		}
	}
	/**
	 * permet de lever une hypothèque
	 * @param pp possessionPossible dont on doit lever l'hypothèque
	 */
	public void deshypothequer (possessionPossible pp){
		if (!pp.getEstHypothequee()){
			System.out.println("Cette propriété n'est pas hypothéquée.");
		}
		else {
			double prixARembourser=pp.getHypothequeePour()+pp.getHypothequeePour()*0.1;
			System.out.println("Pour lever cette hypothèque, vous devez débourser la somme de "+prixARembourser+"€.");
			if (argent<prixARembourser)
				System.out.println("Vous n'avez pas assez d'argent pour lever cette hypothèque. Vous ne possédez que "+argent+"€.");
			else {
				pp.setEstHypothequee(false);
				argent=argent-prixARembourser;
				System.out.println(pp.getNom()+" n'est désormais plus hypothéqué(e). Il vous reste "+argent+"€.");
			}
		}
	}
	/**
	 * permet de lever une hypothèque dans la partie IHM
	 * @param pp
	 */
	public void deshypothequerIHM (possessionPossible pp){
		if (!pp.getEstHypothequee()){
			JOptionPane.showMessageDialog(null, "Cette propriété n'est pas hypothéquée.","Erreur",JOptionPane.ERROR_MESSAGE);
		}
		else {
			double prixARembourser=pp.getHypothequeePour()+pp.getHypothequeePour()*0.1;
			JOptionPane.showMessageDialog(null, "Pour lever cette hypothèque, vous devez débourser la somme de "+prixARembourser+"€.","Hypothèque",JOptionPane.INFORMATION_MESSAGE);
			if (argent<prixARembourser)
				JOptionPane.showMessageDialog(null, "Vous n'avez pas assez d'argent pour lever cette hypothèque. Vous ne possédez que "+argent+"€.","",JOptionPane.ERROR_MESSAGE);
			else {
				pp.setEstHypothequee(false);
				argent=argent-prixARembourser;
				JOptionPane.showMessageDialog(null, pp.getNom()+" n'est désormais plus hypothéqué(e). Il vous reste "+argent+"€.","",JOptionPane.INFORMATION_MESSAGE);
			}
		}
	}
	/**
	 * 
	 * @return l'argent du joueur
	 */
	public double getArgent(){
		return argent;
	}
	/**
	 * fonction permettant d'acheter une possession au prix donné en attribut
	 * @param achat
	 * @param prix prix de vente
	 */
	public void acheter(possessionPossible achat,int prix){ 
		achat.setProprietaire(this);
		proprietes.addElement(achat);
		argent=argent-prix;
	}
	/**
	 * permet de vendre les constructions situées sur une propriété.
	 * @param vente propriété où il faut enlever les constructions.
	 * @param b banque
	 */
	public void vendreConstructionBanque(propriete vente,Banque b){
		if (vente.getNbDeConstruction()==0){
			System.out.println("Il n'y a pas de construction sur cette propriété. Vous ne pouvez pas vendre de construction à la banque.");
		}
		else {
			groupeProprietes groupe=plateau.getGroupe(vente.getColor());
			Vector <possessionPossible> propGroupe=groupe.getGroupe();
			int minConst=5;
			int maxConst=0;
			int NbConstVoulues=vente.getNbDeConstruction()-1;
			for (int i=0; i<propGroupe.size();i++){
				if (propGroupe.get(i)!=vente){
					if (minConst>((propriete)propGroupe.get(i)).getNbDeConstruction())
						minConst=((propriete)propGroupe.get(i)).getNbDeConstruction();
					if (maxConst<((propriete)propGroupe.get(i)).getNbDeConstruction())
						maxConst=((propriete)propGroupe.get(i)).getNbDeConstruction();
				}
			}
			int min=Math.min(minConst, NbConstVoulues);
			int max=Math.max(maxConst, NbConstVoulues);
			if (max-min>1)
				System.out.println("Vente impossible. Vendez vos maisons ou hôtels uniformément.");
			else{
				if (vente.getNbDeConstruction()==5)
					b.setNbHotels(1);
				else 
					b.setNbMaisons(1);
				vente.setNbDeConstruction(-1);
				argent+=(vente.getPrixUneConst()*0.5);
				if (vente.getNbDeConstruction()==0)
					System.out.println(vente.getNom()+" ne possède plus aucune maison ni hôtel.");
				else
					System.out.println(vente.getNom()+" ne possède plus que "+vente.getNbDeConstruction()+" maison(s).");
				System.out.println("Vous possédez désormais "+argent+"€.");
			}
		}
	}
	/**
	 * permet de vendre des constructions dans la partie IHM
	 * @param vente
	 * @param b
	 */
	public void vendreConstructionBanqueIHM(propriete vente,Banque b){
		if (vente.getNbDeConstruction()==0){
			JOptionPane.showMessageDialog(null, "Il n'y a pas de construction sur cette propriété.\nVous ne pouvez pas vendre de construction à la banque.","Erreur",JOptionPane.ERROR_MESSAGE);
		}
		else {
			groupeProprietes groupe=plateau.getGroupe(vente.getColor());
			Vector <possessionPossible> propGroupe=groupe.getGroupe();
			int minConst=5;
			int maxConst=0;
			int NbConstVoulues=vente.getNbDeConstruction()-1;
			for (int i=0; i<propGroupe.size();i++){
				if (propGroupe.get(i)!=vente){
					if (minConst>((propriete)propGroupe.get(i)).getNbDeConstruction())
						minConst=((propriete)propGroupe.get(i)).getNbDeConstruction();
					if (maxConst<((propriete)propGroupe.get(i)).getNbDeConstruction())
						maxConst=((propriete)propGroupe.get(i)).getNbDeConstruction();
				}
			}
			int min=Math.min(minConst, NbConstVoulues);
			int max=Math.max(maxConst, NbConstVoulues);
			if (max-min>1)
				JOptionPane.showMessageDialog(null,"Vente impossible. Vendez vos maisons ou hôtels uniformément.","Destruction impossible",JOptionPane.ERROR_MESSAGE);
			else{
				if (vente.getNbDeConstruction()==5)
					b.setNbHotels(1);
				else 
					b.setNbMaisons(1);
				vente.setNbDeConstruction(-1);
				argent+=(vente.getPrixUneConst()*0.5);
				if (vente.getNbDeConstruction()==0)
					JOptionPane.showMessageDialog(null, vente.getNom()+" ne possède plus aucune maison ni hôtel.","",JOptionPane.INFORMATION_MESSAGE);
				else
					JOptionPane.showMessageDialog(null, vente.getNom()+" ne possède plus que "+vente.getNbDeConstruction()+" maison(s).","",JOptionPane.INFORMATION_MESSAGE);
			}
		}
	}
	/**
	 * fonction permettant de construire des maisons ou un hôtel
	 * @param propAConstruire propriété sur lequel le joueur veut construire
	 * @param b banque
	 */
	public void construire(propriete propAConstruire,Banque b){
		groupeProprietes groupe=plateau.getGroupe(propAConstruire.getColor());
		Vector <possessionPossible> elementsGroupe=groupe.getGroupe();
		if (argent<propAConstruire.getPrixUneConst()){ //pas assez d'argent pour construire
			System.out.println("Vous ne pouvez pas construire. Une construction sur ce terrain coûte "+propAConstruire.getPrixUneConst()+"€.\nVous ne possédez que "+argent+"€.");
		}
		else {
			if (!groupe.possedeGroupeEntier(this))
				System.out.println("Construction impossible, vous ne possédez pas toutes les propriétés de couleur "+groupe.getColorGroupe());
			else {
				int NbConstVoulues=propAConstruire.getNbDeConstruction()+1;
				if (NbConstVoulues>5)
					System.out.println("Cette propriété possède déjà un hôtel. Vous ne pouvez pas construire plus.");
				else {
					if (NbConstVoulues==5&&b.getNbHotels()==0)
						System.out.println("Construction impossible. Il ne reste plus d'hôtel à la banque. Vous devez attendre qu'un joueur vende un de ses hötel.");
					else {
						if (NbConstVoulues<5&&b.getNbMaisons()==0)
							System.out.println("Construction impossible. Il ne reste plus de maison à la banque. Vous devez attendre qu'un joueur vende une de ses maisons.");
						else{//construction possible
							int minNbConstruction=5;
							int maxNbConstruction=0;
							for (int i=0; i<elementsGroupe.size();i++){
								if ((propriete)elementsGroupe.get(i)!=propAConstruire){
									if (minNbConstruction>((propriete)elementsGroupe.get(i)).getNbDeConstruction())
										minNbConstruction=((propriete)elementsGroupe.get(i)).getNbDeConstruction();
									if (maxNbConstruction<((propriete)elementsGroupe.get(i)).getNbDeConstruction())
										maxNbConstruction=((propriete)elementsGroupe.get(i)).getNbDeConstruction();
								}
							}
							int min=Math.min(minNbConstruction, NbConstVoulues);
							int max=Math.max(maxNbConstruction, NbConstVoulues);
							if (max-min>1)
								System.out.println("Construction impossible. Construisez uniformément.");
							else{
								propAConstruire.setNbDeConstruction(1);
								argent-=propAConstruire.getPrixUneConst();
								if (NbConstVoulues==5){
									b.setNbHotels(-1);
									b.setNbMaisons(4);
									System.out.println("Un hôtel a été construit à la place des 4 maisons.");
								}
								else{ 
									b.setNbMaisons(-1);
									System.out.println("Une maison a été construite.");
								}
							}
						}
					}
				}
			}
		}
	}
	/**
	 * meme méthode que construire avec ajout des JDialog
	 * @param propAConstruire
	 * @param b
	 */
	public void construireIHM(propriete propAConstruire,Banque b){
		groupeProprietes groupe=plateau.getGroupe(propAConstruire.getColor());
		Vector <possessionPossible> elementsGroupe=groupe.getGroupe();
		if (argent<propAConstruire.getPrixUneConst()){ //pas assez d'argent pour construire
			JOptionPane.showMessageDialog(null,"Vous ne pouvez pas construire.\nUne construction sur ce terrain coûte "+propAConstruire.getPrixUneConst()+"€.\nVous ne possédez que "+argent+"€.","Erreur",JOptionPane.ERROR_MESSAGE);
		}
		else {
			if (!groupe.possedeGroupeEntier(this))
				JOptionPane.showMessageDialog(null, "Construction impossible, vous ne possédez pas toutes les propriétés de couleur "+groupe.getColorGroupe(),"Erreur",JOptionPane.ERROR_MESSAGE);
			else {
				int NbConstVoulues=propAConstruire.getNbDeConstruction()+1;
				if (NbConstVoulues>5)
					JOptionPane.showMessageDialog(null, "Cette propriété possède déjà un hôtel. Vous ne pouvez pas construire plus.","Construction impossible",JOptionPane.WARNING_MESSAGE);
				else {
					if (NbConstVoulues==5&&b.getNbHotels()==0)
						JOptionPane.showMessageDialog(null, "Construction impossible.\n\nIl ne reste plus d'hôtel à la banque. Vous devez attendre qu'un joueur vende un de ses hôtel.","Construction impossible",JOptionPane.WARNING_MESSAGE);
					else {
						if (NbConstVoulues<5&&b.getNbMaisons()==0)
							JOptionPane.showMessageDialog(null, "Construction impossible.\n\nIl ne reste plus de maison à la banque. Vous devez attendre qu'un joueur vende une de ses maisons.","Construction impossible",JOptionPane.WARNING_MESSAGE);
						else{//construction possible
							int minNbConstruction=5;
							int maxNbConstruction=0;
							for (int i=0; i<elementsGroupe.size();i++){
								if ((propriete)elementsGroupe.get(i)!=propAConstruire){
									if (minNbConstruction>((propriete)elementsGroupe.get(i)).getNbDeConstruction())
										minNbConstruction=((propriete)elementsGroupe.get(i)).getNbDeConstruction();
									if (maxNbConstruction<((propriete)elementsGroupe.get(i)).getNbDeConstruction())
										maxNbConstruction=((propriete)elementsGroupe.get(i)).getNbDeConstruction();
								}
							}
							int min=Math.min(minNbConstruction, NbConstVoulues);
							int max=Math.max(maxNbConstruction, NbConstVoulues);
							if (max-min>1)
								JOptionPane.showMessageDialog(null, "Construction impossible. Construisez uniformément.","Construction impossible",JOptionPane.WARNING_MESSAGE);
							else{
								propAConstruire.setNbDeConstruction(1);
								argent-=propAConstruire.getPrixUneConst();
								if (NbConstVoulues==5){
									b.setNbHotels(-1);
									b.setNbMaisons(4);
									JOptionPane.showMessageDialog(null, "Un hôtel a été construit à la place des 4 maisons.","Construction",JOptionPane.INFORMATION_MESSAGE);
								}
								else{ 
									b.setNbMaisons(-1);
									JOptionPane.showMessageDialog(null, "Une maison a été construite.","Construction",JOptionPane.INFORMATION_MESSAGE);
								}
							}
						}
					}
				}
			}
		}
	}
	/**
	 * 
	 * @return le nom du joueur
	 */
	public String getNom(){
		return nomJoueur;
	}
	/**
	 * Cette fonction cherche à débiter le joueur d'une somme donnée en parametre. 
	 * Si il n'a pas assez d'argent, elle cherche des solutions. Si le joueur n'arrive malgré tout pas à rassembler assez d'argent pour payer, il fait faillite
	 * @param n somme à débiter au joueur
	 * @param joueurs ensemble des joueurs de la partie
	 * @param b banque
	 */
	public void payerFrais(double n, Vector <joueur> joueurs, Banque b){ 
		if (argent>n||argent==n){
			argent=argent-n;
		}
		else {
			System.out.println(nomJoueur+", vous n'avez pas assez d'argent pour payer.");
			if (proprietes.isEmpty()&&!possedeCarteSortirDePrison1){
				System.out.println("Vous n'avez aucune propriété ni carte de sortie de prison à vendre. Vous avez fait faillite.");
				aFaitFaillite=true;
				monopolyConsole.joueurPerdant(this);
			}
			else {
				monopolyConsole.affichagePossessions(this);
				boolean venteCartePrisonPossible=true;
				boolean ventePropPossible=true;
				Vector <possessionPossible> propAVendre=proprietes;
				do {
					if (possedeCarteSortirDePrison1&&venteCartePrisonPossible){
						venteCartePrisonPossible=venteCartePrison(joueurs,b);
					}
					if (proprietes.isEmpty()&&!venteCartePrisonPossible){
						System.out.println("Vous n'avez pas de propriétés à vendre ou à hypothéquer. Vous avez fait faillite.");
						aFaitFaillite=true;
						monopolyConsole.joueurPerdant(this);
					}
					if (ventePropPossible){
						monopolyConsole.affichagePossessions(this);
						System.out.println("Voulez-vous :");
						System.out.println("1 - Vendre une propriété à un joueur");
						System.out.println("2 - Hypothéquer");
						System.out.println("3 - Vendre des constructions à la banque");
						int choix=Keyboard.readInt();
						while (choix<1||choix>3){
							System.out.println("Erreur. Donnez un chiffre entre 1 et 3.");
							choix=Keyboard.readInt();
						}
						switch(choix){
						case 1:
							if (propAVendre.isEmpty()){
								System.out.println("Aucune de vos propriétés n'intéresse les joueurs. Vous leur avez déjà tout proposé.");
							}
							else {
								System.out.println("Quelle propriété voulez-vous vendre ?");
								int prop=Keyboard.readInt();
								while (prop<0||prop>=proprietes.size()){
									System.out.println("Erreur. Donnez un chiffre entre 0 et "+(proprietes.size()-1));
									prop=Keyboard.readInt();
								}
								if (!propAVendre.contains(proprietes.get(prop))){
									System.out.println("Vous avez déjà proposé cette propriété à la vente.");
								}
								else {
									System.out.println("A quel prix voulez-vous vendre "+proprietes.get(prop).getNom());
									int prix=Keyboard.readInt();
									System.out.println("Un joueur est-il intéressé par la propriété "+proprietes.get(prop)+" au prix de "+prix+" €.");
									String reponse4=Keyboard.readString();
									while (!reponse4.equals("oui")&&!reponse4.equals("non")){
										System.out.println("Erreur. Répondez par oui ou non");
										reponse4=Keyboard.readString();
									}
									if (reponse4.equals("non")){
										propAVendre.remove(propAVendre.indexOf(proprietes.get(prop)));
									}
									else{
										System.out.println("Quel est le nom du joueur intéressé ?");
										String nj=Keyboard.readString();
										joueur J=null;
										do {
											for (int i=0; i<joueurs.size();i++){
												if (joueurs.get(i).getNom().equals(nj))
													J=joueurs.get(i);
											}
											if (J==null){
												System.out.println(nj+" est un nom de joueur invalide. Vérifiez l'orthographe.");
												nj=Keyboard.readString();
											}
										}while(J==null);
										if (J.getArgent()>=prix){
											System.out.println(J.getNom()+" achète "+proprietes.get(prop).getNom()+" appartenant à "+nomJoueur+" au prix de "+prix+" €.");
											J.payerFrais((double)prix, joueurs,b);
											J.acheter(proprietes.get(prop),prix);
											this.enleverProp(proprietes.get(prop));
											propAVendre.remove(proprietes.get(prop));
											argent+=prix;
										}
										else {
											if (J.trouverArgent(prix, joueurs, b)){
												System.out.println(J.getNom()+" achète "+proprietes.get(prop).getNom()+" appartenant à "+nomJoueur+" au prix de "+prix+" €.");
												J.payerFrais((double)prix, joueurs,b);
												J.acheter(proprietes.get(prop),prix);
												this.enleverProp(proprietes.get(prop));
												propAVendre.remove(proprietes.get(prop));
												argent+=prix;
											}
											else //l'acheteur n'a pas trouvé assez d'argent
												System.out.println(nomJoueur+", vous ne pouvez pas vendre votre propriété à "+J.getNom());
										}
									}
								}
							}
							break;
						case 2:
							if (!possibiliteDHypothequer())
								System.out.println("Vous ne pouvez pas hypothéquer.");
							else {
								System.out.println("Quelle propriété voulez-vous hypothéquer ?");
								int choix2=Keyboard.readInt();
								while (choix2<0||choix2>=proprietes.size()){
									System.out.println("Erreur. Donnez un chiffre entre 0 et "+(proprietes.size()-1));
									choix2=Keyboard.readInt();
								}
								hypothequer(proprietes.get(choix2));
							}
							break;
						case 3:
							if (possibiliteVendreConst()){
								System.out.println("Sur quelle propriété voulez vous vendre les constructions ?");
								int choix3=Keyboard.readInt();
								if ((""+proprietes.get(choix3).getClass()).equals("class modele.propriete"))
									vendreConstructionBanque((propriete)proprietes.get(choix3),b);
								else
									System.out.println("Cette propriété n'est pas un terrain constructible.");
							}
							else {
								System.out.println("Aucun de vos terrains ne possède de construction. Vous ne pouvez pas vendre de construction.");
							}
							break;
						}
					}
					if (!venteCartePrisonPossible&&propAVendre.isEmpty()&&!possibiliteDHypothequer()&&(argent<n)){
						System.out.println("Vous n'avez plus de solution pour trouver de l'argent. Vous avez fait faillite.");
						aFaitFaillite=true;
						monopolyConsole.joueurPerdant(this);
						if (!proprietes.isEmpty()){
							for (int i=0; i<proprietes.size();i++)
								monopolyConsole.miseAuxEncheres(proprietes.get(i));
						}
						if (possedeCarteSortirDePrison1){
							if (possedeCarteSortirDePrison2){
								cartesChance.cartePrisonDispo();
								cartesCommunaute.cartePrisonDispo();
							}
							else {
								if (cartesChance.getCartePrisonPlusDispo())
									cartesChance.cartePrisonDispo();
								else
									cartesCommunaute.cartePrisonDispo();
							}
						}
					}
				}while (argent<n&&!aFaitFaillite);
				if (argent>=n){
					argent=argent-n;
					System.out.println("Vous avez trouvé assez d'argent pour payer. Il vous reste désormais "+argent+" €.");
				}
			}
		}
	}
	/**
	 * cette méthode s'est simplifiée pour la partie IHM
	 * La méthode vérifie si le joueur a assez d'argent sinon il doit en trouver par lui même en hypothéquant ou vendant ses biens. Le bouton de lancer les dés et transformé en "faire faillite"
	 * le joueur clique sur ce bouton s'il n'a pas trouvé de solutions pour trouver de l'argent
	 * @param n
	 * @param joueurs
	 * @param b
	 * @param monop
	 */
	public void payerFraisIHM(double n, Vector <IHMjoueur> joueurs, Banque b,IHMmonopoly monop){ 
		if (argent>n||argent==n){
			argent=argent-n;
		}
		else {
			if (proprietes.isEmpty()&&!possedeCarteSortirDePrison1){
				JOptionPane.showMessageDialog(null, nomJoueur+", vous n'avez pas assez d'argent pour payer.\nVous n'avez aucune propriété ni carte de sortie de prison à vendre.\nVous avez fait faillite et êtes retiré du jeu.","",JOptionPane.INFORMATION_MESSAGE);
				aFaitFaillite=true;
				IHMmonopoly.joueurPerdant(this);
				monop.passerAuJoueurSuivant();
			}
			else {
				JOptionPane.showMessageDialog(null, "Vous n'avez pas assez d'argent pour payer.\nEssayez de trouver de l'argent en hypothéquant ou en vendant vos biens","Problème d'argent",JOptionPane.WARNING_MESSAGE);
				doitPayer=n;
				IHMmonopoly.getBLancerDes().setText("Faire Faillite");
			}
		}
	}
	/**
	 * le joueur a réussi à trouver de l'argent et à payer ce qu'il doit alors cette variable est réinitialisée à 0
	 */
	public void setDoitPayer(){
		doitPayer=0.0;
	}
	/**
	 * enlève une propriété du vector contenant tous les biens du joueur
	 * @param poss possessionPossible à enlever au vector
	 */
	public void enleverProp(possessionPossible poss){
		for (int i=0; i<proprietes.size();i++){
			if (poss==proprietes.get(i))
				proprietes.remove(i);
		}
	}
	/**
	 * 
	 * @return le vector contenant tous les biens du joueur
	 */
	public Vector<possessionPossible> getPossessions(){
		return proprietes;
	}
	/**
	 * permet d'hypothéquer un bien
	 * @param pp
	 */
	public void hypothequer(possessionPossible pp){
		if (pp.getEstHypothequee()){
			System.out.println("Cette propriété est déjà hypothéquée.");
		}
		else {
			if ((""+pp.getClass()).equals("class modele.propriete")){
				if (plateau.getGroupe(((propriete)pp).getColor()).possedeConstruction())
					System.out.println("Il y a au moins une construction sur un terrain du groupe de couleur "+((propriete)pp).getColor()+". Vous ne pouvez pas hypothéquer cette propriété. Vendez d'abord les constructions.");
				else {
					pp.setEstHypothequee(true);
					argent+=pp.getHypothequeePour();
					System.out.println("La propriété a été hypothéquée. Vous possédez désormais "+argent+"€.");
				}
			}
			else {
				pp.setEstHypothequee(true);
				argent+=pp.getHypothequeePour();
				System.out.println("La propriété a été hypothéquée. Vous possédez désormais "+argent+"€.");
			}
		}
	}
	/**
	 * permet d'hypothéquer pour la version IHM
	 * @param pp
	 */
	public void hypothequerIHM(possessionPossible pp){
		if (pp.getEstHypothequee()){
			JOptionPane.showMessageDialog(null, "Cette propriété est déjà hypothéquée.","Erreur",JOptionPane.ERROR_MESSAGE);
		}
		else {
			if ((""+pp.getClass()).equals("class modele.propriete")){
				if (plateau.getGroupe(((propriete)pp).getColor()).possedeConstruction())
					JOptionPane.showMessageDialog(null, "Il y a au moins une construction sur un terrain du groupe de couleur "+((propriete)pp).getColor()+".\nVous ne pouvez pas hypothéquer cette propriété.\nVendez d'abord les constructions.","Erreur",JOptionPane.ERROR_MESSAGE);
				else {
					pp.setEstHypothequee(true);
					argent+=pp.getHypothequeePour();
					JOptionPane.showMessageDialog(null, "La propriété a été hypothéquée. Vous possédez désormais "+argent+"€.","Hypothèque",JOptionPane.INFORMATION_MESSAGE);
				}
			}
			else {
				pp.setEstHypothequee(true);
				argent+=pp.getHypothequeePour();
				JOptionPane.showMessageDialog(null, "La propriété a été hypothéquée. Vous possédez désormais "+argent+"€.","Hypothèque",JOptionPane.INFORMATION_MESSAGE);
			}
		}
	}
	/**
	 * 
	 * @return vrai si une des propriétés possédées par le joueur n'est pas hypothéquée
	 */
	public boolean possibiliteDHypothequer(){
		boolean retour=false;
		for (int i=0; i<proprietes.size();i++){
			if (!proprietes.get(i).getEstHypothequee())
				retour=true;
		}
		return retour;
	}
	/**
	 * 
	 * @return vrai si au moins une des propriétés du joueur possède au moins une maison ou hotel.
	 */
	public boolean possibiliteVendreConst(){
		boolean retour=false;
		for (int i=0; i<proprietes.size();i++){
			if ((""+proprietes.get(i).getClass()).equals("class modele.propriete")){
				if (((propriete)proprietes.get(i)).getPossedeConstruction())
					retour=true;
			}
		}
		return retour;
	}
	/**
	 * affiche une description des propriétés du joueur et renvoit faux si le joueur n'a aucune propriété
	 * @return vrai si le joueur possède au moins un bien.
	 */
	public boolean listeDesProprietes(){
		if (!proprietes.isEmpty()){
			return false;
		}
		else {
			System.out.println("Vous possédez :");
			for (int i=0; i<(proprietes.size());i++){
				if ((""+proprietes.get(i).getClass()).equals("class modele.propriete")){
					if (proprietes.get(i).getEstHypothequee())
						System.out.println(proprietes.get(i).getNom()+" de couleur "+((propriete)proprietes.get(i)).getColor()+" au prix de départ de "+proprietes.get(i).getPrix()+" et est hypothéquée.");
					else 
						System.out.println(proprietes.get(i).getNom()+" de couleur "+((propriete)proprietes.get(i)).getColor()+" au prix de départ de "+proprietes.get(i).getPrix()+" et n'est pas hypothéquée.");
				}
				else{
					if (proprietes.get(i).getEstHypothequee())
						System.out.println(i+" - "+proprietes.get(i).getNom()+" au prix de départ de "+proprietes.get(i).getPrix()+" et est hypothéquée.");
					else
						System.out.println(i+" - "+proprietes.get(i).getNom()+" au prix de départ de "+proprietes.get(i).getPrix()+" et n'est pas hypothéquée.");
				}
			}
			return true;
		}
	}
	/**
	 * ajoute de l'argent au joueur
	 * @param n somme à ajouter à l'argent du joueur
	 */
	public void recevoirArgent(double n){
		argent=argent+n;
	}
	/**
	 * déplacement d'une case dans le sens contraire
	 */
	public void recul(){
		if (positionX==0){
			if (positionY==10)
				positionX=1;
			else 
				positionY=positionY+1;
		}
		else {
			if (positionX==10){
				if (positionY==0)
					positionX=9;
				else 
					positionY=positionY-1;
			}
			else {
				if (positionY==10)
					positionX=positionX+1;
				else 
					positionX=positionX-1;
			}
		}
	}
	/**
	 * permet de changer la position du joueur en abscisse
	 * @param x
	 */
	public void setPosX(int x){
		positionX=x;
	}
	/**
	 * permet de changer la position du joueur en ordonnée
	 * @param y
	 */
	public void setPosY(int y){
		positionY=y;
	}
	/**
	 * déplace le joueur d'une case
	 */
	public void deplacement(){
		if (positionY==10){
			if (positionX==0){
				positionY=9;
			}
			else {
				positionX=positionX-1;
			}
		}
		else {
			if (positionY==0){
				if (positionX==10){
					positionY=1;
				}
				else {
					positionX=positionX+1;
				}
			}
			else {
				if (positionX==0)
					positionY=positionY-1;
				else 
					positionY=positionY+1;
			}
		}
	}
}
