diff --git a/src/cmisport/Application.java b/src/cmisport/Application.java index fb463e8f6c7b65667d4f8420d014be1b6f126bc9..56b0d0e4be0ccf5b3e02c17bf84e930679e50158 100644 --- a/src/cmisport/Application.java +++ b/src/cmisport/Application.java @@ -13,5 +13,6 @@ public class Application{ Test.testerGaussGenerator(); Test.testerAthlete(); Test.testerEquipe(); + Test.testerMarche(); } } diff --git a/src/cmisport/Club.java b/src/cmisport/Club.java index d253ab8c1c902bbc09426a8e12e4940f90a7677c..b6404202930149c4c025962a475205d887ad5ee6 100644 --- a/src/cmisport/Club.java +++ b/src/cmisport/Club.java @@ -43,7 +43,8 @@ public class Club{ private ArrayList<Humain> membres; /** - * Constructeur qui génére un club, la répartition des types d'humains ({@link Athlete}, {@link Coach} et {@link PersonelSante}) puis les humains individuelement. + * Constructeur qui génére un club, la répartition des types d'humains ({@link Athlete}, {@link Coach} et {@link PersonelSante}) puis les humains individuelement. + * Le club aura au moins deux tiers d'athlètes parmi ses membres. * @param nom Le nom du club * @param solde La solde initiale du club * @param nbPoints Le nombre total de points qui sera répartit entre les différents humains. @@ -54,30 +55,12 @@ public class Club{ this.membres = new ArrayList<>(); this.nom = nom; this.solde = solde; - ArrayList<Number> nbTypesHumains = new ArrayList<>(); //S'assure que les ahtlètes représentent au moins 2 tiers des humains. //TODO (Peu important) Refactor ce test de proportion là il coute très cher mdrr do { - nbTypesHumains = Util.genererGaussDistribution(3, 0.3, nbHumains, 0, nbHumains); //Distribue le nbHumains dans 3 élements du tableau de manière aléatoire. Le premier élément du tableu est le nombre d'athlete, le second le nombre de coach et le troisieme le nombre de PersonelSante. - } while (nbTypesHumains.getFirst().intValue() < nbHumains * 0.66); + this.membres = Util.genererListeAleatoireHumain(nbHumains, nbPoints, 0.3, 0.3); + } while ((this.membres.stream().filter(humain -> humain.getTypeHumain() == "ATHLETE").count()) < nbHumains * 0.66); - ArrayList<Number> nbPointsHumains = Util.genererGaussDistribution(nbHumains, 0.3, nbPoints, 1, Humain.VALEUR_MAX_CARACTERISTIQUE); //Distribue le nbPoints total de tous les humains de manière aléatoire entre tous les humains. - - //Ajoute à la liste des membres les types d'humains en fonction de la répartition des nbTypesHumains et attribue à chaque humain les points qui lui ont été distribué dans nbPointsHumains. - int indexHumain = 0; - //TODO (Peu important) Surement moyen de faire une seule boucle générique. - for (int i = 0; i < nbTypesHumains.get(0).intValue(); i++) { - this.membres.add(new Athlete(nbPointsHumains.get(indexHumain).intValue(), 0.3)); - indexHumain++; - } - for (int i = 0; i < nbTypesHumains.get(1).intValue(); i++) { - this.membres.add(new Coach(nbPointsHumains.get(indexHumain).intValue(), 0.5)); - indexHumain++; - } - for (int i = 0; i < nbTypesHumains.get(2).intValue(); i++) { - this.membres.add(new PersonelSante(nbPointsHumains.get(indexHumain).intValue(), 0.5)); - indexHumain++; - } this.reputation = new Reputation(0); } @@ -99,7 +82,7 @@ public class Club{ * @param p Le produit à acheter. */ public void acheter(Produit p) throws SoldeInsuffisant { - if (this.solde < p.getPrix()) throw new SoldeInsuffisant("Le club ne possède pas assez de solde", p.getPrix() - this.solde); + if (this.solde < p.getPrix().doubleValue()) throw new SoldeInsuffisant("Le club ne possède pas assez de solde", p.getPrix().intValue() - this.solde); else{ if (p instanceof Humain){ this.membres.add((Humain) this.marche.enleveProduit(p)); @@ -108,7 +91,7 @@ public class Club{ this.setLocal((Local) this.marche.enleveProduit(p)); this.local.setClub(this); } - this.setSolde(-p.prix); + this.setSolde(-p.prix.intValue()); } } /** diff --git a/src/cmisport/Equipe.java b/src/cmisport/Equipe.java index 3ca2a9ae6541d8d6eba3751994bc017d28aa0d23..90ca9f4b70b4de47728bd1d104ecdd7327310b8e 100644 --- a/src/cmisport/Equipe.java +++ b/src/cmisport/Equipe.java @@ -103,7 +103,7 @@ public class Equipe { StringBuilder sb = new StringBuilder(); sb.append("Club : ").append(club.getNom()).append("\n"); sb.append("Tableau des athlètes et de leurs caractéristiques : \n"); - sb.append(Util.tabValCaraAthleteToString(this.athletes, false)); + sb.append(Util.tabValCaraAthleteToString(this.athletes, false, false)); return sb.toString(); } } diff --git a/src/cmisport/Humains/Humain.java b/src/cmisport/Humains/Humain.java index 04c06da1d7d721b21f115b8063a6339d82333f54..194f7d48f62df30b7bbe1bac72b05ee59222c2a3 100644 --- a/src/cmisport/Humains/Humain.java +++ b/src/cmisport/Humains/Humain.java @@ -167,8 +167,11 @@ public abstract class Humain extends Produit{ * Le string est formaté de manière a bien s'intégrer à la méthode {@link Util#tabValCaraAthleteToString}. * @return Un string composé du nom de l'athlete puis des valeurs de ses caractéristiques. */ - public String nomValeursCaraToString(boolean afficherRole){ + public String nomValeursCaraToString(boolean afficherRole, boolean afficherPrixCout){ StringBuilder sb = new StringBuilder(); + if (afficherPrixCout){ + sb.append(String.format("%-8d %-8d", this.prix.intValue(), this.cout.intValue())); + } if (afficherRole){ sb.append(String.format("%-12s", this.getTypeHumain())); } diff --git a/src/cmisport/Local.java b/src/cmisport/Local.java index 2f49065497d9a7ca63bd6c93e89f01b5a6583aa7..18f512e89f21c12c14c338338b781a72826b69ac 100644 --- a/src/cmisport/Local.java +++ b/src/cmisport/Local.java @@ -63,7 +63,7 @@ public class Local extends Produit { */ @Override public double calculerPrix(){ - this.prix += this.capacite * this.prixCapacite; + this.prix = this.prix.intValue() + this.capacite * this.prixCapacite; return this.capacite * prixCapacite; } @@ -96,7 +96,7 @@ public class Local extends Produit { * @return Le nouveau {@link Produit#cout} */ public double calculerCout(){ - this.cout += this.capacite * this.coutCapacite; + this.cout = this.cout.intValue() + capacite * this.coutCapacite; return this.capacite * coutCapacite; } diff --git a/src/cmisport/Marche.java b/src/cmisport/Marche.java index b29f98b899e25b1ab3f8f66da27fabf16c6e2e9a..d8b4512c5c52a0cd135a78b943b333163078ddc0 100644 --- a/src/cmisport/Marche.java +++ b/src/cmisport/Marche.java @@ -2,38 +2,35 @@ package cmisport; import cmisport.Humains.*; import java.util.ArrayList; -//TODO Implémenter le marché tout à changé et je sais pas la meilleure approche pour faire une belle interface. public class Marche{ private ArrayList<Local> locauxAVendre; - private ArrayList<Athlete> athletesAVendre; - //private ArrayList<Coach> coachsAVendre; - //private ArrayList<Medecin> medecinsAVendre; + /** + * La liste des {@link Humain} achetables dans le marché. + d'une liste d'humains. */ + private ArrayList<Humain> humains; + + /** + * Le {@link Club} auxquel le marché appartient + */ private Club club; - public Marche(Club cl){ + //TODO Aussi générer les locaux + /** + * Constructeur initialisant un marché avec des humains à vendre générés aléatoirement. + * @param cl Le club auxquel le marché est relié. + * @param nbHumains Le nombre d'humains à générer. + * @param nbPointsHumains Le nombre total des points des humains. + */ + public Marche(Club cl, int nbHumains, int nbPointsHumains){ club = cl; locauxAVendre = new ArrayList<Local>(); - athletesAVendre = new ArrayList<Athlete>(); - //coachsAVendre = new ArrayList<Coach>(); - - // for (int i = 0; i <= c.calculerReputation / 10; i++){ - // Local l = new Local(); - // Athlete a = new Athlete(); - // Coach c = new Coach(); - // Medecin m = new Medecin(); - // Kine l = new Kine(); - // Psy p = new Psy(); - // locauxAVendre.add(l); - // athletesAVendre.add(a); - // coachsAVendre.add(c); - // medecinsAVendre.add(m); - // kinesAVendre.add(k); - // psyAVendre.add(p); - // } + this.humains = Util.genererListeAleatoireHumain(nbHumains, nbPointsHumains, 0.3, 0.8); } - public void rafraichir(){ + /** + */ + public void rafraichir(int nbHumains, int nbPointsHumains){ for (int i = 0; i <= locauxAVendre.size(); i++){ //locauxAVendre[i] = new Local(); //coachsAVendre[i] = new Coach(); @@ -96,4 +93,18 @@ public class Marche{ // } return a; } + + /** + * {@inheritDoc} + */ + @Override + public String toString(){ + StringBuilder sb = new StringBuilder(); + sb.append(String.format("Solde de %s : %f", this.club.getNom(), this.club.getSolde())); + sb.append(String.format("\n")); + sb.append("Humains à vendre : "); + sb.append(String.format("\n")); + sb.append(Util.tabValCaraAthleteToString(this.humains, true, true)); + return sb.toString(); + } } diff --git a/src/cmisport/Produit.java b/src/cmisport/Produit.java index d8f25e2a1d8edc3940adb121dd989a2e303c7a02..e0298ddd072f4724bda269ea7ceab390d2e28e41 100644 --- a/src/cmisport/Produit.java +++ b/src/cmisport/Produit.java @@ -8,12 +8,12 @@ public abstract class Produit { /** * Stocke le prix à l'achat et la vente du produit. */ - protected double prix; + protected Number prix; /** * Stocke le cout d'entretient à payer régulièrement pour le produit. */ - protected double cout; + protected Number cout; /** * Méthode abstraite calculant le {@link #cout} du produit en fonctions de ses attributs. @@ -43,11 +43,11 @@ public abstract class Produit { this.cout = cout; } - public double getPrix(){ + public Number getPrix(){ return this.prix; } - public double getCout(){ + public Number getCout(){ return this.cout; } } diff --git a/src/cmisport/Test.java b/src/cmisport/Test.java index 84244e9a91f83469fc292ead86c010e4811b52e4..f49c6d05b03f4677b62396e1d8a2fca482100a5a 100644 --- a/src/cmisport/Test.java +++ b/src/cmisport/Test.java @@ -47,6 +47,14 @@ public class Test { Equipe equipe = new Equipe(club, 6, 4000); System.out.println(equipe); } + + public static void testerMarche(){ + Club club = new Club("FC OPTIM", 1, 800, 5); + Marche marche = new Marche(club, 9, 1800); + System.out.println(marche); + + + } // public void testnom(String arg){ // // try { diff --git a/src/cmisport/Util.java b/src/cmisport/Util.java index 59e812cf0c52ee5040fccd6805fc2c944159bdde..c1586e25b1ec1851258d62b4754bf7530e3c6020 100644 --- a/src/cmisport/Util.java +++ b/src/cmisport/Util.java @@ -5,8 +5,7 @@ import java.util.Collection; import java.util.ListIterator; import java.util.Random; -import cmisport.Humains.Athlete; -import cmisport.Humains.Humain; +import cmisport.Humains.*; /** * Classe stockant des méthodes utilitaires. @@ -67,23 +66,61 @@ public class Util { } /** - * Méthode utilitaire permettant d'afficher dans un tableau les noms et caractéristiques d'une liste d'humains. + * Méthode utilitaire permettant de renvoyer un string d'un tableau d'humains avec l'indice +1, les noms et les caractéristiques des humains. * @param humains La liste d'{@link Humain} dont il faut afficher les caractéristiques. * @return Le tableau avec les noms des humains et les valeurs des caractéristiques. */ - public static String tabValCaraAthleteToString(Collection<? extends Humain> humains, boolean afficherRole){ + public static String tabValCaraAthleteToString(Collection<? extends Humain> humains, boolean afficherRole, boolean afficherPrixCout){ StringBuilder sb = new StringBuilder(); + sb.append(String.format("%-6s", "ID")); + if(afficherPrixCout){ + sb.append(String.format("%-8s %-8s", "Prix", "Cout")); + } if (afficherRole){sb.append(String.format("%-12s", "ROLE"));} sb.append(String.format("%-23s", "NOM")); sb.append(Caracteristique.allCaracteristiquesToString()); sb.append(String.format("\n")); - for (int i = 0; i < Caracteristique.values().length * 14; i++) { + for (int i = 0; i < Caracteristique.values().length * 16; i++) { sb.append("="); } sb.append("\n"); + int indexHumain = 1; for (Humain athlete : humains){ - sb.append(athlete.nomValeursCaraToString(afficherRole)).append(String.format("\n")); + sb.append(String.format("%-6d", indexHumain)); + sb.append(athlete.nomValeursCaraToString(afficherRole, afficherPrixCout)).append(String.format("\n")); + indexHumain++; } return sb.toString(); } + + /** + * Génére une liste d'Humains dont la proportion des types d'humains et la répartition des points de ceux ci dépend des déviations passées en paramètre. + * @param nbHumains Le nombre d'humains à générer. + * @param nbPointsTotal La somme des points de tous les humains. + * @param deviationTypesHumain La déviation des types d'humains par rapport à la moyenne théorique. Valeur aux alentours de 0.3 recommandée. + * @param deviationTypesHumain La déviation des points des Humains par rapport à la moyenne théorique. Valeur aux alentours de 0.3 recommandée. + * @return La liste des {@link Humain} générée. + */ + public static ArrayList<Humain> genererListeAleatoireHumain(int nbHumains, int nbPointsTotal, double deviationTypesHumain, double deviationPointsHumains){ + ArrayList<Humain> humains = new ArrayList<>(nbHumains); + ArrayList<Number> nbTypesHumains = new ArrayList<>(); + nbTypesHumains = Util.genererGaussDistribution(3, deviationTypesHumain, nbHumains, 0, nbHumains); //Distribue le nbHumains dans 3 élements du tableau de manière aléatoire. Le premier élément du tableu est le nombre d'athlete, le second le nombre de coach et le troisieme le nombre de PersonelSante. + ArrayList<Number> nbPointsHumains = Util.genererGaussDistribution(nbHumains, deviationPointsHumains, nbPointsTotal, 1, Humain.VALEUR_MAX_CARACTERISTIQUE); //Distribue le nbPoints total de tous les humains de manière aléatoire entre tous les humains. + //Ajoute à la liste des membres les types d'humains en fonction de la répartition des nbTypesHumains et attribue à chaque humain les points qui lui ont été distribué dans nbPointsHumains. + int indexHumain = 0; + //TODO (Peu important) Surement moyen de faire une seule boucle générique. + for (int i = 0; i < nbTypesHumains.get(0).intValue(); i++) { + humains.add(new Athlete(nbPointsHumains.get(indexHumain).intValue(), 0.3)); + indexHumain++; + } + for (int i = 0; i < nbTypesHumains.get(1).intValue(); i++) { + humains.add(new Coach(nbPointsHumains.get(indexHumain).intValue(), 0.5)); + indexHumain++; + } + for (int i = 0; i < nbTypesHumains.get(2).intValue(); i++) { + humains.add(new PersonelSante(nbPointsHumains.get(indexHumain).intValue(), 0.5)); + indexHumain++; + } + return humains; + } }