PlayerHand.java
- package com.example;
- import java.util.ArrayList;
- public class PlayerHand extends Hand {
- private int bet;
- private HandStatus status;
- private boolean paid;
- public PlayerHand(Game game) {
- super(game);
- this.bet = game.getCurrentBet();
- this.status = HandStatus.UNKNOWN;
- this.paid = false;
- }
- @Override
- public PlayerHand clone() {
- PlayerHand cloned = (PlayerHand) super.clone();
- cloned.game = this.game;
- return cloned;
- }
- public ArrayList<Card> getCards() {
- return cards;
- }
- public int getBet() {
- return bet;
- }
- public void setBet(int bet) {
- this.bet = bet;
- }
- public void setStatus(HandStatus status) {
- this.status = status;
- }
- public boolean isPaid() {
- return paid;
- }
- public void setPaid(boolean paid) {
- this.paid = paid;
- }
- public boolean isBusted() {
- return getValue(CountMethod.SOFT) > 21;
- }
- @Override
- public String toString() {
- StringBuilder out = new StringBuilder(" ");
- for (Card c : cards) {
- out.append(game.cardFace(c.value(), c.suit())).append(" ");
- }
- out.append(" ⇒ ").append(getValue(CountMethod.SOFT)).append(" ");
- if (status == HandStatus.LOST) {
- out.append("-");
- } else if (status == HandStatus.WON) {
- out.append("+");
- }
- out.append("$").append(String.format("%.2f", bet / 100.0));
- if (!played && this.equals(game.getPlayerHands().get(game.getCurrentHand()))) {
- out.append(" ⇐");
- }
- out.append(" ");
- if (status == HandStatus.LOST) {
- out.append(isBusted() ? "Busted!" : "Lose!");
- } else if (status == HandStatus.WON) {
- out.append(isBlackjack() ? "Blackjack!" : "Win!");
- } else if (status == HandStatus.PUSH) {
- out.append("Push!");
- }
- out.append("\n\n");
- return out.toString();
- }
- public int getValue(CountMethod countMethod) {
- return calculateValue(countMethod, false);
- }
- public boolean isDone() {
- played = played || stood || isBlackjack() || isBusted() ||
- getValue(CountMethod.SOFT) == 21 ||
- getValue(CountMethod.HARD) == 21;
- if (played && !paid && isBusted()) {
- paid = true;
- status = HandStatus.LOST;
- game.setMoney(game.getMoney() - bet);
- }
- return played;
- }
- public boolean canSplit() {
- if (stood) {
- return false;
- } else if (cards.size() != 2) {
- return false;
- } else if (game.getPlayerHands().size() >= Game.MAX_PLAYER_HANDS) {
- return false;
- } else if (cannotCoverBet()) {
- return false;
- }
- return cards.get(0).value() == cards.get(1).value();
- }
- public boolean canDbl() {
- if (stood) {
- return false;
- } else if (cards.size() != 2) {
- return false;
- } else if (cannotCoverBet()) {
- return false;
- }
- return !isBlackjack();
- }
- private boolean cannotCoverBet() {
- return game.getMoney() < game.allBets() + bet;
- }
- public void hit() {
- dealCard();
- if (isDone()) {
- process();
- return;
- }
- game.drawHands();
- game.getPlayerHands().get(game.getCurrentHand()).getAction();
- }
- public void dbl() {
- dealCard();
- played = true;
- bet *= 2;
- if (isDone()) {
- process();
- }
- }
- public void stand() {
- stood = true;
- played = true;
- if (game.moreHandsToPlay()) {
- game.playMoreHands();
- return;
- }
- game.playDealerHand();
- game.drawHands();
- game.betOptions();
- }
- public void process() {
- if (game.moreHandsToPlay()) {
- game.playMoreHands();
- return;
- }
- game.playDealerHand();
- game.drawHands();
- game.betOptions();
- }
- public void getAction() {
- StringBuilder out = new StringBuilder(" ");
- out.append("(H) Hit (S) Stand ");
- if (canSplit()) {
- out.append("(P) Split ");
- }
- if (canDbl()) {
- out.append("(D) Double");
- }
- System.out.println(out);
- switch (game.getChar()) {
- case 'h':
- hit();
- return;
- case 's':
- stand();
- return;
- case 'p':
- if (canSplit()) {
- game.splitCurrentHand();
- return;
- }
- case 'd':
- if (canDbl()) {
- dbl();
- return;
- }
- }
- game.drawHands();
- getAction();
- }
- }