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 zcmca<^WBE))W2Q(7#J8F7?U@0WwY^cyQh`}mlUPurI%!Eu47|kWa0EkES}uT9?8Px zo?0^bKD#?xKf`nmhSQVHI8-do@-UoZ*w4to;gMJzT#%Dl!p#uNaDj*6BEuy{27dR{ z66eIC6qtF846GWSo|>K<3|A)ibBHoto4k}m+42S>1CyNs7sD-vJM0X%85sn!63Y_x za}x8?^@B@_GV{`T816FMV`N}U&PXhBEMa6|(eTuC=3sa*nUPb6?GX>dV}>V_jXAY7 zpYbp}XL!QMzzTQBOCE+-AQ3i~{L-YHRFK==@G!ic+|HTI`ACR?lVK7E!>`GoIgJ<@ zC#!KO=(931aB&8u7MJFfC|D^7F$glGa4>Q(GVn-88=K@F+GrphZIH{&5X;EL!^q9Z zGr5$@nNec$PA+XWc^-yBMuo|*xTIW^7**IAl^Gd?!T!k1*Z0gTC<TXUVlEG(D#HXu z29~1K#1t+DLq>HTMhym2Mh4cP)Z)|<E(QfgEgnW~MxDtX+-eGXj0WtC`iu-hV1r6a zGIR7jOHzvxOY)0&7|Iz9C--qnOQ>@*>M@$|Fq$&dFfy=bBo_OnR+O+anomB+oxx_u z=)lfsKUtqgo6&J{G|xO1TMkB-$$xpo8Qms}@+vTTOg7_HWc6ZX5ayc1E5hhAxsX?q z(Qk4$uLfhl<So1!j6sv{@=EZ8Ffy<*g1pYb7&e)aPh2yCkwK8tDHRk*;E;hzMlmvQ zOGg_U=ITNPVkSHC$uq`JPUO>KNn~V@o1DNSH+e1JMO7XK76yI>DF#6XRR$3TO9pWU zI|c~`X9h`za0Us6cm`R9JO;VVi}__3eN`A(8Pphf8Ppks88jKB8FU%U7>pR~7)%)) z8O#_w8O#|187vqg7)%)w8LSyH80;8o85|i}8Jrk;8Qd8rFnBP`U@%~q&EU(hmcef_ zkDwD18^h!P!A!=m&ASBIm>5q@J}7L<cxLi{VNu5OlSM^T<SuVx2;0QqEOZr0U*E>y zy@?@r8$&VkHiny%!$s^E?@yj4qQLlY@^%p=#;22Si6}9?nEY47I`%aq1GCL?238gu z>6w32HZm|UFf&*%FfgVuL^3cigfQ?hL@@9(L@@|6#4<=S#4|`UBrwP_Br+&4Brzy6 zBr~Wpq%!C;q%oK>WH8t=WHUH0<S_U!WHb0P<TC_Ko+vuMehtHEro#+pm~JtgWxC67 zj_E1GC8oCw*O<OC++b#8xXrB0aEDo+;V!co!#!q8h6l`!3|E<57@jhFGdyEXWO%`x z!tjzgo#8ce9>W{v7KV4s?F{dkyBIz)Ph|MSyqw_+^D2h#%v%^@na?o%X1>huhxswX zU*@L_|CnDeGBLkmh+tuU$H+E$y_mS|JBIfRj0`NyuNn3+yk}ryU}JvC@PXky12Y3B z^D~Bz4DT6O7<iZ;Gkjur&%nwc%zT~UGs71KHU=@~Z46&0GmCpDePgI$U}O+vU|@@9 z;ALQDU|?CfoPl3!3xgT6))of2Z4BQh=Zfod|6pK%M#Rs_%f(H_e}nnU8N@a*ID-{$ zW0<mw;m_pH;wB=0!E($t%bDhEVsMsbN!Z2kZ?d(76feVnu*@a~XJJN$$w?9coJ?SW z<qYzZ=Saw~fhAZb-<5D>WSguksmaJbd4ZHX^G-(2$@!9oti0K~82Km9lTv0C$Oeg> zl{94(0`rBzd~GRnPEn|V36l+^Bqz5>NivEdsW>KO$S6Mfhm<O-WcDsb>B;k?q$k@- zvvWv-^fNOopDZ9D#?B}MHe>QZK@m|#Suh)v5WxwMQEnTf;^axvUiE5PTNsqLF>3lQ zXAsxf$*9Z7aDXA!M;jDoI~k3b7<6_r8Z$D?`u~i14Fe;K9*Zf91)~`>AsR9GFfcIk zGcYp>Fz_?-GsrLsGpI0%FlaG~F&HsQGMF+-F*q_xGPp1*F!(SkGDI>eF(fi7GZZqa zFtjkLGPE<Q)icau)M8l3sLQa0QIBCeqdvnKMm>h}jK&OC7)==-F<LPEW3*#rXS8RO zWprRvWpre;V{~G4WOQZ>XLMqWVsv4QWprh%Wb|ZgV)SNQ$LPy=iqVhpEMoxUOU59^ zPmIA#!i*tIVvJ!-I*buaK8%q}g^W>5C5$mleT;ETs~GF!na(pNFkNCyVtU7z!py~( z%FN4{&aBCp$?VFQ#hk@x%-qOWz&wSqh<Pq!Df24Ea^{na70hoLE15qqR<m$3Hn6BM zHnHe2wy~HpwzF6=cC!R9_OJvoPGpH=oWxSXIE|&AaXQNs#u+U07^kx=XPnJo$-uy% z07;<?R$>g+3=9kxnKm$dW#D6AWSPRi#c083IXPO^xZaFGLh(O?C<8M)10w@FqaFi; zFatBA6$1kU6Qebw4Fdzi3<gO?Ck94FXE5msCf&iLCz$jGlfGcmA4~><$zU)EQI9MF nQ6CDH4fg?4$kLHuk!U0mmxw20ECT}r7Xu?>9Ag4w5`!cFI7i(< delta 2119 zcmexvbJK?F)W2Q(7#J8F7*jTKWwUW|xTlu5<rgKVZf;~_V`OBT+|3@z$UgZ6ySu<C zhUtt9?0!kkiA5>J91LeBn{ud_p5tLS&#<47fx{!QIJh7uvxJ)=mf<1~!zG5xj0`;P zsU;xQU;`N$ST#I7H9a{Pu1=oFA<B4t@^TJk%bSc0Om+%f47VBXvNPOaWDv+oEKAhS zNz6;v4=yRn%uDBCxW{mxk%28aBeBS_gpq+o!&B3lgW=(1W=<Wp$2<&A7@kfx<<!=E z&cpD6;VB~nE8G>Yco<%TMA%&NOOtX^K@NM%!|-l$CucI}V<84khDjU@zbAj?G-70$ ztih$A&&J5W#Tk@ZT$)p&V5K0$Ajpuy!N|$Tz#|=PY?6Cuqk(j^K`u8#EF(7$BM&3* z<Z>=&M#;&$xwP37co+&96(_&pl44V4RApyWnasm2p{B+#fsuiwC^a#Ki@}glgNIR* z!IY7KH7K<>wS<d7fl-@>QHN1?vKP0Sf<B`mJEH+3gAmyFr6rj;`kp1JMTsT(MLZ1U zj7F0ua7#;Qa5L&Nn({E3G1M?JuxBI|`=wTturpdrKFpoLX3yxz&gd}NkVl)*X>u&j zJQh0+M%T&zdBhprCyVncFnUh5;8is7W@HfN^3BgntyHj50DFrO<S7nDUq%KI&%EN& zqSO>L8UM+>yc&#wleh6|Fa}S)&nuB1%E-V9)fUdkAjIX7n3n=F%qSNus$j*z7|F;W z$mx^{3P)sHq8S;urK61vb9KQgIT&Lh0!F#oU;#!39?!hI)FS7c#Ny)AVs^#^Mh4Z% z6ZzyOH}J4Cvoj`5?&JHU%FDpQAiyBSAjF``Aj)9LAi-eAAj#m&AjJ^QAjuHVAjgo$ zAisGjzYL?VDg!HnIs-3*27@qz7K1c{9)lT!F@qh08G|E(IfEyI1w$Z%B|`**8ABq2 z4MPTlJwq*n6GJP5Gea+f2g3vgPlg!`h77YA{210U_)q2&bYf!tF*!&ulhJ$g9zixH z#?zAngheOc5Y}KkJDE{Ll<~r3aS;`{E87^tHZeF0U4zm$wlR2bV#wXbP|UoI;nw6x z5j(~QlV^x1Fg}{RQ$&gJ+2lJSN{lZj{}-{2e8b4VY_pt!mBmJS<{y=f3=9m+3>FLw zjByO%3=9mR3_J{x4Ezky48ja?43Z294AKmV46+PK3<?a%49W~C4C)MN4EhY|45kd3 z47Ln83=Ryr3_c7w4E~d+i_Wh<%y63N7Q-2)y9{TUo-$lyddqN?=_|u^W=4iv%*qV6 zne`d&Fq<*lWwvCv&+N!>h1rGS39~oDQ|3g5=gcV#FPPIAUNPq}yk>4;c+1?*@Q%5Q z;REwThL6n489p<wV)(|qg&~gl48t$x%M8DnA2a-6e#-Ed`2`~*^DBl(=68&&Aq<ub z3=BaG91IN1?-{HZtQi;>n3&%(yl42pz{tSD{F-4O!v_W?1~%rG3?CUjFfcQ4GCyPZ z#PETEg@K3pF~etu4-Bjf!pzqhzA$`cU}F$t-p254GOxG?_jiUG21W)!1_n0o$qC|O zj6Wuqi|cd$WMF{Cz^}<0#ZATkfceWA#5OTFYi(gLW8TIvWf#NW$$!O7B>#csm~ECb z&Dq4@EX|Uzi{U?5X!1lUF&+jma}$HJFeBsS9Eku%=E-{{<oH<-!mQgEyeChP5S{#A zLYI+!vaX~iBgf>8lJXoo8M&AlmNSM=&X*9KJXunll`nf2qrl|#lFF=t**h7zCSR8{ zWfTVUMZkPhDRV}#$+=QijN(Y57o-dsB_=aTtFlUE?_!jhyk1h8e<#BNMg|c^DUdd1 zhUJsr3yLu@%1+LcmJ*SJxl9P0_!#B4F)B@-BkfhMuC;|hc^jja?{Wrlot=z&j0^`D zVtur=wlK);WHe@C(Amjo!pJb||1;(_42&##ET$|LjONfpD97N=z`)4Iz|6?cz|Y9X zAj2rcpu#B3pv5T4V8kfFV9F@T;K(S!;KC@+;KQiE5Xq>>kjSXSP{^pv(88#~(9Wn@ z&oGNolVKsF4#O5kU54$9dJJb6bs5ex8Zlg9G+}teXvXl5(Snhk(UMV?(TY)((VEeY z(T35H(Uvis(S|XK(T*{e(VnrA(TTB%(V1}_qYL9HMpwp{jBbpd7~PqK89kVE7(JPM z7`>PZ8NHeM7=4&lG5Ru{XY^xw$LP<@#aJJ}tjQS2?8+F#oW*Fw+{hTtJcTimc`jo# z^D4#|=97%E%x@Xvm_IPavv4yev#2qqvgk2pu$VGtvRE?avIH>Zu>>&|v&1o$u#_;C zv(z(IuuNgBWSPfU!LppO2AsYX7?>FtSXM&Q_eG`+4Br^|7#LZmFmN$iGBH|Bu9P*d zH)oJg{LdiDz|79T$iU91&%hwez|08F5R5jAwhRmmGZ-Wpof#MzUBILpnDhXXUSQG( zO!|Sz05BN@CPTm^L_M+yM12@oHUh#ymW~2T#2}HlM7$W|7#JA17#JDj850?k86*KJ 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 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+(P4BWw~CBY>{ zi6yD&mFx^wj0{rXKm>a@s5Gx6GdI<>B0067Br`vcgTaQ8K@O6n6asP*D^rUUG7^gw z^70j6M(A-dSTfjwLem};Do9}xTvC*omu?M;K@P{16mWXrU~pn&P<BqtQ!i0SOi5A5 zOHEHK$t+7%NX*SI%_~vJPg4M^)8k-pVPxP3vlaZyQj5}Z^2_xY8Q37|7#VnjOA?c_ zeG?0y0mB`Xnwwvi3f92E;K|6K0kNdGG^wO0F}VbvP2P+Q0$_~_p?N8At2o?KOTePw z^yb3Iz^dWmsTsz>5WvWw0x>)(wL~EiVRC+vLSAW34%9Dt91KB>4C)A#x%ow@3MCnd zc?u;NsSs}}ROXi|WF(fQ>VZ;N2oFOj11P;0XI7<xZS~|}h+t$817#|OJaFPr$jdKL zC`-)AOaX;PMq*xyUlJn&n>#$Md1|_VQei9)LllEABLjy^QDV7sVo?exi+Lg?8$=${ z3<GIM<Y7o+NM>XZfN5|m%FlIA%uQuvkiecdK@rREo>~GjJ-DPOH7~s+0~AW0o|>K@ z6VrJZG8i%$89)IE&drPr!Wy2M2seNQt+^Po8FJYfau^x-;E5J2!^4mV3Js3*)DpM+ zB2d}EmYi4w_Ai%vYKdPG$l_u~1{Mvdg~dD!B_JJa5Gh6mj^K>^a!}ww6oLI&!NX7r zDnmG7a>byaujXN>VW?$f;K(dVElMoOFJfd6(|~4haCztn6}RSQsAp(oXJ}w#5CZ2L z6j>gICWdB429~_kiV{W!5ts?!yag$O!TMWy7}^-x85!6!5{v!7N|`k@qZk=jK=BDG z3*Z3(a=bMo1H``|PB9|`w>vlkgTosX&b>Sg-3(yA_46=H0GZ3-kyspDkds-$$iU{3 zUz(JY%EiFQFqwzJok0tvV=52BL{J!Tc_bD?<WnFa6a|u<$-^)WY>IPY9@G?8FwMa* zmyto#H?abi7W2~-ib2*C>w)ym2NePfK;Di<k7Gy@Tg1b#m|+1UgAgRIf}#(U$Uxo# z>0ipjungoX4zOh<pelj|6yb~v0_f&3GO$6a5jF<~2!MnUL@<Ss0pv3{hczg*7*r5* z1?QI*C8xS&f{IseNOh?PibMtl21W*E21W)}1{MY;P_4nh$iT_Kz`(@7#lQqAw83m% z1|BfY$H33Pz#z`R$RNNV$iT=T#K6EXi-DDa8B{H6ZD$bH+RY#qxt&2`D}$ug76!@P z4APO>tlJr6w=u|vg9MnjF(@BkkmlRQpspp;zLh~+i*GA~t`_rF2K|j-8w?p37?c<| z7#J9W7+4rW82A~&859^I8T1*V8B7^s7_1m#8SEM27>pPg7!)A(G8i+MfP=z;!IZ&_ zff3{u25ts(1||kZ1`7sJs5?!-{$ya_+Rb1YDP+B!!FE5~MmDgnB(SMGU^W-jR7M5| z1}&%w-B6!es`Jg5!@vtR#}Q<X))oeBzUlKABtQ)HWQ45qb_U!1T9I2AwAGWhGH8Rm z$jkupq7(xg0|P?_0~<pog8)Mog9<}7gC0XZg9SqY*b!n3ObiSRmQY84Sgs5phq*B@ zfFepjmVptJr13b+18g<OVKe5y9X5R))Y)EOS+K*>u{f-hfsLVzL4cv0L4~1$L64z^ z!GfWdXovYQ_(C0~4~_!{23AnOtVav(2C#u3UokMSLVe1}pvm9|)qDV)C>a>S)cI!2 zg}U1x<ZgA4X>hLuf`nveGw{iR64*9|;3ZJC;UEb};Dh`Kl9h!dKlN=4>WH{d11I=4 z1~!Iv1_6dH21$l)24#kR1|x<E3^oi?7~B}9GlVkC0J|2F<ien?Wnc(nfW!-k70F=E zz{~)OAvOjU0U<t6b0>-+8tR)o24--aYDmv!;FAV92E(aa7$l`34&25N0}3rjTHymH z^SKQC4D%Qy85V)v0ZAVkaCc}hfNW<3+s?wk#1FDNjv*ducP#@m*bGf#?AF=Fkbnpr zAqEx(28I<3{0u7@BpKE+XfUh;I{*?8ns5hbLLI=spb5@}OejuCVMv8KC6Iv$>=a>8 z2ta)+vyCBb8$;F_wDhqN$s%F6MZ$24gc<UonY@6Z5Nf<L0~0uu`H_s@#!!TA^j5IZ zkU->z8_f?jnvtQDp$uwZ5oys@jvjKm8Tc9YFi0{SU{Gf`h-54NsH=pRT2<iknSntW z<e_a0Rlds^1a)>Y)G;y~V379F-o{X_vy-8Pkzv;VH|SO$V-RIH$soyaj6sRvG?LZI zP!EeTurPEmbTU9vjUWTle+F&_W_AWf26l#e1_oXRMuskiFlaa!F))J5MGlBNg3&|t z9M}R#X6Arez{t=IkC<uDi17jGhsOIhh8}_B1q`|<LVdFsB&BCDh@uD<vCd~;6A)d4 zBG?0R10;(;Qt2%QVTRibRt$F;Y#Hu@-2;hXAE<j67<`~H49cV|3`|y_8e$?mn^Zxw ziGdc1Ju%xDCZPySLE^!33lq3lhq&W8gAl_j1_g$<4EhZ3!0v$L76Z6D4502{U@(B@ z7Dk3?4AY@ujXe?10C^W;4WzpI2sRqxMQn+97Tmy1&_tYq<nV0_eKR4IG&DAtA-Rxc zK7$>SGN>q$2n$5r0tRs;!EFphtP2=eS=KOvTnUL3F$Pu!28KTj>I{Dw{22Z*BryDE zNMd9{a&-zkKvJLq0*x4TD+We}*|3OV3}9df7ekjpHg01GW?KL);^%;ictp7ga+@DW z5vbw8vX>z{l36!+JHtF!^8@Ntn9MeYg&@UH(QOP%Ks*rM#t_Vs0xOEKiGmctwZ(v1 zGw347Nd}ZiK=L4rWHd+^k!g)UZ7fC(25v@922n;{231A@1{+3Uh9E{Uh6F}QhB8JO zhFOgA3~Lyb7<Mx%GhAX+0SBcPBxvA4c^Mj%3=Ef{X-k!19m8^l70}9wnSl}1B$@zE z9oUmwA1ES`k{hEs*f!kBZ6&<Sieg{|mlY~nEL$1$!I=r#?%T!?Bf_vMAJpX2+QOi_ zjbReV{}5Zid52Mlft698L7LHsL7CAQY$K#hQGxo8kzozi)`c#pzJwSA&K-<qNSYC? zi?s~x&`hQeEzm$s6Mb~QT4B|^jv*PUxs-twT+JAQTdpKDdJ*0Q=MF}D23AHV1_4G_ f21Q191_MS9u*Hx-HiUYafx!?Qk)Q$?;>!&H<9es+ literal 4909 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 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