// 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; }