From 893971c52eb86916898eba9677d5f8424457dca8 Mon Sep 17 00:00:00 2001
From: "michael.divia" <michael.divia@etu.hesge.ch>
Date: Thu, 7 Dec 2023 11:09:43 +0100
Subject: [PATCH] Part 2 100%

---
 .../src/main/java/ch/hepia/GameManager.java   |  93 ++-
 Partie_2/src/main/java/ch/hepia/Hand.java     |  20 +-
 Partie_2/src/main/java/ch/hepia/Joueur.java   | 656 +++++++++++-------
 .../target/classes/ch/hepia/GameManager.class | Bin 7769 -> 7799 bytes
 Partie_2/target/classes/ch/hepia/Hand$1.class | Bin 1128 -> 1128 bytes
 Partie_2/target/classes/ch/hepia/Hand.class   | Bin 4902 -> 4921 bytes
 Partie_2/target/classes/ch/hepia/Joueur.class | Bin 654 -> 663 bytes
 .../classes/ch/hepia/JoueurCroupier.class     | Bin 3208 -> 3338 bytes
 .../classes/ch/hepia/JoueurHumain.class       | Bin 4909 -> 4874 bytes
 .../classes/ch/hepia/JoueurOrdinateur.class   | Bin 4745 -> 4837 bytes
 10 files changed, 498 insertions(+), 271 deletions(-)

diff --git a/Partie_2/src/main/java/ch/hepia/GameManager.java b/Partie_2/src/main/java/ch/hepia/GameManager.java
index 36cbf8e..ed86be6 100644
--- a/Partie_2/src/main/java/ch/hepia/GameManager.java
+++ b/Partie_2/src/main/java/ch/hepia/GameManager.java
@@ -1,7 +1,6 @@
 package ch.hepia;
 
 import java.util.ArrayList;
