package mains;
/**
 * La classe monopoly permet de gérer une partie. Elle gère l'ensemble de toutes les classes.
 * @author Emilie Collasse, Cynthia Fong, Salma Zaghloul
 * @version 1.0
 */
import java.util.*;
import java.io.*;

import modele.Banque;
import modele.Keyboard;
import modele.joueur;
import modele.plateau;
import modele.possessionPossible;
import modele.propriete;
public class monopolyConsole {
	protected static plateau p;
	protected static Vector<joueur> joueurs;
	protected static int de1;
	protected static int de2;
	protected static boolean quitterPartie;
	protected static Banque bank;
	protected static Vector<joueur> joueursPerdants;
	/**
	 * Le main commence par lire le fichier texte 'Monopoly.txt' et vérifie si une partie à été sauvegardée. Si ce n'est pas le cas, une nouvelle partie est directement commencée. Sinon, il demande à l'utilisateur si il veut charger l'ancienne partie ou commencer une nouvelle.
	 * @throws Exception exception dûe à la classe scanner pour la lecture d'un fichier texte.
	 */
	public static void main (String[]args)throws Exception{
		System.out.println("Bienvenue !");
		quitterPartie=false;
		Scanner sc=new Scanner(new File ("Sauvegarde.txt"));
		String partieSauvegardee="";
		while (sc.hasNext())
			partieSauvegardee+=sc.nextLine();
		if (partieSauvegardee==""){
			nouvellePartie();
		}
		else {
			System.out.println("Voulez-vous : ");
			System.out.println("1 - Reprendre la partie sauvegardée.");
			System.out.println("2 - Faire une nouvelle partie (La partie sauvegardée sera effaçée).");
			int reponse=Keyboard.readInt();
			while (reponse!=1&&reponse!=2){
				System.out.println("Réponse invalide. Tapez 1 ou 2.");
				reponse=Keyboard.readInt();
			}
			if (reponse==1){
				//partieSauvegardee(partieSauvegardee);
			}
			else{
				writeTextFile("Sauvegarde.txt","");
				nouvellePartie();
			}
		}
	}
	/**
	 * commence une nouvelle partie. La procédure contient tout le déroulement du jeu.
	 */
	public static void nouvellePartie(){
		bank=new Banque();
		System.out.println("Combien y a-t-il de joueurs ?");
		int nbJoueurs=Keyboard.readInt();
		while(nbJoueurs<2||nbJoueurs>8){
			System.out.println("Erreur. On ne peut jouer que de 2 à 8 joueurs. Combien y a-t-il de joueurs ?");
			nbJoueurs=Keyboard.readInt();
		}
		joueurs=new Vector <joueur>(nbJoueurs);
		joueursPerdants=new Vector <joueur> (nbJoueurs);
		for (int i=1; i<(nbJoueurs+1) ;i++){
			System.out.println("Quel est le nom du joueur n°"+i+" ?");
			joueurs.addElement(new joueur(Keyboard.readString()));
		}
		p=new plateau();
		ordreJeuJoueurs();
		boolean partieFinie=false;
		de1=0;
		de2=0;
		joueur j=null;
		while (!partieFinie&&!quitterPartie){
			for (int i=0;i<joueurs.size();i++){
				if (!partieFinie&&!quitterPartie){
					j=joueurs.get(i);
					if (j.getEnPrison()){
						j.setNbToursEnPrison(1);
						if (j.getNbToursEnPrison()==3){
							System.out.println("Vous avez déjà fait 3 tours en prison.");
							System.out.println("Si vous ne faites pas un double, vous serez obligé de payer l'amende de 50 €.");
							interactionJoueur(j,bank,1);
							if (!quitterPartie){
								de1=plateau.lancerDe();
								de2=plateau.lancerDe();
								System.out.println("Votre résultat aux dés : "+de1+" et "+de2);
								if (de1==de2){
									System.out.println("Vous pouvez sortir de prison.");
									j.setEstEnPrison(false);
									j.setNbToursEnPrison(-j.getNbToursEnPrison());
									j.seDeplacerDe(de1+de2);
									j.gererActionsCase(p.getCase(j.getPositionY(),j.getPositionX()),p,joueurs,bank);
									if (de1==de2&&!j.getEnPrison())
										rejouer(j);
								}
								else { //le joueur doit payer l'amende
									System.out.println("Ce n'est pas un double. Vous devez donc payer 50 €. L'argent ira au milieu du plateau.");
									j.payerFrais(50, joueurs, bank);
									if (!j.aPerdu()){
										plateau.augmenterArgentMilieu(50);
										System.out.println("Vous sortez de prison.");
										j.setEstEnPrison(false);
										j.setNbToursEnPrison(-j.getNbToursEnPrison());
										j.seDeplacerDe(de1+de2);
										j.gererActionsCase(p.getCase(j.getPositionY(),j.getPositionX()),p,joueurs,bank);
										if (de1==de2&&!j.getEnPrison())
											rejouer(j);
										else
											interactionJoueur(j,bank,2);
									}
									else
										plateau.augmenterArgentMilieu(j.getArgent());
								}
							}
						}
						else { //nombre de tours différent de 3
							System.out.println(j.getNom()+", vous êtes en prison.");
							System.out.println("Vous pouvez : ");
							System.out.println("1 - Payer une amende de 50 € et sortir de prison.");
							System.out.println("2 - Lancer les dés. Si vous obtenez un double, vous pourrez sortir de prison.");
							if (j.possedeCarteSortieDePrison()>0)
								System.out.println("3 - Utiliser votre carte pour sortir de prison.");
							else 
								System.out.println("3 - Acheter ou échanger une carte pour sortir de prison à un autre joueur.");
							int choix=Keyboard.readInt();
							while (choix<0||choix>3){
								System.out.println("Erreur. Donnez un chiffre entre 1 et 3");
								choix=Keyboard.readInt();
							}
							switch (choix){
							case 1 ://payer l'amende de 50€
								System.out.println("Vous avez choisi de payer l'amende.");
								j.payerFrais(50, joueurs, bank);
								if (!j.aPerdu()){
									plateau.augmenterArgentMilieu(50);
									j.setEstEnPrison(false);
									j.setNbToursEnPrison(-j.getNbToursEnPrison());
									interactionJoueur(j,bank,1);
									if (!quitterPartie){
										de1=plateau.lancerDe();
										de2=plateau.lancerDe();
										System.out.println("Vous avez fait "+de1+" et "+de2);
										j.seDeplacerDe(de1+de2);
										j.gererActionsCase(p.getCase(j.getPositionY(),j.getPositionX()),p,joueurs,bank);
										if (de1==de2&&!j.getEnPrison())
											rejouer(j);
										else 
											interactionJoueur(j,bank,2);
									}
								}
								else
									plateau.augmenterArgentMilieu(j.getArgent());
								break;
							case 2://lancer les dés
								interactionJoueur(j,bank,1);
								if (!quitterPartie){
									de1=plateau.lancerDe();
									de2=plateau.lancerDe();
									System.out.println("Vous avez fait "+de1+" et "+de2);
									if (de1==de2){//libéré de prison
										System.out.println("Vous êtes libéré de prison.");
										j.setEstEnPrison(false);
										j.setNbToursEnPrison(-j.getNbToursEnPrison());
										j.seDeplacerDe(de1+de2);
										j.gererActionsCase(p.getCase(j.getPositionY(),j.getPositionX()),p,joueurs,bank);
										if (de1==de2&&!j.getEnPrison())
											rejouer(j);
									}
									else{
										System.out.println("Ce n'est pas un double, vous restez en prison.");
										interactionJoueur(j,bank,2);
									}
								}
								break;
							case 3://carte Sortie de prison
								if (j.possedeCarteSortieDePrison()>0){
									System.out.println("Vous utilisez votre carte de sortie de prison pour vous libérer.");
									j.enleverCartePrison();
									interactionJoueur(j,bank,1);
									if (!quitterPartie){
										de1=plateau.lancerDe();
										de2=plateau.lancerDe();
										System.out.println("Vous avez fait "+de1+" et "+de2);
										j.seDeplacerDe(de1+de2);
										j.gererActionsCase(p.getCase(j.getPositionY(),j.getPositionX()),p,joueurs,bank);
										if (de1==de2&&!j.getEnPrison())
											rejouer(j);
										else 
											interactionJoueur(j,bank,2);
									}
								}
								else {//acheter carte prison
									achatVenteEchange();
									if (j.possedeCarteSortieDePrison()==0){
										System.out.println(j.getNom()+", vous n'avez pas réussi à trouver une carte pour sortir de prison. Attendez le tour suivant pour essayer de vous libérer.");
										interactionJoueur(j,bank,2);
									}
									else {
										System.out.println("Vous utilisez votre carte de sortie de prison pour vous libérer.");
										j.enleverCartePrison();
										interactionJoueur(j,bank,1);
										if (!quitterPartie){
											de1=plateau.lancerDe();
											de2=plateau.lancerDe();
											System.out.println("Vous avez fait "+de1+" et "+de2);
											j.seDeplacerDe(de1+de2);
											j.gererActionsCase(p.getCase(j.getPositionY(),j.getPositionX()),p,joueurs,bank);
											if (de1==de2&&!j.getEnPrison())
												rejouer(j);
											else 
												interactionJoueur(j,bank,2);
										}
									}
								}
								break;
							}
						}
					}
					else 
						jouer(j);
				}
				partieFinie=verifierPartieFinie();
			}
		}
		if (!quitterPartie){
			joueur gagnant=retournerGagnant();
			System.out.println("Le gagnant est "+gagnant.getNom());
		}
	}
	/**
	 * méthode permettant au joueur de jouer. Elle contient le déroulement d'un tour de jeu pour un joueur
	 * @param j joueur dont c'est le tour de jouer
	 */
	public static void jouer(joueur j){
		System.out.println(j.getNom()+", c'est à votre tour de jouer.");
		interactionJoueur(j,bank,1);
		if (!quitterPartie){
			de1=plateau.lancerDe();
			de2=plateau.lancerDe();
			System.out.println("Vous avez fait "+de1+" et "+de2);
			j.seDeplacerDe(de1+de2);
			j.gererActionsCase(p.getCase(j.getPositionY(),j.getPositionX()),p,joueurs,bank);
			if (de1==de2&&!j.getEnPrison())
				rejouer(j);
			else 
				interactionJoueur(j,bank,2);
		}
	}
	/**
	 * méthode gérant les doubles. Elle contient le déroulement du jeu quand un joueur fait un double
	 * @param j joueur dont c'est le tour de jouer
	 */
	public static void rejouer(joueur j){
		j.setNbDoubles(1);
		if (j.getNbDoubles()==3){
			System.out.println(j.getNom()+", vous avez fait 3 doubles à la suite. Vous allez en prison.");
			j.setNbDoubles(-3);
			j.setPosX(0);
			j.setPosY(10);
			j.setEstEnPrison(true);
		}
		else {
			System.out.println(j.getNom()+", vous avez fait un double. Vous pouvez rejouer.");
			interactionJoueur(j,bank,1);
			if (!quitterPartie){
				de1=plateau.lancerDe();
				de2=plateau.lancerDe();
				System.out.println("Vous avez fait "+de1+" et "+de2);
				j.seDeplacerDe(de1+de2);
				j.gererActionsCase(p.getCase(j.getPositionY(),j.getPositionX()),p,joueurs,bank);
				if(de1==de2&&!j.getEnPrison())
					rejouer(j);
				else
					interactionJoueur(j,bank,2);
			}
		}
	}
	/**
	 * Cette méthode transfère un joueur du vector de joueurs actifs au vector des joueurs ayant perdu.
	 * @param j joueur ayant perdu
	 */
	public static void joueurPerdant(joueur j){
		joueursPerdants.add(j);
		joueurs.remove(j);
	}
	/**
	 * 
	 * @return le joueur gagnant la partie
	 */
 	public static joueur retournerGagnant(){
		joueur gagnant=null;
		for (int i=0;i<joueurs.size();i++){
			if (!joueurs.get(i).aPerdu())
				gagnant=joueurs.get(i);
		}
		return gagnant;
	}
 	/**
 	 * fonction organisant la mise aux enchères de la possessionPossible passée en parametre
 	 * @param pp possessionPossible devant être vendue.
 	 */
	public static void miseAuxEncheres(possessionPossible pp){
		System.out.println("La propriété est mise aux enchères.");
		if ((""+pp.getClass()).equals("class modele.propriete"))
			System.out.println("Y a-t-il plusieurs joueurs intéressés par la propriété "+pp.getNom()+" de couleur "+((propriete)pp).getColor()+" ?");
		else 
			System.out.println("Y a-t-il plusieurs joueurs intéressés par la propriété "+pp.getNom()+" ?");
		String nbJoueursInteresses=Keyboard.readString();
		while (!nbJoueursInteresses.equals("oui")&&!nbJoueursInteresses.equals("non")){
			System.out.println("Erreu. Répondez par oui ou non.");
			nbJoueursInteresses=Keyboard.readString();
		}
		if (nbJoueursInteresses.equals("non")){
			System.out.println("Quel est le nom du joueur intéressé ?");
			String nomJoueurInteresse=Keyboard.readString();
			joueur acheteur=null;
			for (int i=0; i<joueurs.size();i++){
				if (joueurs.get(i).getNom().equals(nomJoueurInteresse)){
					acheteur=joueurs.get(i);
				}
			}
			System.out.println("A quel prix voulez vous acheter cette propriété ?");
			int prix=Keyboard.readInt();
			while (prix>acheteur.getArgent()||prix<1){
				if (prix>acheteur.getArgent())
					System.out.println("Vous n'avez pas assez d'argent. Proposez un nouveau prix plus faible");
				else 
					System.out.println("Vous devez proposer un prix supérieur à 0€. Proposer un nouveau prix.");
				prix=Keyboard.readInt();
			}
			acheteur.acheter(pp,prix);
		}
		else { //plusieurs joueurs sont intéressés
			boolean [] joueursInteresses=new boolean[joueurs.size()];
			for (int i=0; i<joueursInteresses.length;i++)
				joueursInteresses[i]=true;
			boolean miseAuxEncheresTerminee=false;
			int prixPropose=0;
			int meilleurPrix=0;
			while (!miseAuxEncheresTerminee){
				for (int i=0;i<joueurs.size();i++){
					if (!miseAuxEncheresTerminee){
						if (joueursInteresses[i]){
							if (meilleurPrix<=joueurs.get(i).getArgent()){
								System.out.println(joueurs.get(i).getNom()+", quel prix proposez-vous pour cette propriété ? Le meilleur prix proposé est actuellement de "+meilleurPrix+"€. Si vous n'êtes pas intéressé, écrivez 0");
								System.out.println("Vous possédez "+joueurs.get(i).getArgent()+"€.");
								prixPropose=Keyboard.readInt();
								while (prixPropose>joueurs.get(i).getArgent()||prixPropose<meilleurPrix){
									if (prixPropose>joueurs.get(i).getArgent())
										System.out.println("Vous ne possédez pas "+prixPropose+"€, vous n'avez que "+joueurs.get(i).getArgent()+"€. Donnez une nouvelle valeur plus faible.");
									else 
										System.out.println("Le meilleur prix proposé est de "+meilleurPrix+"€. Proposez un prix supérieur.");
									prixPropose=Keyboard.readInt();
								}
								if (prixPropose==0){
									joueursInteresses[i]=false;
								}
								if (prixPropose>meilleurPrix)
									meilleurPrix=prixPropose;
							}
							else{
								System.out.println(joueurs.get(i).getNom()+", vous ne possédez que "+joueurs.get(i).getArgent()+"€. Le prix des enchères est trop élevé pour vous. Vous ne pouvez plus enchérir.");
								joueursInteresses[i]=false;
							}
						}
					}
					miseAuxEncheresTerminee=miseAuxEncheresTerminee(joueursInteresses);
				}
			}
			joueur gagnantEncheres=gagnantEncheres(joueursInteresses);
			System.out.println(gagnantEncheres.getNom()+" remporte les enchères. Il achète "+pp.getNom()+" au prix de "+meilleurPrix+"€.");
			gagnantEncheres.acheter(pp,meilleurPrix);
		}
	}
	/**
	 * méthode permettant le bon fonctionnement de la mise aux enchères.
	 * @param joueursInteresses ensemble des joueurs intéressés par le bien mis en vente.
	 * @return vrai si il n'y plus qu'un joueur intéressé par la possessionPossible mise aux enchères.
	 */
	public static boolean miseAuxEncheresTerminee(boolean[] joueursInteresses){
		int nbJoueursInteresses=0;
		for (int i=0; i<joueurs.size();i++){
			if (joueursInteresses[i])
				nbJoueursInteresses+=1;
		}
		if (nbJoueursInteresses>1)
			return false;
		else
			return true;
	}
	/**
	 * fonction proposant diverses actions au joueur comme construire, hypothéquer, faire un échange
	 * @param joueurCourant joueur utilisant le menu
	 * @param b banque
	 * @param choixInteraction paramètre définissant si ce menu s'affiche avant le lancer de dés du joueur ou après. Le menu est légèrement différent.
	 */
	public static void interactionJoueur(joueur joueurCourant, Banque b, int choixInteraction){
		boolean boucleInteraction=true;
		do{
			System.out.println("\n"+joueurCourant.getNom()+", que voulez-vous faire ?");
			if (choixInteraction==1)
				System.out.println("1 - Lancer les dés.");
			else
				System.out.println("1 - Passer la main au joueur suivant.");
			System.out.println("2 - Construire.");
			System.out.println("3 - Vendre des constructions.");
			System.out.println("4 - Hypothéquer.");
			System.out.println("5 - Lever une hypothèque.");
			System.out.println("6 - Proposer une vente ou un échange avec un autre joueur.");
			System.out.println("7 - Voir les règles du jeu.");
			System.out.println("8 - Quitter.");
			int reponse=Keyboard.readInt();
			while (reponse<1||reponse>8){
				System.out.println("Réponse invalide. Donnez un chiffre entre 1 et 8");
				reponse=Keyboard.readInt();
			}
			switch(reponse) {
				case 1://lancez les dés ou passez la main
					boucleInteraction=false;
					break;
				case 2://construire
					System.out.println("Vous possédez "+joueurCourant.getArgent()+"€.");
					Vector <possessionPossible> constPotentiels=joueurCourant.getPossessions();
					if (constPotentiels.isEmpty())//ne détient aucune propriété
						System.out.println("Vous ne possédez aucune rue. Vous ne pouvez pas construire.");
					else {
						for (int i=0; i<constPotentiels.size();i++){
							if (!(""+constPotentiels.get(i).getClass()).equals("class modele.propriete"))
								constPotentiels.remove(constPotentiels.get(i));
						}
						if (constPotentiels.isEmpty())
							System.out.println("Vous ne possédez aucune propriété constructible.");
						else {
							System.out.println("Sur quelle rue voulez-vous construire ?");
							for (int i=1;i<(constPotentiels.size()+1);i++){
								System.out.println(i+" - "+constPotentiels.get(i-1).getNom()+" de couleur "+((propriete)constPotentiels.get(i-1)).getColor());
								System.out.println("    Une construction supplémentaire sur cette propriété coûte "+((propriete)constPotentiels.get(i-1)).getPrixUneConst()+"€.");
								if (((propriete)constPotentiels.get(i-1)).getNbDeConstruction()==5)
									System.out.println("    Cette propriété possède un hôtel.");
								else {
									if (((propriete)constPotentiels.get(i-1)).getNbDeConstruction()==0)
										System.out.println("    Cette propriété ne possède aucune construction.");
									else 
										System.out.println("    Cette propriété possède "+((propriete)constPotentiels.get(i-1)).getNbDeConstruction()+" maison(s).");
								}
							}
							int choixConst=Keyboard.readInt();
							while (choixConst<1||choixConst>constPotentiels.size()){
								System.out.println("Erreur. Donnez un n° de rue entre 1 et "+constPotentiels.size());
								choixConst=Keyboard.readInt();
							}
							joueurCourant.construire((propriete)constPotentiels.get(choixConst-1), b);
						}
					}
					break;
				case 3://détruire
					Vector <possessionPossible> destPotentiels=joueurCourant.getPossessions();
					if (destPotentiels.isEmpty())//ne détient aucune propriété
						System.out.println("Vous ne possédez aucune rue. Vous ne pouvez pas vendre de construction.");
					else {
						for (int i=0; i<destPotentiels.size();i++){
							if (!(""+destPotentiels.get(i).getClass()).equals("class modele.propriete"))
								destPotentiels.remove(destPotentiels.get(i));
						}
						if (destPotentiels.isEmpty())
							System.out.println("Vous ne possédez aucune propriété constructible. Vous ne pouvez donc pas vendre de construction.");
						else {
							System.out.println("Sur quelle rue voulez-vous vendre des maisons/hôtel ?");
							for (int i=1;i<(destPotentiels.size()+1);i++){
								System.out.println(i+" - "+destPotentiels.get(i-1).getNom()+"de couleur "+((propriete)destPotentiels.get(i-1)).getColor());
								if (((propriete)destPotentiels.get(i-1)).getNbDeConstruction()==5)
									System.out.println("    Cette propriété possède un hôtel.");
								else {
									if (((propriete)destPotentiels.get(i-1)).getNbDeConstruction()==0)
										System.out.println("    Cette propriété ne possède aucune construction.");
									else 
										System.out.println("    Cette propriété possède "+((propriete)destPotentiels.get(i-1)).getNbDeConstruction()+" maison(s).");
								}
							}
							int choixDest=Keyboard.readInt();
							while (choixDest<1||choixDest>destPotentiels.size()){
								System.out.println("Erreur. Donnez un n° de rue entre 1 et "+destPotentiels.size());
								choixDest=Keyboard.readInt();
							}
							joueurCourant.vendreConstructionBanque((propriete)destPotentiels.get(choixDest-1), b);
						}
					}
					break;
				case 4://hypothéquer
					Vector<possessionPossible> possessionsJoueur=joueurCourant.getPossessions();
					if (possessionsJoueur.isEmpty()){
						System.out.println("Vous ne possédez aucune propriété. Vous ne pouvez pas hypothéquer.");
					}
					else {
						boolean hypothequePossible=false;
						for (int i=0;i<possessionsJoueur.size();i++){
							if (!possessionsJoueur.get(i).getEstHypothequee())
								hypothequePossible=true;
						}
						if(hypothequePossible){
							System.out.println("Vous possédez :");
							for (int j=1; j<(possessionsJoueur.size()+1);j++){
								if (possessionsJoueur.get(j-1).getEstHypothequee())
									System.out.println(j+" - "+possessionsJoueur.get(j-1).getNom()+" qui est hypothéquée.");
								else 
									System.out.println(j+" - "+possessionsJoueur.get(j-1).getNom()+" qui n'est pas hypothéquée. Une hypothèque vous rapporterait "+possessionsJoueur.get(j-1).getHypothequeePour()+"€.");
							}
							System.out.println("Quelle propriété voulez-vous hypothéquée ?");
							int choixHypotheque=Keyboard.readInt();
							while (choixHypotheque<1||choixHypotheque>(possessionsJoueur.size()+1)){
								System.out.println("Erreur. Donnez un n° de propriété entre 1 et "+possessionsJoueur.size());
								choixHypotheque=Keyboard.readInt();
							}
							joueurCourant.hypothequer(possessionsJoueur.get(choixHypotheque-1));
						}
						else 
							System.out.println("Toutes vos propriétés sont hypothéquées.");
					}
					break;
				case 5: //lever une hypothèque
					Vector <possessionPossible> possJoueur=joueurCourant.getPossessions();
					if (possJoueur.isEmpty())//le joueur n'a pas de propriété
						System.out.println("Vous n'avez pas de propriété. Vous ne pouvez pas lever d'hypothèque.");
					else {
						boolean deshypothequePossible=false;
						for (int i=0;i<possJoueur.size();i++){
							if (possJoueur.get(i).getEstHypothequee())
								deshypothequePossible=true;
						}
						if (!deshypothequePossible)
							System.out.println("Aucune de vos propriétés n'est hypothéquée. Vous ne pouvez pas lever d'hypothèque.");
						else{
							System.out.println("Vous possédez :");
							for (int i=0;i<possJoueur.size();i++){
								if (possJoueur.get(i).getEstHypothequee())
									System.out.println((i+1)+" - "+possJoueur.get(i).getNom()+" qui est hypothéquée.");
								else 
									System.out.println((i+1)+" - "+possJoueur.get(i).getNom()+" qui n'est pas hypothéquée.");
							}
							System.out.println("Quelle hypothèque voulez-vous lever ?");
							int choixDeshypo=Keyboard.readInt();
							while (choixDeshypo<1||choixDeshypo>(possJoueur.size()+1)){
								System.out.println("Erreur. Donnez un n° entre 1 et "+(possJoueur.size()+1));
								choixDeshypo=Keyboard.readInt();
							}
							joueurCourant.deshypothequer(possJoueur.get(choixDeshypo-1));
						}
					}
					break;
				case 6://échange ou vente avec d'autres joueurs
					achatVenteEchange();
					break;
				case 7://règles du jeu
					affichageRegles();
					break;
				case 8://quitter le jeu
					quitterPartie=true;
					boucleInteraction=false;
					System.out.println("A bientôt !");
					break;
			}
		}while (boucleInteraction);
	}
	/**
	 *procédure affichant les règles à l'utilisateur. Le joueur peut avoir plus ou moins de détails s'il le souhaite. 
	 */
	public static void affichageRegles(){
		System.out.println("Monopoly est le jeu où l’on vend, achète ou loue des propriétés de manière profitable,\nafin que les joueurs puissent s’enrichir (le plus riche d’entre eux étant déclaré\nvainqueur). Le but du jeu est donc d’être le dernier joueur à ne pas avoir fait faillite.\nLes joueurs partent de la case « Départ » et déplacent leurs pions sur le plateau en fonction\ndu résultat des dés. Lorsqu’un joueur parvient sur la case d’une propriété à vendre, il\npeut l’acheter à la Banque. S’il ne désire pas le faire, la propriété est mise aux enchères\net va au plus offrant. Lorsqu’un joueur s’arrête sur la propriété d’un autre joueur, il doit\nlui verser un loyer. La construction de Maisons ou d’Hôtels augmente considérablement\nle montant des loyers : il est donc sage de construire sur ses terrains. Pour obtenir de\nl’argent, il est possible d’hypothéquer ses propriétés à la Banque. Les cases Chance et\nCommunauté permettent de tirer une carte dont il faut suivre les instructions. Il arrive\naussi que l’on se retrouve en Prison.\nAu départ, chaque joueur possède 1500€.");
		boolean retourAuJeu=false;
		int reponseJoueur=0;
		do {
			System.out.println("\nPour plus de détails :");
			System.out.println("0 - Déroulement du jeu.");
			System.out.println("1 - Les doubles.");
			System.out.println("2 - La case départ.");
			System.out.println("3 - Arrêt sur une propriété à vendre.");
			System.out.println("4 - Posséder une propriété.");
			System.out.println("5 - Arrêt sur une propriété privée.");
			System.out.println("6 - Arrêt sur les cases 'compagnie de distribution'.");
			System.out.println("7 - Arrêt sur une gare.");
			System.out.println("8 - Arrêt sur une case 'chance' ou 'communauté'.");
			System.out.println("9 - Arrêt sur les cases 'Impôts' et 'Taxe de luxe'.");
			System.out.println("10 - Arrêt sur le parc gratuit.");
			System.out.println("11 - Prison");
			System.out.println("12 - Conditions pour sortir de prison.");
			System.out.println("13 - Les maisons.");
			System.out.println("14 - Les hôtels.");
			System.out.println("15 - Crise du bâtiment.");
			System.out.println("16 - Vente de propriété.");
			System.out.println("17 - Hypothèques.");
			System.out.println("18 - Faillite.");
			System.out.println("19 - Retour au jeu.");
			reponseJoueur=Keyboard.readInt();
			while (reponseJoueur<0||reponseJoueur>19){
				System.out.println("Erreur. Donnez un nombre entre 0 et 19.");
				reponseJoueur=Keyboard.readInt();
			}
			switch (reponseJoueur){
			case 0://déroulement du jeu
				System.out.println("Au départ, chaque joueur possède 1500€. Chaque joueur lance les dés et celui qui\nobtient le meilleur score commence, puis le joueur se situant à sa gauche joue après lui.\nQuand arrive votre tour de jeu, lancez les 2 dés puis avancez votre pion sur le plateau de\njeu, d’autant de cases que l’indique le total des dés, et dans le sens indiqué pas la flèche.\nLa case sur laquelle vous allez vous arrêter vous indique ce que vous devez ou pouvez\nfaire. Deux pions ou plus peuvent se trouver sur une même case au même moment.\nSuivant la nature de la case sur laquelle vous êtes arrive, vous pouvez effectuer l’une des opérations suivante :\n - Acheter un terrain ou une autre propriété,\n - Payer un loyer (si la propriété appartient a un autre joueur),\n - Payer des impôts.\n - Tirer une carte 'Chance' ou 'Caisse de Communauté',\n - Aller en Prison,\n - Bénéficier du Parc Gratuit,\n - Toucher un salaire de 200 €.\n\nLorsque vous avez terminé votre tour, ce sera au joueur situé à votre gauche de jouer.");
				break;
			case 1: //les doubles
				System.out.println("Si vous obtenez un double avec les dés, déplacez-vous normalement. Effectuez\nl’opération de votre case d’arrivée, puis relancez les des et déplacez-vous a nouveau.\nVous effectuerez alors une nouvelle opération. Cependant, si vous obtenez un double\ntrois fois de suite, vous devez vous rendre immédiatement en Prison. Votre tour de jeu\nest alors terminé.");
				break;
			case 2:// la case départ
				System.out.println("Chaque fois que vous passez ou vous arrêtez sur la case « Départ », la Banque vous verse\nun salaire de 200 euros. Il peut arriver que vous receviez ce salaire de 200 euros deux\nfois au cours du même tour de plateau si, par exemple, vous tombez sur une case Chance\nou Caisse de Communauté immédiatement après la case « Départ » et que vous tirez une\ncarte vous demandant de vous rendre a la case « Départ ».");
				break;
			case 3://arrêt sur une propriété à vendre
				System.out.println("Si vous vous arrêtez sur une propriété qui n’appartient a personne (c’est-à-dire à une\npropriété dont aucun joueur ne possède le Titre de Propriété), vous pouvez décider de\nl’acheter. Dance ce cas, payez a la Banque le prix indique sur le plateau. La Banque vous\ndonnera alors. En échange, le Titre de Propriété correspondant : placez cette carte, face\nvisible, devant vous. Si vous décidez de ne pas acheter cette propriété, la Banque doit la\nmettre aussitôt aux enchères, et la vendre au plus offrant. La mise a prix est la première\noffre faite. Tous les joueurs peuvent participer a l’enchère, y compris qui a décliné\nl’achat.");
				break;
			case 4://posséder une propriété
				System.out.println("Posséder une Propriété vous donne le droit de percevoir un loyer de la part des joueurs\nqui vont s’arrêter sur cette Propriété. C’est un atout de posséder les Titres de Propriété\nde tous les terrains d’une même couleur (autrement dit, de posséder un monopole) car\nvous pouvez alors construire sur les terrains de ce groupe.");
				break;
			case 5://Arrêt sur une propriété privée
				System.out.println("Quand vous vous arrêtez sur une Propriété qui a été achetée par un autre joueur, vous\ndevez payer un loyer au Propriétaire. Le montant du loyer figure sur le Titre de\nPropriété, et varie selon le nombre de Maisons construits sur cette propriété.Si un\njoueur possède tous les terrains d’une même couleur, la valeur du loyer de ces terrains\nest alors multipliée par deux. Par contre, si l’un des terrains du groupe est hypothéqué,\nle loyer est ordinaire pour les terrains non hypothéqués, et inexistant pour le terrain\nhypothéqué. Lorsqu’un joueur a construit des Maisons ou Hôtels sur un terrain, le loyer\naugmente, comme indiqué sur le Titre de Propriété.");
				break;
			case 6://Arrêt sur les cases compagnie de distribution
				System.out.println("Quand vous vous arrêtez sur une de ces cases, vous pouvez l’acheter si cette Compagnie\nde Distribution n’appartient a personne. Comme pour les Propriétés, payez a la Banque\nle prix indique sur le plateau. Si la Compagnie de Distribution appartient déjà à l’un des\njoueurs, le propriétaire peut alors vous réclamer un loyer, qui est en fonction des points\nindiqués par les dés que vous venez de lancer :\n - Si ce propriétaire possède une Compagnie de Distribution, le loyer sera égal a quatre\nfois la valeur de vos dés.\n - S’il possède les deux Compagnies de Distribution, le loyer s’élèvera alors a dix fois la\nvaleur indiquée par les dés.");
				break;
			case 7://Arrêt sur une gare
				System.out.println("Si vous êtes le premier joueur a vous arrêter sur une case Gare, vous pouvez décider de\nl’acheter. Sinon cette Gare sera mise aux enchères par la Banque, et même si vous avez\ndécliné l’achat, vous pouvez participer aux enchères. Si la Gare a déjà été achetée, vous\ndevez payer au Propriétaire le montant indique sur le Titre de Propriété. Le loyer varie\nen fonction du nombre total de Gares possédées par ce joueur.");
				break;
			case 8://arrêt sur une case chance ou communauté
				System.out.println("Lorsque vous vous arrêtez sur l’une de ces cases, vous devez tirer la première carte de la\npile indiquée. Ces cartes peuvent vous demander de : \n - Déplacer votre pion\n - Faire un paiement (par exemple, pour des taxes)\n - Recevoir de l’argent\n - Aller en Prison\n - Sortir de Prison\n\nVous devez suivre exactement les instructions de cette carte, puis la replacer sous la\npile. Si vous tirez une carte -Vous êtes libéré de prison', vous pouvez la conserver\njusqu'à ce que vous en ayez besoin, ou la vendre, à  un prix défini en accord avec l’acheteur.\nRemarque : si une carte vous demande de déplacer votre pion, il se peut que vous ayez a\npasser par la case 'Départ'. Dans ce cas, recevez 200€. Vous ne devez pas passez par la\ncase 'Départ' lorsque vous êtes envoyé en Prison.");
				break;
			case 9://arrêt sur les cases impôts et taxe de luxe
				System.out.println("Payez a la Banque le montant indiqué sur ces cases.");
				break;
			case 10://arrêt sur le parc gratuit
				System.out.println("Lorsque vous vous arrêtez sur cette case, vous recevez tout l’argent place au centre du\nplateau de jeu. Vous repartirez de cette case au tour suivant.");
				break;
			case 11://prison
				System.out.println("Vous êtes envoyé en Prison :\n - Si vous vous arrêtez sur la case 'Allez en prison'\n - Si vous tirez une carte Chance ou Caisse de Communauté qui vous indique\n'Allez en prison'\n - Si vous obtenez 3 fois de suite un double avec les dés.\n - L’arrivée en Prison met fin à votre tour de jeu. Vous ne franchissez pas la case\n'Départ' et vous ne recevez pas 200 €.");
				break;
			case 12://conditions pour sortir de prison
				System.out.println(" - Si vous payez une amende de 50 euros que vous placez au centre du plateau avant\nde lancer les dés et de continuer votre tour de jeu, ou\n - Si vous faites un double avec les dés durant l’un des trois tours qui suit votre\narrivée en Prison ; déplacez-vous alors du nombre de cases indiqué par les dés,\njouez, puis relancez les dés - comme tout joueur ayant obtenu un double – et\nrejouez, ou\n - Si vous achetez une carte ’Vous êtes libéré de prison’ à un autre joueur, à\nun prix convenu entre vous deux, ou\n - Si vous possédez déjà une carte 'Vous êtes libéré de prison'.\nVous ne pouvez rester plus de trois tours en Prison. Aussitôt après avoir lancé les dés au\ncours du troisième tour, vous devez – si vous n’avez pas fait de double – payer une\namende de 50€ que vous placez alors au centre du plateau. Puis déplacez-vous du\nnombre de cases indiqué par les dés et jouez.\nPendant que vous êtes en Prison, vous pouvez percevoir des loyers, si les propriétés\ncorrespondantes ne sont pas hypothéquées. Si vous n’êtes pas 'envoyé' en Prison mais\nque vous parvenez sur cette case dans le cours normal du jeu, votre séjour est considéré\ncomme une 'simple visite'. Vous n’encourrez aucune pénalité et vous pouvez vous\ndéplacer normalement au tour suivant. ");
				break;
			case 13://les maisons
				System.out.println("Une fois que vous possédez tous les terrains d’un groupe de couleur, vous pouvez\nacheter des Maisons a placer sur ces terrains, ce qui augmente la valeur du loyer que\nvous allez réclamer aux autres joueurs. Le prix d’une Maison est indique sur le Titre de\nPropriété correspondant. A tout moment, durant votre tour de jeu, vous pouvez acheter\net construire autant de Maisons que votre fortune vous le permet. Vous devez cependant\nconstruire uniformément, c’est-a-dire que vous ne pouvez pas construire plus d’une\nMaison par terrain tant que vous n’avez pas construit une Maison sur chaque terrain de\nce groupe. Vous pouvez alors commencer a construire une seconde rangée de Maisons,\net ainsi de suite. De la même façon, si vous souhaitez revendre des Maisons, vous devez\ndégarnir tous les terrains du groupe uniformément. Si vous possédez tous les terrains\nd’un groupe de couleur, et que vous n’avez construit de Maison que sur un ou deux de\nces terrains, vous continuez a percevoir un double loyer pour les terrains nus de ce\ngroupe, lorsqu’un joueur s’y arrête. Vous ne pouvez pas construire de Maison sur un\nterrain si dans le même groupe, un terrain est hypothéqué.");
				break;
			case 14://les hôtels
				System.out.println("Pour pouvoir acheter un Hôtel, vous devez posséder 4 Maisons sur chaque terrain d’un\nmême groupe. Si vous désirez construire un Hôtel, demandez à la Banque de vous\néchanger les 4 Maisons du terrain de votre choix contre un Hôtel, et acquittez-vous du\nprix indique pour un Hôtel sur le Titre de Propriété, puis placez votre Hôtel sur ce\nterrain. Vous ne pouvez construire qu’un Hôtel par terrain.");
				break;
			case 15://crise du batiment
				System.out.println("Si la Banque n’a plus de Maisons a vendre, les joueurs qui désirent construire doivent\nattendre qu’un joueur ait rendu ou vendu ses Maisons. De même façon, quand vous\nvendez des Hôtels, vous ne pouvez pas les remplacer par des Maisons qu’il n’y en a plus\nde disponibles.");
				break;
			case 16://vente de propriété
				System.out.println("Vous pouvez échanger ou vendre des terrains nus, des Gares de Distribution avec un\nautre joueur, a un convenu entre vous deux. Cependant, vous ne pouvez pas vendre un\nterrain a un autre joueur su vous avez une Construction (Maisons ou Hôtel) sur un\nterrain de même couleur. Pour pouvoir le faire, vous devez auparavant revendre\nl’ensemble des constructions de ce groupe a la Banque. Une propriété, hypothéquée ou\nnon, ne peut être vendu qu’a un autre joueur, jamais a la Banque. Vous ne pouvez\nrevendre vos Maisons et Hôtels qu’a la Banque. Vous pouvez les vendre a n’importe quel\nmoment du jeu, et a la moitie de leur prix d’achat. Pour un Hôtel, la Banque paiera la\nmoitie du prix d’achat de cet Hôtel plus la moitie du prix d’achat des 4 Maisons qui lui\nont été vendus pour la construction de cet Hôtel (soit, en définitive, la moitie du prix\nd’achat de 5 Maisons sur ce terrain).");
				break;
			case 17://hypothèques
				System.out.println("Si vous avez besoin d’argent, vous pouvez hypothéquer une propriété, et recevoir de la\nbanque la somme indiquée au dos du Titre de Propriété. Les Maisons et les Hôtels ne\npeuvent pas être hypothéqué. Avant d’hypothéquer un terrain, vous devez donc\nrevendre l’ensemble des constructions situées sur les terrains du même groupe (la\nBanque les rachète a la moitie du prix d’achat). Vous retournez alors la carte de la\npropriété hypothéquée, face contre table. Vous ne pouvez plus percevoir de loyer sur\ncette propriété, ni y construire de Maison ou d’Hôtel. Vous pouvez lever l’hypothèque, en\nversant a la Banque la somme qu’elle vous a prêté augmentée d’un intérêt de 10%.\nQuand vous hypothéquez un terrain, vous en restez prioritaire. Un autre joueur ne peut\npas l’acquérir en levant l’hypothèque au près de la Banque. Vous pouvez par contre\nvendre une propriété hypothéquée aux autres joueurs, à un prix que vous aurez défini\nentre vous. Le nouveau propriétaire a alors le droit de lever cette hypothèque en payant\nle tarif indique, augmente des 10% d’intérêt. S’il décide de ne pas lever l’hypothèque, il\ndoit néanmoins payer les intérêts. S’il décide de lever l’hypothèque plus tard, il devra\npayer les 10% d’intérêt.");
				break;
			case 18://faillite
				System.out.println("Si vous devez à la banque ou à un autre joueur plus d’argent que vous n’en possédez,\nvous faites faillite et vous devez alors vous retirer du jeu. Si votre créancier est la\nbanque, vous devez lui remettre tout votre argent ainsi que vos titres de propriété. Le\nbanquier met alors aux enchères ces propriétés, qui seront vendues au plus offrant.\nVous devez également remettre vos cartes ’vous êtes libéré de prison’ sous la pile\ncorrespondante. Si votre créancier est un autre joueur, vos maisons et hôtels sont\nvendus à la banque à la moitié de leur prix d’achat et votre créancier reçoit alors tout\nl’argent, tous les titres de propriété et les cartes ’vous êtes libéré de prison’ que vous\npossédez. Si vous possédez des propriétés hypothéquées, vous devez également les\nremettre à votre créancier, celui-ci doit immédiatement payer les  10% d’intérêt et alors\nchoisir de lever ou non l’hypothèque.");
				break;
			case 19 :
				retourAuJeu=true;
				break;
			}
		}while (!retourAuJeu);		
	}
	/**
	 * méthode organisant un achat-vente ou un échange entre les joueurs.
	 */
	public static void achatVenteEchange(){

		//Description de tout ce que possèdent les joueurs :
		for (int i=0; i<joueurs.size();i++){ 
			affichagePossessions(joueurs.get(i));
		}
		System.out.println("Voulez-vous procéder à un échange (choix 1)  ou à un achat-vente (choix 2) ?");
		int achatEchange=Keyboard.readInt();
		while (achatEchange!=1&&achatEchange!=2){
			System.out.println("Erreur. Répondez par 1 ou 2.");
			achatEchange=Keyboard.readInt();
		}
		if (achatEchange==1){ //échange
			System.out.println("Quel est le premier joueur voulant participer à l'échange ?");
			String joueur1=Keyboard.readString();
			System.out.println("Quel est le deuxième joueur voulant participer à l'échange ?");
			String joueur2=Keyboard.readString();
			joueur J1=null;
			joueur J2=null;
			for (int i=0; i<joueurs.size();i++){
				if (joueur1.equals(joueurs.get(i).getNom())){
					J1=joueurs.get(i);
				}
				if (joueur2.equals(joueurs.get(i).getNom())){
					J2=joueurs.get(i);
				}
			}
			while (J1==null||J2==null){
				if (J1==null){
					System.out.println(joueur1+" est un nom de joueur invalide. Vérifiez l'orthographe.");
					joueur1=Keyboard.readString();
				}
				if (J2==null){
					System.out.println(joueur2+" est un nom de joueur invalide. Vérifiez l'orthographe.");
					joueur2=Keyboard.readString();
				}
				for (int i=0; i<joueurs.size();i++){
					if (joueur1.equals(joueurs.get(i).getNom())){
						J1=joueurs.get(i);
					}
					if (joueur2.equals(joueurs.get(i).getNom())){
						J2=joueurs.get(i);
					}
				}
			}
			if ((J1.getPossessions().size()==0&&J1.possedeCarteSortieDePrison()==0)||(J2.getPossessions().size()==0&&J2.possedeCarteSortieDePrison()==0)){
				System.out.println("Un des joueurs sélectionné ne possède aucune propriété. Un échange est impossible.");
			}
			else {
				affichagePossessions(J2);
				System.out.println(J1.getNom()+", quel propriété de "+J2.getNom()+" vous intéresse ? \nEcrivez le n° de propriété, si vous êtes intéressé par la carte de sortie de prison, écrivez 'prison'.");
				String reponse=Keyboard.readString();
				if (reponse.equals("prison")){
					if (J2.possedeCarteSortieDePrison()==0)
						System.out.println(J2.getNom()+" ne possède pas la carte prison. L'échange est impossible.");
					else {// faire un échange avec la carte prison
						System.out.println("Avec quelle propriété voulez-vous échanger la carte prison ? Ecriver le n° de propriété.");
						affichagePossessions(J1);
						int propEchange=Keyboard.readInt();
						while (propEchange<0||propEchange>=J1.getPossessions().size()){
							System.out.println("Erreur. Donnez un chiffre entre 0 et "+(J1.getPossessions().size()-1));
							propEchange=Keyboard.readInt();
						}
						System.out.println("Vous voulez échanger la carte prison de "+J2.getNom()+" avec la propriété "+J1.getPossessions().get(propEchange)+" de "+J1.getNom());
						if (((""+J1.getPossessions().get(propEchange).getClass()).equals("class modele.propriete"))&&plateau.getGroupe(((propriete)J1.getPossessions().get(propEchange)).getColor()).possedeConstruction())
							System.out.println("Echange impossible. Au moins une propriété du groupe de couleur "+((propriete)J1.getPossessions().get(propEchange)).getColor()+" possède des constructions. "+J1.getNom()+" doit d'abord vendre les maisons de ce groupe.");
						else{
							System.out.println(J1.getNom()+" et "+J2.getNom()+" sont-ils d'accord pour procéder à l'échange ?");
							String accordJoueurs=Keyboard.readString();
							while (!accordJoueurs.equals("oui")&&!accordJoueurs.equals("non")){
								System.out.println("Réponse invalide. Répondez par oui ou non.");
								accordJoueurs=Keyboard.readString();
							}
							if (accordJoueurs.equals("oui")){
								J2.enleverCartePrison();
								J1.ajouterCartePrison();
								J2.acheter(J1.getPossessions().get(propEchange),0);
								J1.enleverProp(J1.getPossessions().get(propEchange));
								System.out.println("L'échange a eu lieu.");
							}
							else
								System.out.println("L'échange n'a pas abouti.");
						}
					}
				}
				else {//échange de propriété
					int propEchangeJ1=Integer.parseInt(reponse);
					while (propEchangeJ1<0||propEchangeJ1>=J2.getPossessions().size()){
						System.out.println("Erreur. Donnez un n° de propriété entre 0 et "+(J2.getPossessions().size()-1));
						reponse=Keyboard.readString();
						propEchangeJ1=Integer.parseInt(reponse);
					}
					if (((""+J2.getPossessions().get(propEchangeJ1).getClass()).equals("class modele.propriete"))&&plateau.getGroupe(((propriete)J2.getPossessions().get(propEchangeJ1)).getColor()).possedeConstruction())
						System.out.println("Echange impossible. Le groupe de couleur "+((propriete)J2.getPossessions().get(propEchangeJ1)).getColor()+" possède au moins une construction. "+J2.getNom()+" doit d'abord vendre les maisons de ce groupe.");
					else {
						System.out.println(J2.getNom()+", avec quelle propriété de "+J1.getNom()+" voulez-vous échanger "+J2.getPossessions().get(propEchangeJ1).getNom()+" ?\nEcrivez 'prison' si vous êtes intéressé par la carte de sortie de prison.");
						affichagePossessions(J1);
						reponse=Keyboard.readString();
						if (reponse.equals("prison")){
							if (J1.possedeCarteSortieDePrison()==0)
								System.out.println("L'échange est impossible. "+J1.getNom()+" ne possède pas la carte de sortie de prison.");
							else{
								System.out.println("Vous voulez échanger la carte prison de "+J1.getNom()+" avec la propriété "+J2.getPossessions().get(propEchangeJ1)+" de "+J2.getNom());
								System.out.println(J1.getNom()+" et "+J2.getNom()+" sont-ils d'accord pour procéder à l'échange ?");
								String accordJoueurs=Keyboard.readString();
								while (!accordJoueurs.equals("oui")&&!accordJoueurs.equals("non")){
									System.out.println("Réponse invalide. Répondez par oui ou non.");
									accordJoueurs=Keyboard.readString();
								}
								if (accordJoueurs.equals("oui")){
									J1.enleverCartePrison();
									J2.ajouterCartePrison();
									J1.acheter(J2.getPossessions().get(propEchangeJ1),0);
									J1.enleverProp(J1.getPossessions().get(propEchangeJ1));
									System.out.println("L'échange a eu lieu.");
								}
								else 
									System.out.println("L'échange n'a pas abouti.");
							}
						}
						else {
							int propEchangeJ2=Integer.parseInt(reponse);
							while (propEchangeJ2<0||propEchangeJ2>(J1.getPossessions().size()-1)){
								System.out.println("Erreur. Donnez un n° de propriété entre 0 et "+(J1.getPossessions().size()-1));
								reponse=Keyboard.readString();
								propEchangeJ2=Integer.parseInt(reponse);
							}
							if ((""+J1.getPossessions().get(propEchangeJ2).getClass()).equals("class modele.propriete")&&plateau.getGroupe(((propriete)J1.getPossessions().get(propEchangeJ2)).getColor()).possedeConstruction())
								System.out.println("Echange impossible. Le groupe de couleur "+((propriete)J1.getPossessions().get(propEchangeJ2)).getColor()+" possède au moins une construction. "+J1.getNom()+" doit d'abord vendre les maisons de ce groupe.");
							else{
								System.out.println("Vous voulez échanger "+J1.getPossessions().get(propEchangeJ2).getNom()+" appartenant à "+J1.getNom()+" avec "+J2.getPossessions().get(propEchangeJ1).getNom()+" appartenant à "+J2.getNom());
								System.out.println("Les deux joueurs sont-ils d'accords ?");
								String accord=Keyboard.readString();
								while(!accord.equals("oui")&&!accord.equals("non")){
									System.out.println("Réponse invalide. Répondez par oui ou non");
									accord=Keyboard.readString();
								}
								if (accord.equals("oui")){
									J1.acheter(J2.getPossessions().get(propEchangeJ1),0);
									J2.acheter(J1.getPossessions().get(propEchangeJ2),0);
									J1.enleverProp(J1.getPossessions().get(propEchangeJ2));
									J2.enleverProp(J2.getPossessions().get(propEchangeJ1));
									System.out.println("L'échange a eu lieu.");
								}
								else 
									System.out.println("L'échange n'a pas abouti.");
							}
						}
					}
				}
			}
		}
		else { //achat-vente
			System.out.println("Quel est le joueur vendeur ?");
			String vendeur=Keyboard.readString();
			joueur v=null;
			
			while (v==null){
				for (int i=0;i<joueurs.size();i++){
					if (joueurs.get(i).getNom().equals(vendeur))
						v=joueurs.get(i);
				}
				if (v==null){
					System.out.println("Ce nom de joueur est invalide. Vérifiez l'orthographe.");
					vendeur=Keyboard.readString();
				}
			}
			if (v.getPossessions().size()==0&&v.possedeCarteSortieDePrison()==0){
				System.out.println("Ce joueur n'a rien à vendre. La vente est impossible.");
			}
			else {
				System.out.println("Quel est le joueur acheteur ?");
				String acheteur=Keyboard.readString();
				joueur a=null;
				while (a==null){
					for (int i=0;i<joueurs.size();i++){
						if (joueurs.get(i).getNom().equals(acheteur))
							a=joueurs.get(i);
					}
					if (a==null){
						System.out.println("Ce nom de joueur est invalide. Vérifiez l'orthographe.");
						acheteur=Keyboard.readString();
					}
				}
				affichagePossessions(v);
				System.out.println(a.getNom()+", quelle propriété de "+v.getNom()+" vous intéresse ? Ecrivez 'prison' si la carte de sortie de prison vous intéresse.");
				String reponse2=Keyboard.readString();
				if (reponse2.equals("prison")){
					if (v.possedeCarteSortieDePrison()==0)
						System.out.println("Vente impossible. "+v.getNom()+" ne possède pas la carte pour sortir de prison.");
					else {
						System.out.println(v.getNom()+", à quel prix voulez-vous vendre votre carte de sortie de prison ? Répondez -1 si vous ne voulez pas la vendre.");
						int prixVen=Keyboard.readInt();
						if (prixVen==-1)
							System.out.println("Le vendeur ne veut pas vendre. La vente est annulée.");
						else {
							System.out.println(a.getNom()+", le vendeur propose sa carte de sortie de prison pour "+prixVen+" €. Voulez-vous l'acheter ?");
							String reponse3=Keyboard.readString();
							while (!reponse3.equals("oui")&&!reponse3.equals("non")){
								System.out.println("Réponse invalide. Répondez par oui ou non.");
								reponse3=Keyboard.readString();
							}
							if (reponse3=="oui"){
								if (a.getArgent()>=prixVen){
									a.ajouterCartePrison();
									v.enleverCartePrison();
									a.payerFrais(prixVen, joueurs,bank);
									v.recevoirArgent(prixVen);
									System.out.println("La vente a eu lieu.");
									System.out.println(a.getNom()+", il vous reste "+a.getArgent()+"€.");
									System.out.println(v.getNom()+", vous avez désormais "+v.getArgent()+"€.");
								}
								else {
									if (a.trouverArgent(prixVen, joueurs,bank)){
										a.ajouterCartePrison();
										v.enleverCartePrison();
										a.payerFrais(prixVen, joueurs,bank);
										v.recevoirArgent(prixVen);
										System.out.println("La vente a eu lieu.");
										System.out.println(a.getNom()+", il vous reste "+a.getArgent()+"€.");
										System.out.println(v.getNom()+", vous avez désormais "+v.getArgent()+"€.");
									}
									else {
										System.out.println(a.getNom()+", vous n'avez pas assez d'argent. La vente est annulée.");
									}
								}
							}
							else {
								System.out.println("Les joueurs ne sont pas tombés d'accord. La vente est annulée.");
							}
						}
					}
				}
				else {
					int propA=Integer.parseInt(reponse2);
					if ((""+v.getPossessions().get(propA).getClass()).equals("class modele.propriete")&&plateau.getGroupe(((propriete)v.getPossessions().get(propA)).getColor()).possedeConstruction())
						System.out.println("Vente impossible. Le groupe de couleur "+((propriete)v.getPossessions().get(propA)).getColor()+" possède au moins une construction. "+v.getNom()+" doit d'abord vendre les maisons de ce groupe.");
					else {
						System.out.println(v.getNom()+", quel prix proposez-vous pour cette propriété ?");
						int prixV=Keyboard.readInt();
						System.out.println(a.getNom()+", êtes-vous d'accord pour acheter "+v.getPossessions().get(propA).getNom()+" au prix proposé ?");
						String accordAV=Keyboard.readString();
						while (!accordAV.equals("oui")&&!accordAV.equals("non")){
							System.out.println("Réponse invalide. Répondez par oui ou non .");
							accordAV=Keyboard.readString();
						}
						if (accordAV.equals("oui")){
							if (a.getArgent()>=prixV){
								a.acheter(v.getPossessions().get(propA), prixV);
								v.getPossessions().remove(propA);
								v.recevoirArgent(prixV);
								System.out.println("La vente a eu lieu.");
								System.out.println(a.getNom()+", il vous reste "+a.getArgent()+"€.");
								System.out.println(v.getNom()+", vous avez désormais "+v.getArgent()+"€.");
							}
							else {
								if (a.trouverArgent(prixV, joueurs,bank)){
									a.acheter(v.getPossessions().get(propA), prixV);
									v.getPossessions().remove(propA);
									v.recevoirArgent(prixV);
									System.out.println("La vente a eu lieu.");
									System.out.println(a.getNom()+", il vous reste "+a.getArgent()+"€.");
									System.out.println(v.getNom()+", vous avez désormais "+v.getArgent()+"€.");
								}
								else {
									System.out.println(a.getNom()+", vous n'avez pas assez d'argent. La vente est annulée.");
								}
							}
						}
						else 
							System.out.println("Les joueurs ne sont pas mis d'accord. La vente est annulée.");
					}
				}
			}
		}
	}
	/**
	 * méthode d'affichage d'une description de tout ce que possède le joueur j
	 * @param j
	 */
	public static void affichagePossessions(joueur j){
		System.out.println("Description du joueur "+j.getNom()+" qui détient "+j.getArgent()+" € :");
		Vector <possessionPossible> pp;
		if (j.possedeCarteSortieDePrison()>0){
			if (j.possedeCarteSortieDePrison()==1)
				System.out.println("   Il possède une carte pour sortir de prison.");
			else
				System.out.println("   Il possède deux cartes pour sortir de prison.");
		}
		else{
			if (j.getPossessions().size()==0)
				System.out.println("   Il ne possède aucune propriété.");
			else{
				System.out.println("   Propriétés possédées :");
				pp=j.getPossessions();
				for (int k=0;k<pp.size();k++){
					if ((""+pp.get(k).getClass()).equals("class modele.propriete")){
						if (pp.get(k).getEstHypothequee())
							System.out.println("   "+k+" - "+pp.get(k).getNom()+" de couleur "+((propriete)pp.get(k)).getColor()+" qui possède "+((propriete)pp.get(k)).getNbDeConstruction()+" construction(s) et qui est hypothéquée.");
						else
							System.out.println("   "+k+" - "+pp.get(k).getNom()+" de couleur "+((propriete)pp.get(k)).getColor()+" qui possède "+((propriete)pp.get(k)).getNbDeConstruction()+" construction(s) et qui n'est pas hypothéquée.");
					}
					else {
						if (pp.get(k).getEstHypothequee())
							System.out.println("   "+k+" - "+pp.get(k).getNom()+" et qui est hypothéquée.");
						else 
							System.out.println("   "+k+" - "+pp.get(k).getNom()+" et qui n'est pas hypothéquée.");
					}
				}
			}
		}
	}
	/**
	 * 
	 * @param joueursInteresses tableau de booleen dont la seule case contenant vrai possède l'index du joueur gagnant les enchères 
	 * @return le joueur gagnant des enchères.
	 */
	public static joueur gagnantEncheres(boolean[] joueursInteresses){
		for(int i=0; i<joueurs.size();i++){
			if (joueursInteresses[i])
				return joueurs.get(i);
		}
		return null;
	}
	/**
	 * 
	 * @return la somme de la valeur des dés
	 */
	public static int getValeurDes(){
		return (de1+de2);
	}
	/**
	 * 
	 * @return l'ensemble des joueurs de la partie
	 */
	public static Vector<joueur> getJoueurs(){
		return joueurs;
	}
	/**
	 * 
	 * @return un booléen disant si la partie est finie ou non
	 */
	public static boolean verifierPartieFinie(){
		int resteEnJeu=0;
		 for (int i=0;i<joueurs.size();i++){
			 if (!joueurs.get(i).aPerdu())
				 resteEnJeu+=1;
		 }
		 if (resteEnJeu>1)
			 return false;
		 else 
			 return true;
	}
	/**
	 * procédure définissant quel joueur joue en premier
	 */
	public static void ordreJeuJoueurs(){
		System.out.println("Chaque joueur doit lancer les dés pour déterminer quel joueur commence.");
		int[] resultatDes=new int [joueurs.size()];
		int de1;
		int de2;
		for (int i=0; i<joueurs.size();i++){
			System.out.println(joueurs.get(i).getNom()+", vous lancez les dés.");
			de1=plateau.lancerDe();
			de2=plateau.lancerDe();
			System.out.println("Vous avez fait "+de1+" et "+de2);
			resultatDes[i]=(de1+de2);
		}
		int meilleurResultat=0;
		for (int j=0; j<resultatDes.length;j++){
			if (resultatDes[j]>meilleurResultat)
				meilleurResultat=resultatDes[j];
		}
		Vector<joueur> exAequo=new Vector<joueur> (joueurs.size());
		for (int k=0;k<resultatDes.length;k++){
			if (resultatDes[k]==meilleurResultat){
				exAequo.add(joueurs.get(k));
			}
		}
		while (exAequo.size()!=1){
			String phraseAffichageExAequo="";
			for (int l=0;l<exAequo.size();l++){
				phraseAffichageExAequo+=exAequo.get(l).getNom()+", ";
			}
			phraseAffichageExAequo+="vous avez fait les même scores. Vous devez relancez les dés.";
			System.out.println(phraseAffichageExAequo);
			resultatDes=new int [exAequo.size()];
			for (int m=0;m<exAequo.size();m++){
				System.out.println(exAequo.get(m).getNom()+", vous lancez les dés.");
				de1=plateau.lancerDe();
				de2=plateau.lancerDe();
				System.out.println("Vous avez fait "+de1+" et "+de2);
				resultatDes[m]=(de1+de2);
			}
			meilleurResultat=0;
			for (int j=0; j<resultatDes.length;j++){
				if (resultatDes[j]>meilleurResultat)
					meilleurResultat=resultatDes[j];
			}
			for (int k=0;k<resultatDes.length;k++){
				if (resultatDes[k]!=meilleurResultat){
					exAequo.remove(exAequo.get(k));
				}
			}
		}
		System.out.println("Le joueur ayant fait le meilleur score est "+exAequo.get(0).getNom()+"\n");
		Vector<joueur> ordreJoueur=new Vector<joueur>(joueurs.size());
		int i=0;
		while ((exAequo.get(0)!=joueurs.get(i))&&(i<joueurs.size())){
				i++;
		}
		for (int j=0;j<joueurs.size();j++){
			ordreJoueur.add(joueurs.get((i+j)%joueurs.size()));
		}
		joueurs=ordreJoueur;
	}
	/**
	 * méthode permettant d'écrire dans un fichier texte.
	 */
    public static void writeTextFile(String fileName, String content){
      try{
        File f = new File(fileName);
        Writer output = new BufferedWriter(new FileWriter(f,false));
        output.write(content);
        output.close();
      }
      catch (Exception e) { e.printStackTrace(); }
    }
}
