From 412b459b0d3c727e19ec1a9dbf3afbc831c1e6a4 Mon Sep 17 00:00:00 2001
From: rosier8u <basile.rosier6@etu.univ-lorraine>
Date: Fri, 8 Dec 2023 14:59:11 +0100
Subject: [PATCH] =?UTF-8?q?Ajouter=20une=20classe=20de=20jeu=20(DP=20Facad?=
 =?UTF-8?q?e)=20avec=20une=20interface=20rudimentaire=20permettant=20de=20?=
 =?UTF-8?q?cr=C3=A9er=20une=20=C3=A9quipe,=20d=E2=80=99en=20supprimer=20un?=
 =?UTF-8?q?e,=20de=20produire=20des=20attaques,=20d=E2=80=99am=C3=A9liorer?=
 =?UTF-8?q?=20une=20=C3=A9quipe,=20etc.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ConcreteStrategieAgressif.java            |   2 +
 .../ConcreteStrategieDefensif.java            |   2 +
 .../src/modele/DialogueTerminal.java          | 227 ++++++++++++++++++
 design_pattern/src/modele/Equipe.java         |  12 +
 design_pattern/src/modele/Facade.java         |   2 +-
 design_pattern/src/modele/Jeu.java            |  65 ++++-
 design_pattern/src/modele/Personnage.java     |   7 +
 7 files changed, 308 insertions(+), 9 deletions(-)
 create mode 100644 design_pattern/src/modele/DialogueTerminal.java

diff --git a/design_pattern/src/modele/DPStrategie/ConcreteStrategieAgressif.java b/design_pattern/src/modele/DPStrategie/ConcreteStrategieAgressif.java
index 9914af3..d28b20f 100644
--- a/design_pattern/src/modele/DPStrategie/ConcreteStrategieAgressif.java
+++ b/design_pattern/src/modele/DPStrategie/ConcreteStrategieAgressif.java
@@ -1,11 +1,13 @@
 package modele.DPStrategie;
 
