PlayerHand.java

  1. package com.example;

  2. import java.util.ArrayList;

  3. public class PlayerHand extends Hand {
  4.   private int bet;
  5.   private HandStatus status;
  6.   private boolean paid;

  7.   public PlayerHand(Game game) {
  8.     super(game);

  9.     this.bet = game.getCurrentBet();
  10.     this.status = HandStatus.UNKNOWN;
  11.     this.paid = false;
  12.   }

  13.   @Override
  14.   public PlayerHand clone() {
  15.     PlayerHand cloned = (PlayerHand) super.clone();
  16.     cloned.game = this.game;
  17.     return cloned;
  18.   }

  19.   public ArrayList<Card> getCards() {
  20.     return cards;
  21.   }

  22.   public int getBet() {
  23.     return bet;
  24.   }

  25.   public void setBet(int bet) {
  26.     this.bet = bet;
  27.   }

  28.   public void setStatus(HandStatus status) {
  29.     this.status = status;
  30.   }

  31.   public boolean isPaid() {
  32.     return paid;
  33.   }

  34.   public void setPaid(boolean paid) {
  35.     this.paid = paid;
  36.   }

  37.   public boolean isBusted() {
  38.     return getValue(CountMethod.SOFT) > 21;
  39.   }

  40.   @Override
  41.   public String toString() {
  42.     StringBuilder out = new StringBuilder(" ");

  43.     for (Card c : cards) {
  44.       out.append(game.cardFace(c.value(), c.suit())).append(" ");
  45.     }

  46.     out.append(" ⇒  ").append(getValue(CountMethod.SOFT)).append(" ");

  47.     if (status == HandStatus.LOST) {
  48.       out.append("-");
  49.     } else if (status == HandStatus.WON) {
  50.       out.append("+");
  51.     }

  52.     out.append("$").append(String.format("%.2f", bet / 100.0));

  53.     if (!played && this.equals(game.getPlayerHands().get(game.getCurrentHand()))) {
  54.       out.append(" ⇐");
  55.     }

  56.     out.append(" ");

  57.     if (status == HandStatus.LOST) {
  58.       out.append(isBusted() ? "Busted!" : "Lose!");
  59.     } else if (status == HandStatus.WON) {
  60.       out.append(isBlackjack() ? "Blackjack!" : "Win!");
  61.     } else if (status == HandStatus.PUSH) {
  62.       out.append("Push!");
  63.     }

  64.     out.append("\n\n");

  65.     return out.toString();
  66.   }

  67.   public int getValue(CountMethod countMethod) {
  68.     return calculateValue(countMethod, false);
  69.   }

  70.   public boolean isDone() {
  71.     played = played || stood || isBlackjack() || isBusted() ||
  72.         getValue(CountMethod.SOFT) == 21 ||
  73.         getValue(CountMethod.HARD) == 21;

  74.     if (played && !paid && isBusted()) {
  75.       paid = true;
  76.       status = HandStatus.LOST;
  77.       game.setMoney(game.getMoney() - bet);
  78.     }

  79.     return played;
  80.   }

  81.   public boolean canSplit() {
  82.     if (stood) {
  83.       return false;
  84.     } else if (cards.size() != 2) {
  85.       return false;
  86.     } else if (game.getPlayerHands().size() >= Game.MAX_PLAYER_HANDS) {
  87.       return false;
  88.     } else if (cannotCoverBet()) {
  89.       return false;
  90.     }

  91.     return cards.get(0).value() == cards.get(1).value();
  92.   }

  93.   public boolean canDbl() {
  94.     if (stood) {
  95.       return false;
  96.     } else if (cards.size() != 2) {
  97.       return false;
  98.     } else if (cannotCoverBet()) {
  99.       return false;
  100.     }

  101.     return !isBlackjack();
  102.   }

  103.   private boolean cannotCoverBet() {
  104.     return game.getMoney() < game.allBets() + bet;
  105.   }

  106.   public void hit() {
  107.     dealCard();

  108.     if (isDone()) {
  109.       process();
  110.       return;
  111.     }

  112.     game.drawHands();
  113.     game.getPlayerHands().get(game.getCurrentHand()).getAction();
  114.   }

  115.   public void dbl() {
  116.     dealCard();

  117.     played = true;
  118.     bet *= 2;

  119.     if (isDone()) {
  120.       process();
  121.     }
  122.   }

  123.   public void stand() {
  124.     stood = true;
  125.     played = true;

  126.     if (game.moreHandsToPlay()) {
  127.       game.playMoreHands();
  128.       return;
  129.     }

  130.     game.playDealerHand();
  131.     game.drawHands();
  132.     game.betOptions();
  133.   }

  134.   public void process() {
  135.     if (game.moreHandsToPlay()) {
  136.       game.playMoreHands();
  137.       return;
  138.     }

  139.     game.playDealerHand();
  140.     game.drawHands();
  141.     game.betOptions();
  142.   }

  143.   public void getAction() {
  144.     StringBuilder out = new StringBuilder(" ");
  145.     out.append("(H) Hit  (S) Stand  ");

  146.     if (canSplit()) {
  147.       out.append("(P) Split  ");
  148.     }
  149.     if (canDbl()) {
  150.       out.append("(D) Double");
  151.     }

  152.     System.out.println(out);

  153.     switch (game.getChar()) {
  154.       case 'h':
  155.         hit();
  156.         return;
  157.       case 's':
  158.         stand();
  159.         return;
  160.       case 'p':
  161.         if (canSplit()) {
  162.           game.splitCurrentHand();
  163.           return;
  164.         }
  165.       case 'd':
  166.         if (canDbl()) {
  167.           dbl();
  168.           return;
  169.         }
  170.     }

  171.     game.drawHands();
  172.     getAction();
  173.   }
  174. }