/** ラウンド開始 */ public void startRound(final PokerInfo info) throws PokerException { if (info == null) { throw new NullPointerException("Poker info is null."); } // デッキシャッフル final List<Card> deck = CardUtil.createShuffledCardList(); info.setDeck(deck); // ハンドを配る for (final Position position : Position.values()) { // 空席にも配って自動フォールドさせる final Hand hand = new Hand(Arrays.asList(info.getCardFromDeck(), info.getCardFromDeck())); info.setHand(position, hand); } // TODO アナウンサー // TODO ブラインド徴収 // TODO HUの際の特殊挙動対応 info.setActivePosition(Position.UTG); onPhase(info); }
/** * フェイズごとの処理 * * @param info ポーカー情報。 */ private void onPhase(final PokerInfo info) { final Player activePlayer = info.getActivePlayer(); switch (activePlayer.getType()) { case HUMAN: info.notifyObservers(new AnnounceParam(activePlayer, AnnounceFlag.HAND_TALK)); break; default: // 空席は無視 next(info); break; } }
/** 開始 */ public void startGame(final PokerInfo info, final List<String> playerNameList) throws PokerException { if (info == null) { throw new NullPointerException("Poker info is null."); } if (playerNameList == null) { throw new NullPointerException("Player name list is null."); } if (playerNameList.isEmpty()) { throw new IllegalArgumentException("Player name list is empty."); } // 現状席決めのみ // ポジションをシャッフル final List<Position> positionList = new ArrayList<>(Arrays.asList(Position.values())); Collections.shuffle(positionList, new SecureRandom()); // プレイヤーを格納 (空席はPokerInfoが自動で埋めるので放置) final Map<Position, Player> playerTable = new TreeMap<>(); for (final String playerName : playerNameList) { playerTable.put(positionList.remove(0), new Player(playerName, PlayerType.HUMAN)); } info.setPlayerTable(playerTable); }
/** * 次のプレイヤーのベットへ * * @param info ゲーム情報。 */ public void next(final PokerInfo info) { if (info == null) { throw new NullPointerException("Poker info is null."); } // TODO 次のフェイズに進んでいいかどうか(全員のベット額が揃ったか)の判定 // Utilで判定ルーチンを作った方がいい info.setActivePositionToNext(); onPhase(info); }