+import modele.DPState.EtatBlesse;
 import modele.Personnage;
 
 public class ConcreteStrategieAgressif implements Strategie {
     @Override
     public void attaquer(int degat, Personnage personnage) {
         personnage.subir(degat+5);
+        personnage.setEtat(new EtatBlesse(personnage));
     }
 
     @Override
diff --git a/design_pattern/src/modele/DPStrategie/ConcreteStrategieDefensif.java b/design_pattern/src/modele/DPStrategie/ConcreteStrategieDefensif.java
index 33c4f3f..87e2121 100644
--- a/design_pattern/src/modele/DPStrategie/ConcreteStrategieDefensif.java
+++ b/design_pattern/src/modele/DPStrategie/ConcreteStrategieDefensif.java
@@ -1,5 +1,6 @@
 package modele.DPStrategie;
 
+import modele.DPState.EtatEndormi;
 import modele.Personnage;
 
 public class ConcreteStrategieDefensif implements Strategie {
@@ -11,6 +12,7 @@ public class ConcreteStrategieDefensif implements Strategie {
             nouveauDegat = degat-5;
         }
         personnage.subir(degat-5);
+        personnage.setEtat(new EtatEndormi(personnage));
     }
 
     @Override
diff --git a/design_pattern/src/modele/DialogueTerminal.java b/design_pattern/src/modele/DialogueTerminal.java
new file mode 100644
index 0000000..166add8
--- /dev/null
+++ b/design_pattern/src/modele/DialogueTerminal.java
@@ -0,0 +1,227 @@
+package modele;
+
+import modele.DPFabrique.*;
+import modele.DPStrategie.ConcreteStrategieAgressif;
+import modele.DPStrategie.ConcreteStrategieDefensif;
+import modele.DPStrategie.ConcreteStrategieNeutre;
+import modele.Jeu;
+
+import java.util.ArrayList;
+import java.util.Scanner;
+
+public class DialogueTerminal {
+    private Jeu jeu;
+    private int finDePartie;
+
+    public DialogueTerminal(Jeu jeu){
+        this.jeu = jeu;
+        this.finDePartie = 0;
+    }
+    public void debutPartie(){
+        Scanner scan = new Scanner(System.in);
+        System.out.println("Bienvenue dans le jeu");
+        setConfig(scan);
+
+        while (jeu.getEquipe() == null){
+            System.out.println("Vous devez créer une équipe de maximum : "+
+                    Configuration.getInstance().getTailleMaxEquipe()+" personnage");
+            creerEquipe(scan);
+
+            System.out.println("Votre équipe a été créé.\nVoulez-vous la supprimer Pour en recréer une ?\n0 : non\n1 : oui");
+            int supprimer = Integer.parseInt(scan.nextLine());
+            if (supprimer == 1){
+                jeu.supprimerEquipe();
+            }
+        }
+        afficherEquipe();
+        creerEnnemis();
+
+        while (finDePartie == 0){
+            jouer(scan);
+        }
+    }
+
+    public void jouer(Scanner scan){
+        System.out.println("\nQue voulez-vous faire ? :");
+        System.out.println("0 : Produire une attaque\n1 : Améliorer une équipe\n");
+        int action = Integer.parseInt(scan.nextLine());
+        switch (action){
+            case 0:
+                attaquer(scan);
+                annonceFinDeTour();
+                break;
+            case 1:
+                jeu.ameliorerEquipe(jeu.getEquipe());
+                System.out.println("Le niveau de votre équipe a été augmenté.");
+                break;
+        }
+    }
+
+    private void creerEquipe(Scanner scan){
+        System.out.println("Choisissez un nom pour votre équipe :");
+        jeu.creerEquipe(scan.nextLine());
+
+        System.out.println("Choisissez un personnage à ajouter à l'équipe :");
+        System.out.println("1 : Guerrier\n2 : Roi\n3 : Guerisseur\n4 : Sorcier\n");
+        int choix = Integer.parseInt(scan.nextLine());
+        ajouterPersonnage(choix);
+
+        int tailleActuelle = 1;
+        while (choix != 0 && tailleActuelle < Configuration.getInstance().getTailleMaxEquipe()){
+            System.out.println("Vous pouvez encore ajouter maximum : "+
+                    (Configuration.getInstance().getTailleMaxEquipe()-tailleActuelle)+" personneges.");
+            System.out.println("Choisissez un personnage à ajouter à l'équipe :");
+            System.out.println("0 : Terminé\n1 : Guerrier\n2 : Roi\n3 : Guerisseur\n4 : Sorcier\n");
+            choix = Integer.parseInt(scan.nextLine());
+            if (choix != 0){
+                ajouterPersonnage(choix);
+                tailleActuelle++;
+            }
+        }
+    }
+
+    private void setConfig(Scanner scan){
+        System.out.println("Vous devez définir la configuration du jeu");
+        System.out.println("Choisissez un niveau de difficulté de 1 à 5");
+        int difficulte = Integer.parseInt(scan.nextLine());
+        while ((difficulte < 1) || (difficulte > 5)){
+            System.out.println("Choisissez un niveau de difficulté de 1 à 5");
+            difficulte = Integer.parseInt(scan.nextLine());
+        }
+        Configuration.getInstance().setDifficulte(difficulte);
+
+        System.out.println("Choisissez la taille maximum d'une équipe de 1 à 5");
+        int tailleEquipe = Integer.parseInt(scan.nextLine());
+        while (tailleEquipe < 1 || tailleEquipe > 5){
+            System.out.println("Choisissez la taille maximum d'une équipe de 1 à 5");
+            tailleEquipe = Integer.parseInt(scan.nextLine());
+        }
+        Configuration.getInstance().setTailleMaxEquipe(tailleEquipe);
+    }
+
+    private void ajouterPersonnage(int choix){
+        switch (choix){
+            case 1:
+                jeu.setConstructeur(new ConstructeurGuerrier());
+                jeu.getEquipe().ajouter(jeu.getConstructeur().creerPersonnage());
+                break;
+            case 2:
+                jeu.setConstructeur(new ConstructeurRoi());
+                jeu.getEquipe().ajouter(jeu.getConstructeur().creerPersonnage());
+                break;
+            case 3:
+                jeu.setConstructeur(new ConstructeurGuerisseur());
+                jeu.getEquipe().ajouter(jeu.getConstructeur().creerPersonnage());
+                break;
+            case 4:
+                jeu.setConstructeur(new ConstructeurSorcier());
+                jeu.getEquipe().ajouter(jeu.getConstructeur().creerPersonnage());
+                break;
+        }
+    }
+
+    private void afficherEquipe(){
+        System.out.println("Voici votre équipe :");
+        for (Personnage p : jeu.getEquipe().getEquipe()){
+            System.out.println(p.toString());
+        }
+    }
+
+    private void creerEnnemis(){
+        jeu.setConstructeur(new ConstructeurGuerrier());
+        for (int i = 0; i < Configuration.getInstance().getTailleMaxEquipe(); i++){
+            jeu.getEquipeEnnemi().ajouter(jeu.getConstructeur().creerPersonnage());
+        }
+    }
+
+    private void attaquer(Scanner scan) {
+        choixStrategie(scan);
+        jeu.produireAttaque(jeu.getEquipe());
+    }
+
+    private void choixStrategie(Scanner scan){
+        int strat = -1;
+        while (strat < 0 || strat > 2) {
+            System.out.println("Votre personnage : " + jeu.getEquipe().getPersonnage(jeu.getNbAttaqueEquipe()) + " va attaquer" +
+                    "le personnage ennemi : " + jeu.getEquipeEnnemi().getPersonnage(jeu.getNbAttaqueEquipe()));
+            System.out.println("Choisissez votre stratégie pour ce tour :\n0: Neutre\n1: Agressif\n2: Défensif");
+            strat = Integer.parseInt(scan.nextLine());
+        }
+        switch (strat) {
+            case 0:
+                jeu.getEquipe().getPersonnage(jeu.getNbAttaqueEquipe()).setStrategie(new ConcreteStrategieNeutre());
+                break;
+            case 1:
+                jeu.getEquipe().getPersonnage(jeu.getNbAttaqueEquipe()).setStrategie(new ConcreteStrategieAgressif());
+                break;
+            case 2:
+                jeu.getEquipe().getPersonnage(jeu.getNbAttaqueEquipe()).setStrategie(new ConcreteStrategieDefensif());
+                break;
+        }
+    }
+
+    private void annonceFinDeTour(){
+        int nbMort = 0;
+        ArrayList<Personnage> listeDesMorts = new ArrayList<>();
+        System.out.println("Dans votre équipe :");
+        for (Personnage p : jeu.getEquipe().getEquipe()){
+            if (p.getPointsDeVie() <= 0){
+                System.out.printf("Le personnage "+p.toString()+" est mort.\n");
+                listeDesMorts.add(p);
+
+                nbMort ++;
+            }
+        }
+        for (Personnage p : listeDesMorts){
+            jeu.personnageMort(p);
+            if (jeu.tailleEquipe() == 0){
+                finDePartie = 1;
+                System.out.println("Toute votre équipe est morte\nVous avez PERDU.");
+                break;
+            }
+        }
+        if (nbMort == 0){
+            System.out.println("Il n'y a eu aucun mort.");
+        }
+        annonceEtat();
+
+        nbMort = 0;
+        listeDesMorts = new ArrayList<>();
+        System.out.println("Dans l'équipe adverse :");
+        for (Personnage p : jeu.getEquipeEnnemi().getEquipe()){
+            if (p.getPointsDeVie() <= 0){
+                System.out.printf("Le personnage "+p.getNom()+" est mort.\n");
+                listeDesMorts.add(p);
+                nbMort ++;
+            }
+        }
+        for (Personnage p : listeDesMorts){
+            jeu.ennemiMort(p);
+            if (jeu.tailleEquipeEnnemi() == 0){
+                finDePartie = 1;
+                System.out.println("Toute l'équipe ennemi est morte\nVous avez GAGNÉ.");
+                break;
+            }
+        }
+        if (nbMort == 0){
+            System.out.println("Il n'y a eu aucun mort.");
+        }
+        annonceEtatEnnemi();
+    }
+
+    private void annonceEtat(){
+        for (Personnage p : jeu.getEquipe().getEquipe()){
+            if (p.getEtat() != null){
+                System.out.println(p.toString()+" a l'état : "+p.getEtat());
+            }
+        }
+    }
+    private void annonceEtatEnnemi(){
+        for (Personnage p : jeu.getEquipeEnnemi().getEquipe()){
+            if (p.getEtat() != null){
+                System.out.println(p.toString()+" a l'état : "+p.getEtat());
+            }
+        }
+    }
+
+}
diff --git a/design_pattern/src/modele/Equipe.java b/design_pattern/src/modele/Equipe.java
index 2e6b63a..b17337a 100644
--- a/design_pattern/src/modele/Equipe.java
+++ b/design_pattern/src/modele/Equipe.java
@@ -23,14 +23,26 @@ public class Equipe implements Groupe{
         return equipe;
     }
 
+    public Personnage getPersonnage(int i){
+        return equipe.get(i);
+    }
+
     public void ajouter(Personnage personnage){
         this.equipe.add(personnage);
     }
 
+    public void supprimer(Personnage personnage){
+        this.equipe.remove(personnage);
+    }
+
     public void ajouter(Equipe equipe){
         this.equipe.addAll(equipe.getEquipe());
     }
 
+    public int getTaille(){
+        return equipe.size();
+    }
+
     public void accepter(VisiteurGroupe visiteur) {
         visiteur.visiter(this);
     }
diff --git a/design_pattern/src/modele/Facade.java b/design_pattern/src/modele/Facade.java
index 6d44914..e1aeb44 100644
--- a/design_pattern/src/modele/Facade.java
+++ b/design_pattern/src/modele/Facade.java
@@ -2,7 +2,7 @@ package modele;
 
 public interface Facade {
     void creerEquipe(String nomEquipe);
-    void supprimerEquipe(String nomEquipe);
+    void supprimerEquipe();
     void produireAttaque(Equipe equipe);
     void ameliorerEquipe(Equipe equipe);
 }
diff --git a/design_pattern/src/modele/Jeu.java b/design_pattern/src/modele/Jeu.java
index 06aca4b..9035d09 100644
--- a/design_pattern/src/modele/Jeu.java
+++ b/design_pattern/src/modele/Jeu.java
@@ -1,26 +1,75 @@
 package modele;
 
+import modele.DPFabrique.Constructeur;
+import modele.DPVisiteur.NiveauVisiteur;
+import modele.DPVisiteur.VisiteurGroupe;
+
 public class Jeu implements Facade {
-    private Equipe equipe1;
-    private Equipe equipe2;
+    private Equipe equipe;
+    private Equipe equipeEnnemi;
+    private int nbAttaqueEquipe;
+    private Constructeur constructeur;
+    private VisiteurGroupe visiteurGroupe;
+
     @Override
     public void creerEquipe(String nomEquipe) {
-        equipe1 = new Equipe(nomEquipe);
-        equipe2 = new Equipe("Ennemi");
+        equipe = new Equipe(nomEquipe);
+        nbAttaqueEquipe = 0;
+        equipeEnnemi = new Equipe("Ennemi");
+        visiteurGroupe = new NiveauVisiteur();
     }
 
     @Override
-    public void supprimerEquipe(String nomEquipe) {
-
+    public void supprimerEquipe() {
+        equipe = null;
     }
 
     @Override
     public void produireAttaque(Equipe equipe) {
-
+        equipe.getPersonnage(nbAttaqueEquipe).attaquer(getEquipeEnnemi().getPersonnage(getEquipeEnnemi().getTaille()-1));
+        if (nbAttaqueEquipe == (Configuration.getInstance().getTailleMaxEquipe() - 1)){
+            nbAttaqueEquipe = 0;
+        }else {
+            nbAttaqueEquipe++;
+        }
     }
 
     @Override
     public void ameliorerEquipe(Equipe equipe) {
-        equipe.augmenterNiveau(1);
+        visiteurGroupe.visiter(equipe);
+    }
+
+    public Equipe getEquipe() {
+        return equipe;
+    }
+
+    public Equipe getEquipeEnnemi() {
+        return equipeEnnemi;
+    }
+
+    public Constructeur getConstructeur() {
+        return constructeur;
+    }
+
+    public void setConstructeur(Constructeur constructeur) {
+        this.constructeur = constructeur;
+    }
+
+    public int getNbAttaqueEquipe() {
+        return nbAttaqueEquipe;
+    }
+
+    public void personnageMort(Personnage personnage){
+        this.equipe.supprimer(personnage);
+    }
+    public void ennemiMort(Personnage personnage){
+        this.equipeEnnemi.supprimer(personnage);
+    }
+
+    public int tailleEquipe(){
+        return this.equipe.getTaille();
+    }
+    public int tailleEquipeEnnemi(){
+        return this.equipeEnnemi.getTaille();
     }
 }
diff --git a/design_pattern/src/modele/Personnage.java b/design_pattern/src/modele/Personnage.java
index 3c07cd8..b7b1c95 100644
--- a/design_pattern/src/modele/Personnage.java
+++ b/design_pattern/src/modele/Personnage.java
@@ -1,6 +1,7 @@
 package modele;
 
 import modele.DPState.Etat;
+import modele.DPStrategie.ConcreteStrategieNeutre;
 import modele.DPStrategie.Strategie;
 import modele.DPVisiteur.VisiteurGroupe;
 
@@ -17,6 +18,7 @@ public abstract class Personnage implements Groupe{
         this.niveau = niveau;
         this.nom = nom;
         this.arme = arme;
+        this.strategie = new ConcreteStrategieNeutre();
     }
 
     public void augmenterNiveau(int augmentation){
@@ -67,4 +69,9 @@ public abstract class Personnage implements Groupe{
     public Etat getEtat() {
         return etat;
     }
+
+    @Override
+    public String toString() {
+        return nom + " ("+pointsDeVie+" PV / niveau "+niveau+")";
+    }
 }
-- 
GitLab