@Override public void start() { // Close table setOpen(false); // Begin first phase phase = PokerPhase.PREFLOP; // Create pot pot = newPot(0, new HashSet<>(getPlayers())); // Post blinds blinds(); // Deal 2 cards to each player deck.shuffle(); for (PokerPlayer player : getPlayers()) { player.dealCard(deck.draw(player), deck.draw(player)); } // Start betting with player left of big blind playerTurn = getPlayerCount() - 2; nextPlayer(); for (PokerPlayer player : getPlayers()) { player.requireAction(); } betting(); }
/** Starts next player's turn until betting is over, then advances to next phase. */ public void betting() { // Begin showdown phase if no players have to make remaining decisions int playersLeft = 0; int remaining = 0; for (PokerPlayer player : getPlayers()) { if (player.isInPlay()) { playersLeft++; if (!player.hasActed()) { remaining++; } } } if (playersLeft == 0 || (playersLeft == 1 && remaining == 0)) { showdown(false); return; } // Start next player's turn int playerCount = getPlayerCount(); PokerPlayer nextPlayer = getPlayerTurn(); int i = 0; while ((!nextPlayer.isInPlay() || nextPlayer.hasActed()) && i < playerCount) { nextPlayer(); nextPlayer = getPlayerTurn(); i++; } if (nextPlayer.isInPlay() && !nextPlayer.hasActed()) { nextPlayer.turnStart(); return; } // Start next phase nextPhase(); }
/** * Deals cards to the table's community cards and continues betting. * * @param cards The amount of cards to deal */ public void bettingRound(int cards) { // Deal cards to the table dealTableCards(cards); // Start betting with player left of dealer (small blind) playerTurn = getPlayerCount() - 1; for (PokerPlayer player : getPlayers()) { player.requireAction(); } betting(); }
/** Posts blinds to the table's current small and big blind. */ public void blinds() { int smallBlind = settings.getSmallBlind(); PokerPlayer player = getSmallBlind(); player.removeChips(smallBlind); player.raiseBet(smallBlind); pot.addChips(smallBlind); player = getBigBlind(); int bigBlind = settings.getBigBlind(); player.removeChips(bigBlind); player.raiseBet(bigBlind); pot.addChips(bigBlind); pot.raiseBet(bigBlind); }
/** Rotates dealer and blinds, eliminates players, and prepares table for next hand. */ public void handEnd() { // Begin end hand phase phase = PokerPhase.HAND_END; // Eliminate players with no money for (PokerPlayer player : new ArrayList<>(getPlayers())) { if (player.getChips() == 0) { removePlayer(player); } } int playersLeft = getPlayers().size(); if (playersLeft > 0) { // Rotate dealer, small blind, and big blind getPlayers().add(0, getPlayers().remove(getPlayerCount() - 1)); // Eliminate players that can't afford blind while (playersLeft > 1) { PokerPlayer smallBlind = getSmallBlind(); if (smallBlind.getChips() < settings.getSmallBlind()) { removePlayer(smallBlind); playersLeft--; continue; } break; } while (playersLeft > 2) { PokerPlayer bigBlind = getBigBlind(); if (bigBlind.getChips() < settings.getBigBlind()) { removePlayer(bigBlind); playersLeft--; continue; } break; } } // Reset deck, open table, and wait to start next game deck.reset(); tableCards.clear(); for (PokerPlayer player : getPlayers()) { player.nextHand(); } setOpen(true); phase = PokerPhase.STANDBY; }