-import java.util.Scanner;
 
 public class GameManager {
 
@@ -91,7 +90,7 @@ public class GameManager {
             char choice = 'x';
 
             // Go thew all hands of the player
-            for (int HandNb = 0; HandNb < this.Players.get(0).NbHands(); HandNb++) {
+            for (int HandNb = 0; HandNb < this.Players.get(0).GetNbHands(); HandNb++) {
 
                 CanSplit = false;
                 CanInsure = false;
@@ -109,7 +108,8 @@ public class GameManager {
                         "Cards in Deck : " + App.ANSI_GREEN + this.Deck.GetNbCards() + App.ANSI_RESET + "\n");
 
                 // Dealer has only 1 card in his hand at this point in time
-                System.out.print("Dealer Strength : " + App.ANSI_PURPLE + this.Dealer.GetForce(0) + App.ANSI_RESET);
+                System.out
+                        .println("Dealer Strength : " + App.ANSI_PURPLE + this.Dealer.GetStrength(0) + App.ANSI_RESET);
 
                 // Show the dealer hand
                 this.Dealer.ShowHands();
@@ -135,13 +135,13 @@ public class GameManager {
                 System.out
                         .print("Strength of Hand " + App.ANSI_GREEN + (HandNb + 1) + App.ANSI_RESET + " : "
                                 + App.ANSI_PURPLE);
-                if (this.Players.get(0).GetForce(HandNb) == 99) {
+                if (this.Players.get(0).GetStrength(HandNb) == 99) {
                     System.out.println("BlackJack" + App.ANSI_RESET);
-                } else if (this.Players.get(0).GetForce(HandNb) > 21) {
+                } else if (this.Players.get(0).GetStrength(HandNb) > 21) {
                     System.out.println(
-                            this.Players.get(0).GetForce(HandNb) + App.ANSI_RED + " [BUSTED]" + App.ANSI_RESET);
+                            this.Players.get(0).GetStrength(HandNb) + App.ANSI_RED + " [BUSTED]" + App.ANSI_RESET);
                 } else {
-                    System.out.println(this.Players.get(0).GetForce(HandNb) + App.ANSI_RESET);
+                    System.out.println(this.Players.get(0).GetStrength(HandNb) + App.ANSI_RESET);
                 }
 
                 // Show the player hand
@@ -154,7 +154,7 @@ public class GameManager {
                 // Can only insure if it's the first thing that the players does
                 // AND
                 // That he hasn't already insured during this round
-                if (this.Step == 0 && this.Dealer.OnlyAs()
+                if (this.Step == 0 && this.Dealer.HasOnlyAs()
                         && !this.Players.get(0).HasInsured()) {
                     CanInsure = true;
                     System.out.println(App.ANSI_BLUE + "[i]" + App.ANSI_RESET + " Insurance against Dealer");
@@ -168,7 +168,7 @@ public class GameManager {
                 // AND
                 // if the player has enough money
                 if (this.Players.get(0).CanSplit(HandNb)
-                        && this.Players.get(0).NbHands() < 3
+                        && this.Players.get(0).GetNbHands() < 3
                         && this.Players.get(0).GetBet(HandNb) <= this.Players.get(0).GetMoney()) {
                     CanSplit = true;
                     System.out.println(App.ANSI_BLUE + "[s]" + App.ANSI_RESET + " Split your Hand");
@@ -183,8 +183,8 @@ public class GameManager {
                 // AND
                 // if the player has enough money
                 if (!this.Players.get(0).HasDoubled(HandNb)
-                        && this.Players.get(0).NbCards(HandNb) == 2
-                        && this.Players.get(0).GetForce(HandNb) != 99
+                        && this.Players.get(0).GetNbCards(HandNb) == 2
+                        && this.Players.get(0).GetStrength(HandNb) != 99
                         && this.Players.get(0).GetBet(HandNb) <= this.Players.get(0).GetMoney()) {
                     CanDouble = true;
                     System.out.println(App.ANSI_BLUE + "[d]" + App.ANSI_RESET + " Double your Hand");
@@ -198,9 +198,10 @@ public class GameManager {
                 // if the player has a BlackJack
                 // AND
                 // if the strength of the hand is more than 21
-                if (!(this.Players.get(0).HasDoubled(HandNb) && this.Players.get(0).NbCards(HandNb) == 3)
-                        && !(this.Players.get(0).HasSplit(HandNb) && this.Players.get(0).GetCardForce(HandNb, 0) == 1)
-                        && this.Players.get(0).GetForce(HandNb) < 21) {
+                if (!(this.Players.get(0).HasDoubled(HandNb) && this.Players.get(0).GetNbCards(HandNb) == 3)
+                        && !(this.Players.get(0).HasSplit(HandNb)
+                                && this.Players.get(0).GetCardStrength(HandNb, 0) == 1)
+                        && this.Players.get(0).GetStrength(HandNb) < 21) {
                     CanDraw = true;
                     System.out.println(App.ANSI_BLUE + "[h]" + App.ANSI_RESET + " Hit");
                 }
@@ -267,7 +268,7 @@ public class GameManager {
     public boolean ResolveTurn() {
 
         // Dealer draws card until he hits 17 or more
-        while (this.Dealer.GetForce(0) <= 17) {
+        while (this.Dealer.GetStrength(0) <= 17) {
             this.Dealer.DrawCard(0, this.Deck);
         }
 
@@ -285,12 +286,12 @@ public class GameManager {
         // >21 = Busted
         // <=21 = show the strength
         System.out.print("Dealer Score : " + App.ANSI_PURPLE);
-        if (this.Dealer.GetForce(0) == 99) {
+        if (this.Dealer.GetStrength(0) == 99) {
             System.out.println("BlackJack" + App.ANSI_RESET);
-        } else if (this.Dealer.GetForce(0) > 21) {
-            System.out.println(this.Dealer.GetForce(0) + App.ANSI_RED + " [BUSTED]" + App.ANSI_RESET);
+        } else if (this.Dealer.GetStrength(0) > 21) {
+            System.out.println(this.Dealer.GetStrength(0) + App.ANSI_RED + " [BUSTED]" + App.ANSI_RESET);
         } else {
-            System.out.println(this.Dealer.GetForce(0) + App.ANSI_RESET);
+            System.out.println(this.Dealer.GetStrength(0) + App.ANSI_RESET);
         }
 
         // Show the dealers hand
@@ -303,59 +304,88 @@ public class GameManager {
         }
 
         // Go thew all hands of the player
-        for (int HandNb = 0; HandNb < this.Players.get(0).NbHands(); HandNb++) {
+        for (int HandNb = 0; HandNb < this.Players.get(0).GetNbHands(); HandNb++) {
 
             System.out.println("\nHand " + App.ANSI_GREEN + (HandNb + 1) + App.ANSI_RESET + " :");
 
+            // Show to bet amount of the hand
             System.out.println("\tBet : " + App.ANSI_BLUE + this.Players.get(0).GetBet(HandNb) + App.ANSI_RESET);
 
+            // Show strength of the hand of the player
+            // 99 = BlackJack
+            // >21 = Busted
+            // <=21 = show the strength
             System.out.print("\tStrength : " + App.ANSI_PURPLE);
-            if (this.Players.get(0).GetForce(HandNb) == 99) {
+            if (this.Players.get(0).GetStrength(HandNb) == 99) {
                 System.out.println("BlackJack" + App.ANSI_RESET);
-            } else if (this.Players.get(0).GetForce(HandNb) > 21) {
+            } else if (this.Players.get(0).GetStrength(HandNb) > 21) {
                 System.out.println(
-                        this.Players.get(0).GetForce(HandNb) + App.ANSI_RED + " [BUSTED]" + App.ANSI_RESET);
+                        this.Players.get(0).GetStrength(HandNb) + App.ANSI_RED + " [BUSTED]" + App.ANSI_RESET);
             } else {
-                System.out.println(this.Players.get(0).GetForce(HandNb) + App.ANSI_RESET);
+                System.out.println(this.Players.get(0).GetStrength(HandNb) + App.ANSI_RESET);
             }
 
+            // Show and apply gains and losses
             System.out.print("\tResult : ");
-            if (this.Players.get(0).GetForce(HandNb) > 21 && this.Players.get(0).GetForce(HandNb) != 99) {
+            // If the player is Busted (strength > 21 but not BlackJack (99))
+            if (this.Players.get(0).GetStrength(HandNb) > 21 && this.Players.get(0).GetStrength(HandNb) != 99) {
+                // Show player loss
                 System.out.println(App.ANSI_RED + "-" + this.Players.get(0).GetBet(HandNb) + App.ANSI_RESET);
-            } else if (this.Dealer.GetForce(0) == this.Players.get(0).GetForce(HandNb)) {
+            }
+            // If it's a Draw
+            else if (this.Dealer.GetStrength(0) == this.Players.get(0).GetStrength(HandNb)) {
+                // Player get's back his bet
                 System.out.println(App.ANSI_BLUE + "±0" + App.ANSI_RESET);
                 this.Players.get(0).AddMoney(this.Players.get(0).GetBet(HandNb));
-            } else if (this.Players.get(0).GetForce(HandNb) == 99) {
+            }
+            // If the player has done a BlackJack
+            else if (this.Players.get(0).GetStrength(HandNb) == 99) {
+                // Player gets payed 1.5 to 1
                 System.out.println(App.ANSI_GREEN + "+" + (this.Players.get(0).GetBet(HandNb) * 1.5) + App.ANSI_RESET);
                 this.Players.get(0).AddMoney(this.Players.get(0).GetBet(HandNb) * 2.5);
-            } else if (this.Dealer.GetForce(0) > 21 && this.Dealer.GetForce(0) != 99) {
+            }
+            // If the Dealer is Busted (strength > 21 but not BlackJack (99))
+            else if (this.Dealer.GetStrength(0) > 21 && this.Dealer.GetStrength(0) != 99) {
+                // Player wins and get payed 1 to 1
                 System.out.println(App.ANSI_GREEN + "+" + this.Players.get(0).GetBet(HandNb) + App.ANSI_RESET);
                 this.Players.get(0).AddMoney(this.Players.get(0).GetBet(HandNb) * 2);
-            } else if (this.Players.get(0).GetForce(HandNb) < this.Dealer.GetForce(0)) {
+            }
+            // If the Dealer has a better score
+            else if (this.Players.get(0).GetStrength(HandNb) < this.Dealer.GetStrength(0)) {
+                // Show player loss
                 System.out.println(App.ANSI_RED + "-" + this.Players.get(0).GetBet(HandNb) + App.ANSI_RESET);
-            } else if (this.Players.get(0).GetForce(HandNb) > this.Dealer.GetForce(0)) {
+            }
+            // If the Player has a better score
+            else if (this.Players.get(0).GetStrength(HandNb) > this.Dealer.GetStrength(0)) {
+                // Player wins and get payed 1 to 1
                 System.out.println(App.ANSI_GREEN + "+" + this.Players.get(0).GetBet(HandNb) + App.ANSI_RESET);
                 this.Players.get(0).AddMoney(this.Players.get(0).GetBet(HandNb) * 2);
             }
 
         }
 
+        // Check if the player had insurance
         if (this.Players.get(0).HasInsured()) {
 
             System.out.print("Insurance : ");
 
-            if (this.Dealer.GetForce(0) == 99) {
+            // If the Dealer did a BackJack
+            if (this.Dealer.GetStrength(0) == 99) {
+                // Player gets payed back 2 to 1
                 System.out.println(App.ANSI_GREEN + "+" + (this.Players.get(0).GetInsured() * 3) + App.ANSI_RESET);
                 this.Players.get(0).AddMoney(this.Players.get(0).GetInsured() * 3);
             } else {
+                // Show player loss
                 System.out.println(App.ANSI_RED + "-" + (this.Players.get(0).GetInsured()) + App.ANSI_RESET);
             }
         }
 
+        // Show the final player balance
         System.out.println("\nMoney : " + App.ANSI_BLUE + this.Players.get(0).GetMoney() + App.ANSI_RESET);
 
         System.out.print("> ");
 
+        // Wait for a simple input of the player
         try {
             System.in.read();
         } catch (Exception e) {
@@ -372,6 +402,7 @@ public class GameManager {
             this.Deck = new JeudeCarte(new Paquet(6, 52));
         }
 
+        // Reset all hands
         this.Dealer.Reset(this.Deck);
         for (Joueur Player : this.Players) {
             Player.Reset(this.Deck);
diff --git a/Partie_2/src/main/java/ch/hepia/Hand.java b/Partie_2/src/main/java/ch/hepia/Hand.java
index 0006e50..9b5ffe0 100644
--- a/Partie_2/src/main/java/ch/hepia/Hand.java
+++ b/Partie_2/src/main/java/ch/hepia/Hand.java
@@ -23,6 +23,7 @@ public class Hand implements Comparable<Hand> {
 
         this.Splitted = false;
         this.Doubled = false;
+        this.Bet = 0;
     }
 
     public Hand(JeudeCarte game, int nb) {
@@ -58,7 +59,7 @@ public class Hand implements Comparable<Hand> {
 
     public void SetBet(double amount) {
         if (amount < 0) {
-            throw new RuntimeException("Can't bet negative amout of money.");
+            throw new RuntimeException("Can't bet negative amount of money.");
         }
 
         this.Bet = amount;
@@ -128,11 +129,12 @@ public class Hand implements Comparable<Hand> {
 
     }
 
-    public int GetForce() {
+    public int GetStrength() {
 
         int force = 0;
         int as = 0;
 
+        // Add strength of cards and count how much Asses there is
         for (Carte carte : Hand) {
             if (carte.getForce() == 1) {
                 as++;
@@ -140,6 +142,7 @@ public class Hand implements Comparable<Hand> {
             force += carte.getForce();
         }
 
+        // Test how many Asses we can but to 11 without going over 21
         while (force < 21 && as > 0) {
             force += 10;
 
@@ -152,6 +155,8 @@ public class Hand implements Comparable<Hand> {
         }
 
         // Edge Case = BlackJack
+        // Check if a 21 is a BlackJack (As + 10) or a combination of 3 cards
+        // (simple 21)
         if (force == 21) {
 
             boolean isAs = false;
@@ -183,8 +188,6 @@ public class Hand implements Comparable<Hand> {
 
     public void ShowHand() {
 
-        // this.SortHand();
-
         for (Carte carte : Hand) {
 
             System.out.print(carte.getNomComplet() + " ");
@@ -194,15 +197,16 @@ public class Hand implements Comparable<Hand> {
         System.out.println("");
     }
 
+    // Not used but asked for Part 2
     @Override
     public int compareTo(Hand otherHand) {
 
-        int Hand_1_Power = this.GetForce();
-        int Hand_2_Power = otherHand.GetForce();
+        int Hand_1_Strength = this.GetStrength();
+        int Hand_2_Strength = otherHand.GetStrength();
 
-        if (Hand_1_Power > Hand_2_Power) {
+        if (Hand_1_Strength > Hand_2_Strength) {
             return 1;
-        } else if (Hand_1_Power < Hand_2_Power) {
+        } else if (Hand_1_Strength < Hand_2_Strength) {
             return -1;
         } else {
             return 0;
diff --git a/Partie_2/src/main/java/ch/hepia/Joueur.java b/Partie_2/src/main/java/ch/hepia/Joueur.java
index fc142cd..07d9987 100644
--- a/Partie_2/src/main/java/ch/hepia/Joueur.java
+++ b/Partie_2/src/main/java/ch/hepia/Joueur.java
@@ -4,51 +4,74 @@ import java.util.ArrayList;
 
 interface Joueur {
 
-    public void DefineStrategy();
+    // Set the Play strategy
+    public void SetStrategy();
 
+    // Add amount of money to the player balance
     public void AddMoney(double amount);
 
+    // Remove amount of money from the player balance
     public void RemoveMoney(double amount);
 
+    // Get the current balance of the player
     public double GetMoney();
 
+    // Set bet amount on specific player hand
     public void SetBet(double amount, int handNb);
 
+    // Get the bet amount from specific hand
     public double GetBet(int handNb);
 
+    // Draw 1 card in specific hand from specific Deck
     public void DrawCard(int handNb, JeudeCarte Jeu);
 
+    // Get a specific card strength from a specific hand
+    public int GetCardStrength(int handNb, int cardNb);
+
+    // Get number of cards in specific hand
+    public int GetNbCards(int handNb);
+
+    // Show specific hand in terminal
     public void ShowHand(int handNb);
 
+    // Show all hands in terminal
     public void ShowHands();
 
-    public void Split(int handNb, JeudeCarte Jeu);
+    // Get the number of hands of the player
+    public int GetNbHands();
 
-    public int GetForce(int handNb);
+    // Get the strength of a specific hand
+    public int GetStrength(int handNb);
 
-    public boolean CanSplit(int handNb);
+    // Double the bet on specific hand
+    public void Double(int handNb, JeudeCarte Jeu);
 
-    public boolean HasSplit(int handNb);
+    // Check if a specific hand has been doubled
+    public boolean HasDoubled(int handNb);
 
-    public void Reset(JeudeCarte Jeu);
+    // Check if a specific hand can be split
+    public boolean CanSplit(int handNb);
 
-    public boolean HasInsured();
+    // Split a specific hand
+    public void Split(int handNb, JeudeCarte Jeu);
+
+    // Check if a specific hand was splitted
+    public boolean HasSplit(int handNb);
 
+    // Insure the player
     public void Insure();
 
+    // Get player insured amount
     public double GetInsured();
 
-    public boolean HasDoubled(int handNb);
-
-    public void Double(int handNb, JeudeCarte Jeu);
-
-    public int NbHands();
-
-    public int NbCards(int handNb);
+    // Has the player insured himself
+    public boolean HasInsured();
 
-    public int GetCardForce(int handNb, int cardNb);
+    // Reset player for next turn
+    public void Reset(JeudeCarte Jeu);
 }
 
+// Human Player
 class JoueurHumain implements Joueur {
 
     private ArrayList<Hand> Hands;
@@ -57,8 +80,10 @@ class JoueurHumain implements Joueur {
     private boolean Insured;
 
     public JoueurHumain(JeudeCarte Jeu, int Money) {
+
         this.Hands = new ArrayList<>();
 
+        // At creation, player get's 1 hand with 2 cards
         this.Hands.add(new Hand(Jeu, 2));
 
         this.Hands.get(0).SetBet(0);
@@ -68,77 +93,34 @@ class JoueurHumain implements Joueur {
         this.Insured = false;
     }
 
-    public void Reset(JeudeCarte Jeu) {
-
-        this.Insured = false;
-
-        this.Hands = new ArrayList<>();
-
-        this.Hands.add(new Hand(Jeu, 2));
-
-        this.Hands.get(0).SetBet(0);
-    }
-
-    public boolean HasDoubled(int handNb) {
-        return this.Hands.get(handNb).HasDoubled();
-    }
-
-    public void Double(int handNb, JeudeCarte Jeu) {
-        this.RemoveMoney(this.Hands.get(handNb).GetBet());
-        this.Hands.get(handNb).Double();
-        this.Hands.get(handNb).DrawCardFromGame(Jeu);
-    }
-
-    public boolean CanSplit(int handNb) {
-        if (!(this.Hands.get(handNb).HasSplit() && this.Hands.get(handNb).GetCarte(0).getForce() == 1)
-                && this.Hands.get(handNb).GetCarte(0).getForce() == this.Hands.get(handNb).GetCarte(1).getForce()
-                && this.Hands.get(handNb).NbCard() == 2) {
-            return true;
-        }
-
-        return false;
-    }
-
-    public boolean HasSplit(int handNb) {
-        return this.Hands.get(handNb).HasSplit();
-    }
-
-    public boolean HasInsured() {
-        return this.Insured;
-    }
-
-    public void Insure() {
-        this.Insured = true;
-        this.Insurance = this.Hands.get(0).GetBet() / 2;
-        this.RemoveMoney(this.Insurance);
-    }
-
-    public double GetInsured() {
-        return this.Insurance;
-    }
-
-    public void DefineStrategy() {
-        // Le Joueur Humain n'a pas de strategie
+    public void SetStrategy() {
+        // Human player has no strategy
         throw new RuntimeException("Humain Player has no Strategy.");
     }
 
     public void AddMoney(double amount) {
+
+        // Check if the amount is positif and that it will not create an Overflow
         if (amount < 0) {
             throw new RuntimeException("Can't add negative amount of Money.");
         } else if (this.Money > 0 && this.Money + amount < 0) {
-            throw new RuntimeException("Money Underflow.");
+            throw new RuntimeException("Money Overflow.");
         }
 
+        // Add money to current balance
         this.Money += amount;
     }
 
     public void RemoveMoney(double amount) {
+
+        // Check if the amount is positif and that it will not create an Underflow
         if (amount < 0) {
             throw new RuntimeException("Can't subtract negative amount of Money.");
         } else if (this.Money < 0 && this.Money + amount > 0) {
-            throw new RuntimeException("Money Overflow.");
+            throw new RuntimeException("Money Underflow.");
         }
 
+        // Remove money from current balance
         this.Money -= amount;
     }
 
@@ -146,191 +128,256 @@ class JoueurHumain implements Joueur {
         return this.Money;
     }
 
-    public int GetForce(int handNb) {
-        if ((this.Hands.get(handNb).GetForce() == 99 && this.Hands.get(handNb).HasSplit())
-                || (this.Hands.get(handNb).GetForce() == 99 && handNb != 0)
-                || (this.Hands.get(handNb).GetForce() == 99 && this.Hands.get(handNb).NbCard() != 2)) {
-            return 21;
-        } else {
-            return this.Hands.get(handNb).GetForce();
-        }
-
-    }
-
     public void SetBet(double amount, int handNb) {
+
+        // Check if the amount is positif
         if (amount <= 0) {
             throw new RuntimeException("Can't bet a negative or null amount.");
-        } else if (amount > this.Money) {
+        }
+        // Check if the player has enough money in his balance
+        else if (amount > this.Money) {
             throw new RuntimeException("Can't bet more than the Money you have.");
         }
 
+        // Check if the hand ID is valide
         if (handNb < 0 || handNb > Hands.size()) {
             throw new RuntimeException("Hand number not valid.");
         }
 
+        // Remove amount from player balance
         this.Money -= amount;
+
+        // Set bet on player hand
         this.Hands.get(handNb).SetBet(amount);
     }
 
     public double GetBet(int handNb) {
 
+        // Check if the hand ID is valide
         if (handNb < 0 || handNb > Hands.size()) {
             throw new RuntimeException("Hand number not valid.");
         }
 
+        // Get the bet amount on this hand
         return this.Hands.get(handNb).GetBet();
     }
 
     public void DrawCard(int handNb, JeudeCarte Jeu) {
 
+        // Check if the hand ID is valide
         if (handNb < 0 || handNb > Hands.size()) {
             throw new RuntimeException("Hand number not valid.");
         }
 
+        // Draw 1 card from of Deck in hand
         this.Hands.get(handNb).DrawCardFromGame(Jeu);
     }
 
-    public void ShowHands() {
-        for (Hand hand : this.Hands) {
-            hand.ShowHand();
-        }
+    public int GetCardStrength(int handNb, int cardNb) {
+        return this.Hands.get(handNb).GetCarte(cardNb).getForce();
+    }
+
+    public int GetNbCards(int handNb) {
+        return this.Hands.get(handNb).NbCard();
     }
 
     public void ShowHand(int handNb) {
 
+        // Check if the hand ID is valide
         if (handNb < 0 || handNb > Hands.size()) {
             throw new RuntimeException("Hand number not valid.");
         }
 
+        // Show hand in terminal
         this.Hands.get(handNb).ShowHand();
     }
 
-    public void Split(int handNb, JeudeCarte Jeu) {
-
-        if (this.Hands.size() == 3) {
-            throw new RuntimeException("Max number of slipts.");
-        }
-
-        Carte card = this.Hands.get(handNb).GetCarte(1);
-
-        this.Hands.add(new Hand(card));
-
-        this.Hands.get(handNb).RemoveCardFromHand(card);
-
-        this.Hands.get(handNb).Splitted();
-        this.Hands.get(this.Hands.size() - 1).Splitted();
+    public void ShowHands() {
 
-        this.Hands.get(this.Hands.size() - 1).SetBet(this.Hands.get(handNb).GetBet());
-        this.RemoveMoney(this.Hands.get(handNb).GetBet());
+        // Go threw all hands
+        for (Hand hand : this.Hands) {
 
-        this.Hands.get(handNb).DrawCardFromGame(Jeu);
-        this.Hands.get(this.Hands.size() - 1).DrawCardFromGame(Jeu);
+            // Show the hand in terminal
+            hand.ShowHand();
+        }
     }
 
-    public int NbHands() {
+    public int GetNbHands() {
         return this.Hands.size();
     }
 
-    public int NbCards(int handNb) {
-        return this.Hands.get(handNb).NbCard();
-    }
-
-    public int GetCardForce(int handNb, int cardNb) {
-        return this.Hands.get(handNb).GetCarte(cardNb).getForce();
-    }
-}
-
-class JoueurOrdinateur implements Joueur {
+    public int GetStrength(int handNb) {
 
-    private ArrayList<Hand> Hands;
-    private double Money;
-    private double Insurance;
-    private boolean Insured;
-
-    public JoueurOrdinateur(JeudeCarte Jeu, int Money) {
-        this.Hands = new ArrayList<>();
+        // If the strength is a BlackJack
+        // AND
+        // The hand was splitted
+        // OR
+        // It's not the 1rst hand
+        // OR
+        // There are more than 2 cards in the hand
+        if (this.Hands.get(handNb).GetStrength() == 99
+                && (this.Hands.get(handNb).HasSplit() || handNb != 0 || this.Hands.get(handNb).NbCard() != 2)) {
+            // Than it is not a BlackJack but a simple 21
+            return 21;
+        } else {
+            return this.Hands.get(handNb).GetStrength();
+        }
 
-        Hands.add(new Hand(Jeu, 2));
+    }
 
-        Hands.get(0).SetBet(0);
+    public void Double(int handNb, JeudeCarte Jeu) {
 
-        this.Money = Money;
-        this.Insurance = 0;
-        this.Insured = false;
-    }
+        // Remove bet amount from money
+        this.RemoveMoney(this.Hands.get(handNb).GetBet());
 
-    public void DefineStrategy() {
-        // TODO
+        // Double the bet in the hand
+        this.Hands.get(handNb).Double();
 
+        // If hte player doubles a hand he must draw 1 card
+        this.Hands.get(handNb).DrawCardFromGame(Jeu);
     }
 
     public boolean HasDoubled(int handNb) {
         return this.Hands.get(handNb).HasDoubled();
     }
 
-    public void Double(int handNb, JeudeCarte Jeu) {
-        this.RemoveMoney(this.Hands.get(handNb).GetBet());
-        this.Hands.get(handNb).Double();
-        this.Hands.get(handNb).DrawCardFromGame(Jeu);
-    }
-
     public boolean CanSplit(int handNb) {
 
+        // Hand can be split
+        // If it hasn't already been spit with an As
+        // AND
+        // if the 2 cards are the same
+        // AND
+        // if there is only 2 cards in the hands
         if (!(this.Hands.get(handNb).HasSplit() && this.Hands.get(handNb).GetCarte(0).getForce() == 1)
                 && this.Hands.get(handNb).GetCarte(0).getForce() == this.Hands.get(handNb).GetCarte(1).getForce()
                 && this.Hands.get(handNb).NbCard() == 2) {
             return true;
         }
 
-        return true;
+        return false;
+    }
+
+    public void Split(int handNb, JeudeCarte Jeu) {
+
+        // Player can only have 3 hands
+        if (this.Hands.size() == 3) {
+            throw new RuntimeException("Max number of splits.");
+        }
+
+        // Get the 2nd card of the hand we want to split
+        Carte card = this.Hands.get(handNb).GetCarte(1);
+
+        // Create a new hand with this card in it
+        this.Hands.add(new Hand(card));
+
+        // Remove the card from the 1rst hand
+        this.Hands.get(handNb).RemoveCardFromHand(card);
+
+        // Set the hand as splitted
+        this.Hands.get(handNb).Splitted();
+
+        // Set the new hand as splitted
+        this.Hands.get(this.Hands.size() - 1).Splitted();
+
+        // Set the bet of the new hand to the same as the splitted hand
+        this.Hands.get(this.Hands.size() - 1).SetBet(this.Hands.get(handNb).GetBet());
+
+        // Remove the money from the player balance
+        this.RemoveMoney(this.Hands.get(handNb).GetBet());
+
+        // Draw 1 card in each hands
+        this.Hands.get(handNb).DrawCardFromGame(Jeu);
+        this.Hands.get(this.Hands.size() - 1).DrawCardFromGame(Jeu);
     }
 
     public boolean HasSplit(int handNb) {
         return this.Hands.get(handNb).HasSplit();
     }
 
-    public boolean HasInsured() {
-        return this.Insured;
+    public void Insure() {
+
+        this.Insured = true;
+
+        // Set the insurance the half the bet of the only player hand
+        this.Insurance = this.Hands.get(0).GetBet() / 2;
+
+        // Remove the insurance from the player balance
+        this.RemoveMoney(this.Insurance);
     }
 
     public double GetInsured() {
         return this.Insurance;
     }
 
-    public void Insure() {
-        this.Insured = true;
-        this.Insurance = this.Hands.get(0).GetBet() / 2;
-        this.RemoveMoney(this.Insurance);
+    public boolean HasInsured() {
+        return this.Insured;
     }
 
     public void Reset(JeudeCarte Jeu) {
 
         this.Insured = false;
 
+        // Reset hands
         this.Hands = new ArrayList<>();
 
+        // Draw 2 card from Deck
         this.Hands.add(new Hand(Jeu, 2));
 
         this.Hands.get(0).SetBet(0);
     }
+}
+
+// Computer Player
+class JoueurOrdinateur implements Joueur {
+
+    private ArrayList<Hand> Hands;
+    private double Money;
+    private double Insurance;
+    private boolean Insured;
+
+    public JoueurOrdinateur(JeudeCarte Jeu, int Money) {
+
+        this.Hands = new ArrayList<>();
+
+        // At creation, player get's 1 hand with 2 cards
+        Hands.add(new Hand(Jeu, 2));
+
+        Hands.get(0).SetBet(0);
+
+        this.Money = Money;
+        this.Insurance = 0;
+        this.Insured = false;
+    }
+
+    public void SetStrategy() {
+        // TODO
+        // Will be implemented in Part 3 of the project
+    }
 
     public void AddMoney(double amount) {
-        if (amount <= 0) {
+
+        // Check if the amount is positif and that it will not create an Overflow
+        if (amount < 0) {
             throw new RuntimeException("Can't add negative amount of Money.");
         } else if (this.Money > 0 && this.Money + amount < 0) {
-            throw new RuntimeException("Money Underflow.");
+            throw new RuntimeException("Money Overflow.");
         }
 
+        // Add amount from current player balance
         this.Money += amount;
     }
 
     public void RemoveMoney(double amount) {
+
+        // Check if the amount is positif and that it will not create an Underflow
         if (amount < 0) {
             throw new RuntimeException("Can't subtract negative amount of Money.");
-        } else if (this.Money < 0 && this.Money - amount > 0) {
-            throw new RuntimeException("Money Overflow.");
+        } else if (this.Money < 0 && this.Money + amount > 0) {
+            throw new RuntimeException("Money Underflow.");
         }
 
+        // Remove amount from current player balance
         this.Money -= amount;
     }
 
@@ -338,225 +385,370 @@ class JoueurOrdinateur implements Joueur {
         return this.Money;
     }
 
-    public int GetForce(int handNb) {
-        return this.Hands.get(handNb).GetForce();
-    }
-
     public void SetBet(double amount, int handNb) {
+
+        // Check if the amount is positif
         if (amount <= 0) {
             throw new RuntimeException("Can't bet a negative or null amount.");
-        } else if (amount > this.Money) {
+        }
+        // Check if the player has enough money in his balance
+        else if (amount > this.Money) {
             throw new RuntimeException("Can't bet more than the Money you have.");
         }
 
+        // Check if the hand ID is valide
         if (handNb < 0 || handNb > Hands.size()) {
             throw new RuntimeException("Hand number not valid.");
         }
 
+        // Remove amount from player balance
         this.Money -= amount;
+
+        // Set bet on player hand
         this.Hands.get(handNb).SetBet(amount);
     }
 
     public double GetBet(int handNb) {
 
+        // Check if the hand ID is valide
         if (handNb < 0 || handNb > Hands.size()) {
             throw new RuntimeException("Hand number not valid.");
         }
 
-        return Hands.get(handNb).GetBet();
+        // Get the bet amount on this hand
+        return this.Hands.get(handNb).GetBet();
     }
 
     public void DrawCard(int handNb, JeudeCarte Jeu) {
 
+        // Check if the hand ID is valide
         if (handNb < 0 || handNb > Hands.size()) {
             throw new RuntimeException("Hand number not valid.");
         }
 
+        // Draw 1 card from of Deck in hand
         this.Hands.get(handNb).DrawCardFromGame(Jeu);
     }
 
-    public void ShowHands() {
-        for (Hand hand : this.Hands) {
-            hand.ShowHand();
-        }
+    public int GetCardStrength(int handNb, int cardNb) {
+        return this.Hands.get(handNb).GetCarte(cardNb).getForce();
+    }
+
+    public int GetNbCards(int handNb) {
+        return this.Hands.get(handNb).NbCard();
     }
 
     public void ShowHand(int handNb) {
 
+        // Check if the hand ID is valide
         if (handNb < 0 || handNb > Hands.size()) {
             throw new RuntimeException("Hand number not valid.");
         }
 
+        // Show hand in terminal
         this.Hands.get(handNb).ShowHand();
     }
 
+    public void ShowHands() {
+
+        // Go threw all hands
+        for (Hand hand : this.Hands) {
+
+            // Show the hand in terminal
+            hand.ShowHand();
+        }
+    }
+
+    public int GetNbHands() {
+        return this.Hands.size();
+    }
+
+    public int GetStrength(int handNb) {
+
+        // If the strength is a BlackJack
+        // AND
+        // The hand was splitted
+        // OR
+        // It's not the 1rst hand
+        // OR
+        // There are more than 2 cards in the hand
+        if (this.Hands.get(handNb).GetStrength() == 99
+                && (this.Hands.get(handNb).HasSplit() || handNb != 0 || this.Hands.get(handNb).NbCard() != 2)) {
+            // Than it is not a BlackJack but a simple 21
+            return 21;
+        } else {
+            return this.Hands.get(handNb).GetStrength();
+        }
+
+    }
+
+    public void Double(int handNb, JeudeCarte Jeu) {
+
+        // Remove bet amount from money
+        this.RemoveMoney(this.Hands.get(handNb).GetBet());
+
+        // Double the bet in the hand
+        this.Hands.get(handNb).Double();
+
+        // If hte player doubles a hand he must draw 1 card
+        this.Hands.get(handNb).DrawCardFromGame(Jeu);
+    }
+
+    public boolean HasDoubled(int handNb) {
+        return this.Hands.get(handNb).HasDoubled();
+    }
+
+    public boolean CanSplit(int handNb) {
+
+        // Hand can be split
+        // If it hasn't already been spit with an As
+        // AND
+        // if the 2 cards are the same
+        // AND
+        // if there is only 2 cards in the hands
+        if (!(this.Hands.get(handNb).HasSplit() && this.Hands.get(handNb).GetCarte(0).getForce() == 1)
+                && this.Hands.get(handNb).GetCarte(0).getForce() == this.Hands.get(handNb).GetCarte(1).getForce()
+                && this.Hands.get(handNb).NbCard() == 2) {
+            return true;
+        }
+
+        return false;
+    }
+
     public void Split(int handNb, JeudeCarte Jeu) {
 
+        // Player can only have 3 hands
         if (this.Hands.size() == 3) {
-            throw new RuntimeException("Max number of slipts.");
+            throw new RuntimeException("Max number of splits.");
         }
 
+        // Get the 2nd card of the hand we want to split
         Carte card = this.Hands.get(handNb).GetCarte(1);
 
+        // Create a new hand with this card in it
         this.Hands.add(new Hand(card));
 
+        // Remove the card from the 1rst hand
         this.Hands.get(handNb).RemoveCardFromHand(card);
 
+        // Set the hand as splitted
         this.Hands.get(handNb).Splitted();
+
+        // Set the new hand as splitted
         this.Hands.get(this.Hands.size() - 1).Splitted();
 
+        // Set the bet of the new hand to the same as the splitted hand
         this.Hands.get(this.Hands.size() - 1).SetBet(this.Hands.get(handNb).GetBet());
+
+        // Remove the money from the player balance
         this.RemoveMoney(this.Hands.get(handNb).GetBet());
 
+        // Draw 1 card in each hands
         this.Hands.get(handNb).DrawCardFromGame(Jeu);
         this.Hands.get(this.Hands.size() - 1).DrawCardFromGame(Jeu);
     }
 
-    public int NbHands() {
-        return this.Hands.size();
-    }
-
-    public int NbCards(int handNb) {
-        return this.Hands.get(handNb).NbCard();
+    public boolean HasSplit(int handNb) {
+        return this.Hands.get(handNb).HasSplit();
     }
 
-    public int GetCardForce(int handNb, int cardNb) {
-        return this.Hands.get(handNb).GetCarte(cardNb).getForce();
-    }
-}
+    public void Insure() {
 
-class JoueurCroupier implements Joueur {
+        this.Insured = true;
 
-    private Hand Hand;
+        // Set the insurance the half the bet of the only player hand
+        this.Insurance = this.Hands.get(0).GetBet() / 2;
 
-    public JoueurCroupier(JeudeCarte Jeu) {
-        this.Hand = new Hand(Jeu, 1);
+        // Remove the insurance from the player balance
+        this.RemoveMoney(this.Insurance);
     }
 
-    public boolean OnlyAs() {
-
-        if (this.Hand.GetCarte(0).getNomRang() == "As" && this.Hand.NbCard() == 1) {
-            return true;
-        }
-
-        return false;
+    public double GetInsured() {
+        return this.Insurance;
     }
 
-    public void Reset(JeudeCarte Jeu) {
-
-        this.Hand = new Hand(Jeu, 1);
+    public boolean HasInsured() {
+        return this.Insured;
     }
 
-    public void DefineStrategy() {
-        // TODO
+    public void Reset(JeudeCarte Jeu) {
 
-    }
+        this.Insured = false;
 
-    public boolean HasDoubled(int handNb) {
-        // La Banque ne peut pas doubler
-        throw new RuntimeException("Bank cant Double.");
-    }
+        // Reset hands
+        this.Hands = new ArrayList<>();
 
-    public void Double(int handNb, JeudeCarte Jeu) {
-        // La Banque ne peut pas doubler
-        throw new RuntimeException("Bank cant Double.");
-    }
+        // Draw 2 card from Deck
+        this.Hands.add(new Hand(Jeu, 2));
 
-    public boolean CanSplit(int handNb) {
-        // La Banque ne peut pas split
-        throw new RuntimeException("Bank cant Split.");
+        this.Hands.get(0).SetBet(0);
     }
+}
 
-    public boolean HasSplit(int handNb) {
-        // La Banque ne peut pas split
-        throw new RuntimeException("Bank cant Split.");
-    }
+// Dealer
+class JoueurCroupier implements Joueur {
 
-    public boolean HasInsured() {
-        // La Banque ne s'assure pas contre elle même
-        throw new RuntimeException("Bank cant get Insurance.");
-    }
+    private Hand Hand;
 
-    public void Insure() {
-        // La Banque ne s'assure pas contre elle même
-        throw new RuntimeException("Bank cant get Insurance.");
+    public JoueurCroupier(JeudeCarte Jeu) {
+        this.Hand = new Hand(Jeu, 1);
     }
 
-    public double GetInsured() {
-        // La Banque ne s'assure pas contre elle même
-        throw new RuntimeException("Bank has no Insurance.");
+    public void SetStrategy() {
+        // Dealer has no strategy
+        throw new RuntimeException("Dealer has no Strategy.");
     }
 
     public void AddMoney(double amount) {
-        // La Banque n'a pas d'argent
-        throw new RuntimeException("Bank has no Money.");
+        // Dealer has infinite amount of money
+        throw new RuntimeException("Dealer has no Money.");
     }
 
     public void RemoveMoney(double amount) {
-        // La Banque n'a pas d'argent
-        throw new RuntimeException("Bank has no Money.");
+        // Dealer has infinite amount of money
+        throw new RuntimeException("Dealer has no Money.");
     }
 
     public double GetMoney() {
-        // La Banque n'a pas d'argent
-        throw new RuntimeException("Bank has no Money.");
+        // Dealer has infinite amount of money
+        throw new RuntimeException("Dealer has no Money.");
     }
 
     public void SetBet(double amount, int handNb) {
-        // La Banque ne parie pas
-        throw new RuntimeException("Bank doesn't Bet.");
+        // Dealer doesn't bet
+        throw new RuntimeException("Dealer doesn't Bet.");
     }
 
     public double GetBet(int handNb) {
-        // La Banque ne parie pas
-        throw new RuntimeException("Bank doesn't Bet.");
+        // Dealer doesn't bet
+        throw new RuntimeException("Dealer doesn't Bet.");
     }
 
     public void DrawCard(int handNb, JeudeCarte Jeu) {
 
+        // Dealer has only 1 hand
         if (handNb != 0) {
-            throw new RuntimeException("Bank has only 1 hand.");
+            throw new RuntimeException("Dealer has only 1 hand.");
         }
 
+        // Draw 1 card from of Deck in hand
         this.Hand.DrawCardFromGame(Jeu);
     }
 
-    public void ShowHands() {
-        this.Hand.ShowHand();
+    public int GetCardStrength(int handNb, int cardNb) {
+        return this.Hand.GetCarte(cardNb).getForce();
+    }
+
+    public int GetNbCards(int handNb) {
+        return this.Hand.NbCard();
     }
 
     public void ShowHand(int handNb) {
 
+        // Dealer has only 1 hand
         if (handNb != 0) {
-            throw new RuntimeException("Bank has only 1 hand.");
+            throw new RuntimeException("Dealer has only 1 hand.");
         }
 
+        // Show hand in terminal
+        this.Hand.ShowHand();
+    }
+
+    public void ShowHands() {
+
+        // Show hand in terminal (only 1 for the Dealer)
         this.Hand.ShowHand();
     }
 
-    public int GetForce(int handNb) {
+    public int GetNbHands() {
 
+        // Dealer has only 1 hand
+        return 1;
+    }
+
+    public int GetStrength(int handNb) {
+
+        // Dealer has only 1 hand
         if (handNb != 0) {
             throw new RuntimeException("Bank has only 1 hand.");
         }
 
-        return this.Hand.GetForce();
+        // If the strength is a BlackJack
+        // AND
+        // The hand was splitted
+        // OR
+        // It's not the 1rst hand
+        // OR
+        // There are more than 2 cards in the hand
+        if (this.Hand.GetStrength() == 99
+                && (this.Hand.HasSplit() || handNb != 0 || this.Hand.NbCard() != 2)) {
+            // Than it is not a BlackJack but a simple 21
+            return 21;
+        } else {
+            return this.Hand.GetStrength();
+        }
+
+    }
+
+    public void Double(int handNb, JeudeCarte Jeu) {
+        // Dealer does not bet
+        throw new RuntimeException("Dealer can't Double.");
+    }
+
+    public boolean HasDoubled(int handNb) {
+        // Dealer does not bet
+        throw new RuntimeException("Dealer can't Double.");
+    }
+
+    public boolean CanSplit(int handNb) {
+        // Dealer can't split
+        throw new RuntimeException("Dealer can't Split.");
     }
 
     public void Split(int handNb, JeudeCarte Jeu) {
-        // La Banque ne peut pas slip
-        throw new RuntimeException("Bank can't Split.");
+        // Dealer can't split
+        throw new RuntimeException("Dealer can't Split.");
+
     }
 
-    public int NbHands() {
-        return 1;
+    public boolean HasSplit(int handNb) {
+        // Dealer can't split
+        throw new RuntimeException("Dealer can't split.");
     }
 
-    public int NbCards(int handNb) {
-        return this.Hand.NbCard();
+    public void Insure() {
+        // Dealer can't insure himself against himself
+        throw new RuntimeException("Dealer can't get Insurance.");
     }
 
-    public int GetCardForce(int handNb, int cardNb) {
-        return this.Hand.GetCarte(cardNb).getForce();
+    public double GetInsured() {
+        // Dealer can't insure himself against himself
+        throw new RuntimeException("Dealer can't get Insurance.");
+    }
+
+    public boolean HasInsured() {
+        // Dealer can't insure himself against himself
+        throw new RuntimeException("Dealer can't get Insurance.");
+
+    }
+
+    public void Reset(JeudeCarte Jeu) {
+
+        // Create a new hand with 1 card
+        this.Hand = new Hand(Jeu, 1);
+    }
+
+    // Check if the Dealer only has an As in this hand (for Insurance)
+    public boolean HasOnlyAs() {
+
+        // If the first card in hand is an As
+        // AND
+        // There is only 1 card in the hand
+        if (this.Hand.GetCarte(0).getNomRang() == "As" && this.Hand.NbCard() == 1) {
+            return true;
+        }
+
+        return false;
     }
+
 }
diff --git a/Partie_2/target/classes/ch/hepia/GameManager.class b/Partie_2/target/classes/ch/hepia/GameManager.class
index aa63352e5ebc774b29262cbba7e764d0ba1f1ed2..deab1ca162c602940cf4df190de3e8751b0ad034 100644
GIT binary patch
delta 2078
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

delta 2119
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
C;NO-2

diff --git a/Partie_2/target/classes/ch/hepia/Hand$1.class b/Partie_2/target/classes/ch/hepia/Hand$1.class
index aa652b46b36c5a4f704da400b85707c9489d2d20..e2750c39ec1ee0ffda4f715b78a572443a2da898 100644
GIT binary patch
delta 31
ncmaFC@q%MR6f<MN<Y?wl-Vz2LhB5{Lh6)B5hMLKHnO6e<m9_}R

delta 31
ncmaFC@q%MR6f<M~<Y?wl-eLwGhEfIrhH?fOhU&?CnO6e<m2(Ke

diff --git a/Partie_2/target/classes/ch/hepia/Hand.class b/Partie_2/target/classes/ch/hepia/Hand.class
index 8b98417991b333f0983a463db2bea69fec600b4e..a5d795896fe3549efa725a1873962850a6211e6f 100644
GIT binary patch
delta 1454
zcmZ3cwo`3G0wWhE10#b94+A#?&*TKgE=H}%uNf8C40#xg81yF#GKEhrV#<_Mc23Mw
zFHuNJEm6ozO;0SzEK5~L%*`*&+x(fSnvv0Haz4v^9&Y#4lHih})V%bPjLG7xJ&YEc
zm#~&FD)D<H=B30N#>3<o86YA?aFNX>?6ORpdl;A**cccXoF+$c+6Za!ZDmm2$iTqB
z%%IA^z@Wy!Ie9UsqPHW1G=mxg1A_tsGe{|eI)erS2skllGH5X{GAJ-`GH5gCFfcLb
zGB7ZRF);mSkY-?GXJBM!&|_c(lMDh3j0^${`jff2RALOYn71;>g9t^CWlUhpq`>Zw
zWnf{DXW(a0WDsRgW{_e~VUTA~MY3E0Zn*-3F@p&MBiLD{3}y^W42%rs3>K5Sxuohr
zj%NeQX@K?efZ422y^IW&45AE-3_=VH3@!|;U^yWzmaPnmT9I2Altmb<vZ28MaTy=j
z+d2%a47v=040=c=3c*dZVX%OjsL#MSS%q6b8sP>*BpqNkO!ntimIujmF)%SOFqks1
zGMFK$VFQ^uc_Ozek{Omr@*H6Ki`+UkNO2{^z{0@5V9UV9V8<Z9;K(4#-~`qp2DU;B
zqy-dZ3}Ou444~l9oovaYprpK>fq?<yOGtRRf;E8@Ffc&eTFs-W3UVt%-V-bjF_Z^x
zC=WvzgW2ShJdR-?l@O=+F$gjQFi0`@F(@+xgLOfYj|yCu3N-l$VkRFR)Z{Zcf!8S(
zVRSfyAVVaB6hk<JGD8f7Ml*m@rqSg8yk@2#8z7OLz`)Ot#309z0yZ7uU3s{}<)KNB
z5u9JM_%u90Iw9W9U|?m)WZ+`RU=U)+0qfQR$BZysw=h&U1A{OFB;hhK2ry(Zm@zOj
z=uW=PXNHtC3K;kqn!u(&qC@~>%47rnC*UMr#vseUz|h9P#L&*b!qCMa&Ct!D%+SN2
z#?Z&0%h1JO&M=9=ieWN?EyGj>2ZrekZVWRRJQ-#(cr#352xVBn5Y4cNA(mk=LjuDR
zhGd3i4Al%P80IjnVwlIUnqeWsT81SI>ll_ZY+zW$u#8~~!&Zhv4BHrvGVB7mM~fkd
zfrEj8;W)@a;52lUp@YGUfsuiQ;V?rdI6q1=2!V=)$$JG<*+Inv8-woTmjVwgL4hU4
zz{<eDu%AJc;UI$w!+r)`hNBFo497r5g9;D^1_m>z$)XJWAX69^8FVKz33-KrbjvZY
zGcYimVPIuA%fQ8Oo`Ij?0)rsKMFug3OAHbWSHPw~f?Wz~3Il@_!zu<121W)}22qC9
eVE1t`2r#UH2Kz!G1748HkW|jdpf>rQkOu%1)3px(

delta 1441
zcmdm~woGk90^{T?#x6#U$zK^2*z|cA3>b7LOEZOYaWXJ6Sn@D%Gw@6<V#<_Ia!$-s
zFHuNJEm6ozO;0SzEK5~L%*`*|{DrBSk<nms0n2<&4)@d&xBQ~y)XCDUJ&b0XSFn~a
z%J6t3=B30N#s}n=rxr0XK)6N_?q)l7SticS49pB{3=9mmlT$ct>NhelFfcPHGcYhH
zF>o+2Fz_+3FbFX4GYBy#Fo-Z{G6*pkF-S0&Ge|PnFi0_|FfcGEFffC3GpI7CF@S(A
zgF1r-10#b111EzfgBAl5gEj*LgBSzTe+Fp=Hg*O^b_N{=Mli`Bz`)2Lz@W>($RNbP
zz)-}%JXwQFDn?I>c`JiFh)@JMhY9Q)DX=4D7+4tO82A|!7(^MA7^E1K8RQvMkes0a
zcZLFkA%hVEBiMn)3?>Xr42%q>3}%z(aY-qHyvGKXQwQti0kc`5dKnqaC*S0fwzLpo
zu*%-bV1aN0AK0tf46F<~41x^0NP30fdTkiYChKxbNh9nqKvD;`V{#I=vOGwhi-C!O
zfx(1<mBAEA4I9X;$xFCZk<73_lIH-+KjGG~0Xq#6TS5#h3=9l53~UUx3<3-e45AE<
zU@c-`E5txrK#{{B#^B8W@~-w|A07oIi}ef)43O}Jgog`Q6G#CA1H`R;JesN?w?gDS
z!1547dEkcfFoZFfOuob87zR=aaf&a4AcH@H6oW5=GD8qp7bKymz;&rW6N(^aLg7J8
zD3gnMonjG2hcO5;L@-D(gfS>HL{n%q12_#DOcvrZGX>cIiQ;$$euhK_Ifi7g=@9SA
z!yPUUO<IiL+*-@0;R(_S@pd``D?<hY7ehLO5JNUtw-z{NgyFh{p}H9ugc%?SlZioq
zA&bF;ftf*j@;g2=q@<D0z|YVKHU$zT0w7Z+JM%xO2iaK0Aj`nO(8|EX(8j>R(7_<h
z(8-|8(8Zv}(8Hk1(7|BN(9dASFoD6AVG@G_!xRQLhN%pm4AU6A8TuJQ8D=v?Gt6a(
zWthj1z%ZX7nPDMAHN#?tISfk~<}oZ|Sjez~VF|-ZhUE;a8CEeYWZ1&6f#DFtMuwvd
zTS4y8Vh92k563|c0;i#)3>^$642%pc42Kyy!TC*^K?qa;OuitX$_^?B*ch}Y{}Fg#
z339p^11kdq!yX1vhJ6ew40{-K84fX+G8_gO4Js-a7#Pf;CW|uggG^yyWYC^0D&!Rk
z(k;ip&cMKMf`OIcBm)=2X$F3VGYo<ZXBos8&M`<ZTmYK_33e%{DGUr!467K_7#JB?
i8AKUYgWbo)Ai%H&8thwy40u5%LsB^-gUaNOLLLC-S*^7I

diff --git a/Partie_2/target/classes/ch/hepia/Joueur.class b/Partie_2/target/classes/ch/hepia/Joueur.class
index 1af6aa5209a7ccec4a3d33ded164f65f26bfacb6..5e4728e620596c8ce4d971e1d94e4d16b7f6bac8 100644
GIT binary patch
delta 297
zcmeBUoz6PJoP|3$wPd1Qrw+e+YKe1VQA%)0QEFa#Nd_YWtA?kirY9o<mwRf7UlK^J
zn2~`+!&B39;!%Yth^R+mUP>_|1G5H5A-8*K2|_!YOMYomPAVe<mq%hTgq;G>AH~SP
z;hdNkT#%Dl!pOi1r8ztji^0sv0gN)do_WQkMX4!ZqoXEEF{(}8z?fMo%D}+F$RNfb
z4yGj-*ub<TgA|ySW`M}cFbIPAvJ7%yS{_O(K*bfId?l!UWd?4rIu!<0Fs;U*&cMLH
N$e_W%z`(?y2>{X4HPHY7

delta 274
zcmbQv+Q&M<oSn}lH7zqQb)t3W#7}ajtic62nI()29PX(lZuv#Ysf-LP8lIY-j0_yk
ziFr^-kVq6G1BXXqF<4~sWJa~g&5S~ma~P!@UGhtla#B+m8Q35!Mh14jB#*?rlww8(
zW(|-@?0!kkiA5kjk9%qfhzYfcRm0O$({u7R#+*_%1_l;J22ln<FfGO)4yGj-B*C;4
zl$K_Y0rO=U<iNB%14N$!12>qj2vw&9HAk621uU)#HBXH}oq>UYkwJrjfq{uZ698*l
BF9QGo

diff --git a/Partie_2/target/classes/ch/hepia/JoueurCroupier.class b/Partie_2/target/classes/ch/hepia/JoueurCroupier.class
index 876136367815a06b441cb6c838899103d693ada0..1a117b2e6248aecff4b395b75018848c471b8526 100644
GIT binary patch
literal 3338
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
KLm4>LmjeLd_62qT

literal 3208
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

diff --git a/Partie_2/target/classes/ch/hepia/JoueurHumain.class b/Partie_2/target/classes/ch/hepia/JoueurHumain.class
index 9debc8be63144d904e9f87b6b480b14804ff24fb..733a8e929c37ad44af07e0311c79cabaeee685a9 100644
GIT binary patch
literal 4874
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

literal 4909
zcmX^0Z`VEs1_lR)jqD6ej0~d58TuKi1(}KZUiqb|r9~d4xrv#1><lc73<6n+Wr_MZ
ziFxVz{z+M>$tCOzY>W*2Xc`z9SUnQ+Qi>TFM18;-N=q_x^c{<e5-WW&i%YB-890M8
z)AJHbN{dn%8Pu?;vGIYM2{Ovs&YF>d)i*ycwUUv6(S?zL(=)HQv?wtzIhB!t9n4Nm
zVPs&8Vq{>m$;`_vv14SA)IgZwm0FsT>YP|ql4|X#8OF%K;+&t7%EiFUAi~2Sz#z)V
zz^tJe#?Bzl$RLcx!CVYt3?iHij0{pd4D1XX><luD47@1r<6@9zkOLVd2vV!S!=T8Z
z#K^#$n3BTCAgTfJAX2DVYes?8sqiqUGN>^!FsG-MfYf<vVyXn0tii*e$)Lr^z!scZ
z;sjF4qT!+$26B)N4+A#?4~V75!@vt+8SpUhG4L}o@cU%urTUfTCZ!gIBqrsgGBODH
z<R>TQge4Ybg7{EDmXeIjVnzmWq`*Rob!$cjX0OyzP)x!-j1-uR42+(P46H$^#UN)%
zU=MLnfOB~y7Q5t^Cgp&liABQ`6adl;wmb}040hnq2gO`QVqS`05+ef}L?tK+J&~M+
zh(paVP_Q`jFt{+dGBU8aLxY7`L(_$efsw(Thrt6BUfe;cx%p+O;A8{R;Kjq>z#s}@
z`S39KGFUP)2)Gm_mOCdFrMMO4=ej56rZO^cI49->7vyA?fYb%>Fa&}e$l;M#3>OUM
zVF+OeWn|!RPb~qbDMkii4NpykOTmKHTnyn1k?af+j0}A6paaYBFhns#Gcs_br<S<o
z7lBeRvxcT8$hue_hB%NEn_m*hQH%_{!6k{w*}jPd(8vM>BRsXUL0D`K3=qJ`z~!D=
z0ufAMWZ-j2P0P$n4K684EJ;nTWM@ccWRL=<Zg5HrD$Og&%uRKzNKP#%$;{8=V8~=-
zkb~rPg@ByI%G4r-jKpGvynF?i5qew<X$;w*WS#>`u1JYBxTGjEFWnjx(;SW|Dc}(2
zV8~}=P<BqtQ!i0SOi5A5OHEHK$t+7%NX*SI%_~vJPg4M^)8k+$WMmKkvlT+~Qc{c3
za`Mad7#Y|g3ON``7#TDm<`kDEl@ui=m*6w3jFEvKVwis!+$>OBfdwJa1`T&mLIekV
zH4j4tDBxK&Ts$?yI2h^}8B`!PCZ(1rBqFTKFH*=W&B=lKL63u>fssKSp)xnWC{>{(
zBQZ~*BqJ5#J%!5rQiY7fvQ#}#mT%%=Xa-rtQk+?p%E8de$RGwP-xTt|`BWh<zeJ%d
zF()%ckC6f7I2T3+4p<Tem6{p(<sjw7Afvi?7`hpH7#TP+OHzvxOY(~t8N@W8B?!2{
z^@NIBb2IcYOkii|XJilp$3KcJ55q);NsJ6Ed8rj8j0_?$6ToQ%QpQ_@lI9d1hN+-}
zk|P-E29TlCc^GDZvIl!cVzD1sKMN=igUTLwk_Wlh8seKUMg~@JF5+OA$H*Y+n^*z!
zcYc~eaZYAINwFTtt_7eZwh-i)X!J}4$@z<U7?v<BWMmM6WN=Vk0cBv2RUrM#co>#L
z+zQIaCEy|_Ik6~(kwF06JVpj~za)^pVlWG2QZXX~4<u)&K$8iphNq{dCnEzJ$PiEg
z#TA@iT9lmXmI*3VxgoWr9w=xT6c`v8m>C!uSQ%Itm_U^U10w?`0|NsS0~Z4msH_IF
zc^P=XG#>*$0|SFN10#a~gCGMVgAfA)!z>0?24+xgthJp%SZg<fSmbsFiLDHhT3Z+-
zcQZ&wYO`)<kln^09}W^=-o~JOfI*sX8-u!*O#4;_Z7sg747ys(TN(5>f^9HlU|>*U
z;9y{2ux4Okuwme5uwzhQaA449aAGiJaAvS#aAB}#aAh!JU|>*y*vnwdU;-{s92iU)
z%orF!ZeieNFlS(5U}Ughu!Op^l!29jiGhK^5NsO>4n;UjjDeMbfx(l3mBE`qfWenR
zk-?wAfFS_v7%_<9aK{)z9mB|A#b6C}f-?gXSQS4gD5N1lv5moI4czB!VAlsD8ORSe
zke|Vx!JL7Sfsw(1!4Ya;6$3Lk3=FhTOmy1D;D#dLiNw>{#^8<ck`Mz60|P@igAhXm
zg91Y&gFZtP*mg+R8o+HgfZEQ$U;y?QC~W=U9^1sg4E9(Gl0DlP{AWT^0o13=+Zckj
zF@&+qXRt$31{FmTVS%Vyz#xt!xQ!u(bpZn_%Nk}-XfZQ@(g`FwVj0vK;u!oG;u#Vc
z5*U&glELnWL`MqT{V7oQ$1^a1Qo6bo10zEq-2K=i#vf!A6WA(9#H1q`jV)pl80?@C
zqYsWK1_oBGEe!hT#$<zy;Q_}rE7XOI42cY)P|Z;ctYA46Etahe`rxRA=9_H{P9h9R
z`JgPLwS_@<8-p8qOy)DNG88aKGZZo?GZZ1&qXM@lg~1hSk3KkuKpd&N9xV};B56iA
zG8OJf6L7J?z`(VeAuUoUV>?6Eel!!RkWAo$Tc69I1+~5#T5wpZ^UavUzza4f4`hzk
z76xs;>GK#QKn(R{glqv=HgXGtwtDhb25pevAt^zMfsKKIp^kx#p`Jm2p@Bh#p^-t4
zp@qSMp%v^1NNTWzI)Z`0lA(wJ6#mfEARx=Y2x@`haab|fYLLTb%z-;>`aGz!OTn^W
zhoxh2SO)_eLnng(Ll=VzLpOsSLmz_$LqE|DE5{mP+UOBB32Y$9R}2h@2&-VIg!<|b
zwD2iH$yHSX$qN`nP=x$vG1#LBfYq=|&tlNP6b8kSBs7DA^5}d9HUZH!sOmuJ9}-WH
z96OCcg<(2_HNy;s1csRm$qci>E{DWX5j>8Hka8>=1B;573aHG{WT=7q=K#3QVqgeU
z=bJGX8V|Lgcu)r=8+g>zgM?&fGw{iR9JP(1aS2py3rIo>9%mp~SxAwrzKua0k+#&p
z_2EJWHiktE0t|~8BpH@4C^IZ)Fk)E2V8gJQ!Hr=JLny;qupc0$W*FQLVbFBOzz_!Z
z4Ko8M#j!E42ng|kIzcWBZBXCjK}%2#>Ddf?(jdoRICTpHBA}f>u@4DTK5z}Nk%6CK
z6N4nfR<JuDVW|OkhX&YoMzHNH3{3nWyW8QlNG-G$(Im!hSoHz198!JkV&G@k%^=CJ
zk3oZBKiC0~fY5|HKojZ!1_n)N^#KY9m{U67rAigJIl{o83<-fw-{lN~Iy)J985s^R
zNc(7SW0<V7lVKVo!>s>r5HSRC#32SzhQkb!42Kw$7><G+0SN_Vs3SxfSQut9%wm9q
zf*=Fae+F&_W_AWf26l!%1_oXRMuw>jv!T&ZL|SxAMt96f27ZQ943Z3I8PplhAvp$r
zl+1xe31a{QJGf%L3<-xuwgu2sI~Sa45lI15S^9w#ftp$@dl|wbnRSD=Gt7rIxS&}R
zCbNxU5lAsqbQ{A`5D$d6F*LHIK$1UpQII0IHYZT~4P6Ae$pK0wAbAi*G8!a|2r46R
ztMU>9H^XHHQHE;_sth+6Y#44a1ToxUNMN|jP{wedVHU#!hBXY27<Mx}X1K)g1RRuF
zkf4FaD+9x2c;dPYO<bxB>ljurtYm=XH)aM#P}RDMAsQOHM$p=s1L{0b0fk)8KL=X_
zDM~q@)-W=xh8LySn+q}M#=Hg_14)J0nhR?f)<PW=$iM{7#lj#5K|@&v(hNd3^gY;6
bNd6Lrx{ZNB7#;+|4C|mxUr-Uj#IOMX{@%E%

diff --git a/Partie_2/target/classes/ch/hepia/JoueurOrdinateur.class b/Partie_2/target/classes/ch/hepia/JoueurOrdinateur.class
index 744d8a3ed0522b42651ca1ff2a0e437ba8688d6a..b83e6a0bea0dd6f64078eaf509636401c3c5324e 100644
GIT binary patch
literal 4837
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
LQ~<99*OBW0Q$m}W

literal 4745
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

-- 
GitLab