Exemplo n.º 1
0
  // returns true if at least one bet, false otherwise
  public boolean playRound() {
    boolean atLeastOneBet = this.takeBetsAndDealInitialCards();

    if (!atLeastOneBet) return false;

    if (this.dealerHand.get(0).value() == Value.ACE) offerAndResolveInsurance();

    if (HandUtilities.blackjack(this.dealerHand)) {
      // share dealer's hole card that is now visible)
      for (BlackjackObserver observer : this.observers) observer.faceUpCard(this.dealerHand.get(1));

      for (Seat seat : this.seats) {
        if (seat.hands.size() > 0) {
          CardsAndBet hand = seat.hands.get(0);
          if (HandUtilities.blackjack(hand.cards())) hand.setResult(Result.PUSH);
          else hand.setResult(Result.DEALER_WIN);
        }
      }
    } else {
      for (int seatIndex = 0; seatIndex < seats.size(); seatIndex++) this.playSeat(seatIndex);

      // share dealer's hole card that is now visible)
      for (BlackjackObserver observer : this.observers) observer.faceUpCard(this.dealerHand.get(1));

      boolean unresolvedBet = false;
      for (int seatIndex = 0; seatIndex < this.seats.size() && !unresolvedBet; seatIndex++) {
        Seat seat = this.seats.get(seatIndex);
        for (CardsAndBet hand : seat.hands) {
          if (!hand.isDone()) unresolvedBet = true;
        }
      }

      if (unresolvedBet) {
        while (HandUtilities.value(this.dealerHand) < DEALER_MAX)
          this.dealerHand.add(dealFaceUpCard());

        this.compareHandsToDealerHand();
      }
    }

    List<Card> discards = new ArrayList<>();

    for (int seatIndex = 0; seatIndex < this.seats.size(); seatIndex++) {
      for (CardsAndBet hand : this.seats.get(seatIndex).hands) {
        for (BlackjackObserver observer : this.observers)
          observer.result(
              seatIndex,
              hand.bet(),
              new LinkedList<Card>(hand.cards()),
              new LinkedList<Card>(this.dealerHand),
              hand.result());

        if (hand.result() != Result.SOURCE_OF_SPLIT) discards.addAll(hand.cards());
      }
    }

    discards.addAll(this.dealerHand);

    this.cardSource.discard(discards);

    if (this.cardSource.justShuffled())
      for (BlackjackObserver observer : observers) observer.shuffle();

    this.settleBets();

    for (Seat seat : this.seats) seat.hands.clear();

    this.dealerHand.clear();

    return true;
  }