|
@@ -0,0 +1,496 @@
|
|
|
+package com.company;
|
|
|
+
|
|
|
+import java.util.Random;
|
|
|
+
|
|
|
+public class Dealer {
|
|
|
+ private final Player[] players;
|
|
|
+ private final Deck deck = new Deck();
|
|
|
+ private final Card[] table = new Card[5];
|
|
|
+ private int CardOnDesk = 0;
|
|
|
+ private RATE_TYPE currentRateType;
|
|
|
+ Random random = new Random(System.currentTimeMillis());
|
|
|
+
|
|
|
+ public Dealer(int playerCount) throws Exception {
|
|
|
+ if (playerCount < 2 || playerCount > 9) {
|
|
|
+ throw new Exception("Некорректное количество игроков!");
|
|
|
+ }
|
|
|
+
|
|
|
+ players = new Player[playerCount];
|
|
|
+
|
|
|
+ for (int i = 0; i < playerCount; i++) {
|
|
|
+ players[i] = new Player("Player-" + (i + 1));
|
|
|
+ }
|
|
|
+
|
|
|
+ currentRateType = RATE_TYPE.PREFLOP;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * Раздача карт
|
|
|
+ */
|
|
|
+ public void HandOut() {
|
|
|
+ switch (currentRateType) {
|
|
|
+ case PREFLOP: {
|
|
|
+ for (int i = 0; i < players.length; i++) {
|
|
|
+ int cardIndex1 = random.nextInt(52);
|
|
|
+ int cardIndex2 = random.nextInt(52);
|
|
|
+ Card card1 = deck.Cards[cardIndex1];
|
|
|
+ Card card2 = deck.Cards[cardIndex2];
|
|
|
+
|
|
|
+ if (card1.onHands || card2.onHands) {
|
|
|
+ i--;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ card1.onHands = true;
|
|
|
+ card2.onHands = true;
|
|
|
+ players[i].setCards(Player.CARD_SLOT.FIRST, card1);
|
|
|
+ players[i].setCards(Player.CARD_SLOT.SECOND, card2);
|
|
|
+ }
|
|
|
+ currentRateType = RATE_TYPE.FLOP;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case FLOP: {
|
|
|
+ PutOnDesk(3);
|
|
|
+ currentRateType = RATE_TYPE.TURN;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case TURN: {
|
|
|
+ PutOnDesk(1);
|
|
|
+ currentRateType = RATE_TYPE.RIVER;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case RIVER: {
|
|
|
+ PutOnDesk(1);
|
|
|
+ currentRateType = RATE_TYPE.OPENING;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case OPENING: {
|
|
|
+ OpeningCard();
|
|
|
+ CardOnDesk = 0;
|
|
|
+ currentRateType = RATE_TYPE.PREFLOP;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * Положить на стол cardCount карт
|
|
|
+ *
|
|
|
+ * @param cardCount количество карт для раздачи
|
|
|
+ */
|
|
|
+ public void PutOnDesk(int cardCount) {
|
|
|
+ for (int i = 0; i < cardCount; i++) {
|
|
|
+ int cardIndex = random.nextInt(52);
|
|
|
+ Card currentCard = deck.Cards[cardIndex];
|
|
|
+ if (currentCard.onHands) {
|
|
|
+ i--;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ table[CardOnDesk++] = currentCard;
|
|
|
+ currentCard.onHands = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public void OpeningCard() {
|
|
|
+ System.out.println("Карты на столе ");
|
|
|
+ for (Card card : table) {
|
|
|
+ System.out.print(
|
|
|
+ deck.CardName.get(card.getDenomination())
|
|
|
+ + Lear.SYMBOL[card.Lear.ordinal()] + " ");
|
|
|
+ }
|
|
|
+ System.out.println("\n\nКарты игроков");
|
|
|
+
|
|
|
+ for (Player player : players) {
|
|
|
+ Card[] sharedCards = new Card[7];
|
|
|
+ int i = 0;
|
|
|
+ for (; i < table.length; i++) {
|
|
|
+ sharedCards[i] = table[i];
|
|
|
+ }
|
|
|
+ sharedCards[i++] = player.getCards(Player.CARD_SLOT.FIRST);
|
|
|
+ sharedCards[i] = player.getCards(Player.CARD_SLOT.SECOND);
|
|
|
+
|
|
|
+ try {
|
|
|
+ Sorting(sharedCards);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ PrintCard(sharedCards);
|
|
|
+
|
|
|
+ if (!isRoyalFlush(sharedCards, player)) {
|
|
|
+ if (!isStraightFlush(sharedCards, player)) {
|
|
|
+ if (!isFourOfAKind(sharedCards, player)) {
|
|
|
+ if (!isFullHouse(sharedCards, player)) {
|
|
|
+ if (!isFlush(sharedCards, player)) {
|
|
|
+ if (!isStraight(sharedCards, player)) {
|
|
|
+ if (!isThreeOfAKind(sharedCards, player)) {
|
|
|
+ if (!isTwoPairs(sharedCards, player)) {
|
|
|
+ if (!isOnePair(sharedCards, player)) {
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ System.out.println(player.getName() + " " + player.combination.Value);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int k = 0; k < players.length; k++) {
|
|
|
+ for (int l = 1; l < players.length; l++) {
|
|
|
+ if (players[k].combination.Value == players[l].combination.Value) {
|
|
|
+ for (Card card : sharedCards) {
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void PrintCard(Card[] cards) {
|
|
|
+ for (Card card : cards) {
|
|
|
+ System.out.print(
|
|
|
+ deck.CardName.get(card.getDenomination())
|
|
|
+ + Lear.SYMBOL[card.Lear.ordinal()] + " ");
|
|
|
+ }
|
|
|
+ System.out.println();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * Сортировка массива карт по убыванию его номинала
|
|
|
+ *
|
|
|
+ * @param cards массив карт (7 штук)
|
|
|
+ */
|
|
|
+ public void Sorting(Card[] cards) throws Exception {
|
|
|
+ if (cards.length != 7) {
|
|
|
+ throw new Exception("Что-то пошло не так");
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int i = 0; i < cards.length; i++) {
|
|
|
+ for (int j = 0; j < cards.length - 1; j++) {
|
|
|
+ if (cards[j].getDenomination() < cards[j + 1].getDenomination()) {
|
|
|
+ Card temp = cards[j];
|
|
|
+ cards[j] = cards[j + 1];
|
|
|
+ cards[j + 1] = temp;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * Проверяет есть ли в переданном массиве комбинация Стрит
|
|
|
+ *
|
|
|
+ * @param cards массив карт
|
|
|
+ */
|
|
|
+ public boolean isRoyalFlush(Card[] cards, Player player) {
|
|
|
+ boolean cardK = false;
|
|
|
+ boolean cardQ = false;
|
|
|
+ boolean cardJ = false;
|
|
|
+ boolean card10 = false;
|
|
|
+ if (cards[0].getDenomination() == 14 && isStraightFlush(cards, player)) {
|
|
|
+ for (int i = 0; i < cards.length - 1; i++) {
|
|
|
+ if (cards[i].getDenomination() == 13) {
|
|
|
+ cardK = true;
|
|
|
+ }
|
|
|
+ if (cards[i].getDenomination() == 12) {
|
|
|
+ cardQ = true;
|
|
|
+ }
|
|
|
+ if (cards[i].getDenomination() == 11) {
|
|
|
+ cardJ = true;
|
|
|
+ }
|
|
|
+ if (cards[i].getDenomination() == 10) {
|
|
|
+ card10 = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (card10 && cardJ && cardK && cardQ) {
|
|
|
+ player.combination.CurrentCombination = Combination.LIST.ROYAL_FLUSH;
|
|
|
+ player.combination.Value = 60 * Combination.Coefficient[Combination.LIST.ROYAL_FLUSH.ordinal()];
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * Стрит-флеш
|
|
|
+ * @param cards массив карт игрока и на столе отсортированных по номиналу
|
|
|
+ * @param player экземпляр игрока
|
|
|
+ */
|
|
|
+ public boolean isStraightFlush(Card[] cards, Player player) {
|
|
|
+ int counter = 0;
|
|
|
+ player.combination.Value = 0;
|
|
|
+ for (int i = 0; i < cards.length - 1; i++) {
|
|
|
+
|
|
|
+ if (cards[i].getDenomination() == cards[i + 1].getDenomination()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (cards[i].getDenomination() != cards[i + 1].getDenomination() + 1) {
|
|
|
+ if (i < 2) {
|
|
|
+ counter = 0;
|
|
|
+ player.combination.Value = 0;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (cards[i].Lear == cards[i + 1].Lear && cards[i].getDenomination() == cards[i + 1].getDenomination() + 1) {
|
|
|
+ counter++;
|
|
|
+ player.combination.Value += cards[i].getDenomination();
|
|
|
+ if (counter == 4) {
|
|
|
+ player.combination.CurrentCombination = Combination.LIST.STRAIGHT_FLUSH;
|
|
|
+ player.combination.Value += cards[i + 1].getDenomination();
|
|
|
+ player.combination.Value *= Combination.Coefficient[Combination.LIST.STRAIGHT_FLUSH.ordinal()];
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * Каре (четыре одного вида)
|
|
|
+ * @param cards массив карт игрока и на столе отсортированных по номиналу
|
|
|
+ * @param player экземпляр игрока
|
|
|
+ */
|
|
|
+ public boolean isFourOfAKind(Card[] cards, Player player) {
|
|
|
+ int count = 0;
|
|
|
+ player.combination.Value = 0;
|
|
|
+ for (int i = 0; i < cards.length - 1; i++) {
|
|
|
+ if (cards[i].getDenomination() == cards[i + 1].getDenomination()) {
|
|
|
+ count++;
|
|
|
+ player.combination.Value += cards[i].getDenomination();
|
|
|
+
|
|
|
+ if (count == 3) {
|
|
|
+ player.combination.Value += cards[i + 1].getDenomination();
|
|
|
+ player.combination.Value *= Combination.Coefficient[Combination.LIST.FOUR_OF_A_KIND.ordinal()];
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ count = 0;
|
|
|
+ player.combination.Value = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isFullHouse(Card[] cards, Player player) {
|
|
|
+ int count1 = 0;
|
|
|
+ int count2 = 0;
|
|
|
+ int value1 = 0;
|
|
|
+ int value2 = 0;
|
|
|
+ player.combination.Value = 0;
|
|
|
+ for (int i = 0; i < cards.length - 1; i++) {
|
|
|
+ if (cards[i].getDenomination() == cards[i + 1].getDenomination()) {
|
|
|
+ count1++;
|
|
|
+ value1 = cards[i].getDenomination();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (cards[i].getDenomination() != cards[i + 1].getDenomination()) {
|
|
|
+ if (count1 == 2 || count1 == 1) {
|
|
|
+ break;
|
|
|
+ } else {
|
|
|
+ count1 = 0;
|
|
|
+ value1 = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int j = 0; j < cards.length - 1; j++) {
|
|
|
+ if (cards[j].getDenomination() == value1) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (cards[j].getDenomination() == cards[j + 1].getDenomination()) {
|
|
|
+ count2++;
|
|
|
+ value2 = cards[j].getDenomination();
|
|
|
+ }
|
|
|
+ if (count2 == 2) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (cards[j].getDenomination() != cards[j + 1].getDenomination()) {
|
|
|
+ if (count2 == 1) {
|
|
|
+ break;
|
|
|
+ } else count2 = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (count1 == count2 && count1 > 1) {
|
|
|
+ if (value1 > value2) {
|
|
|
+ player.combination.Value = value1 * 3 + value2 * 2;
|
|
|
+ } else {
|
|
|
+ player.combination.Value = value1 * 2 + value2 * 3;
|
|
|
+ }
|
|
|
+ player.combination.CurrentCombination = Combination.LIST.FULL_HOUSE;
|
|
|
+ player.combination.Value *= Combination.Coefficient[Combination.LIST.FULL_HOUSE.ordinal()];
|
|
|
+
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ if (count1 == 1 && count2 == 2 || count1 == 2 && count2 == 1) {
|
|
|
+ player.combination.Value = value1 * count1 + value2 * count2 * Combination.Coefficient[Combination.LIST.FULL_HOUSE.ordinal()];
|
|
|
+ player.combination.CurrentCombination = Combination.LIST.FULL_HOUSE;
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ *
|
|
|
+ * !!! ДОРАБОТАТЬ !!!
|
|
|
+ *
|
|
|
+ */
|
|
|
+ public boolean isFlush(Card[] cards, Player player) {
|
|
|
+ int CountHearts = 0;
|
|
|
+ int CountDiamonds = 0;
|
|
|
+ int CountClubs = 0;
|
|
|
+ int CountSpades = 0;
|
|
|
+
|
|
|
+ for (int i = 0; i < cards.length - 1; i++) {
|
|
|
+ if (cards[i].Lear == Lear.NAME.CLUBS) {
|
|
|
+ CountClubs++;
|
|
|
+ }
|
|
|
+ if (cards[i].Lear == Lear.NAME.DIAMONDS) {
|
|
|
+ CountDiamonds++;
|
|
|
+ }
|
|
|
+ if (cards[i].Lear == Lear.NAME.SPADES) {
|
|
|
+ CountSpades++;
|
|
|
+ }
|
|
|
+ if (cards[i].Lear == Lear.NAME.HEARTS) {
|
|
|
+ CountHearts++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (CountClubs >= 5 || CountDiamonds >= 5 || CountSpades >= 5 || CountHearts >= 5) {
|
|
|
+ return true;
|
|
|
+ } else return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isStraight(Card[] cards, Player player) {
|
|
|
+ int counter = 0;
|
|
|
+ player.combination.Value = 0;
|
|
|
+
|
|
|
+ if (cards[0].getDenomination() == 14 && cards[6].getDenomination() == 2) {
|
|
|
+ boolean CardIsFive = false;
|
|
|
+ boolean CardIsFour = false;
|
|
|
+ boolean CardIsThree = false;
|
|
|
+
|
|
|
+ for (int i = 0; i < cards.length - 1; i++) {
|
|
|
+ if (cards[i].getDenomination() == 3) {
|
|
|
+ CardIsThree = true;
|
|
|
+ }
|
|
|
+ if (cards[i].getDenomination() == 4) {
|
|
|
+ CardIsFour = true;
|
|
|
+ }
|
|
|
+ if (cards[i].getDenomination() == 5) {
|
|
|
+ CardIsFive = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (CardIsFive && CardIsFour && CardIsThree) {
|
|
|
+ player.combination.CurrentCombination = Combination.LIST.STRAIGHT;
|
|
|
+ player.combination.Value = 60 * Combination.LIST.STRAIGHT.ordinal();
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int i = 0; i < cards.length - 1; i++) {
|
|
|
+
|
|
|
+ if (cards[i].getDenomination() == cards[i + 1].getDenomination()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (cards[i].getDenomination() != cards[i + 1].getDenomination() + 1) {
|
|
|
+ if (i < 2) {
|
|
|
+ counter = 0;
|
|
|
+ player.combination.Value = 0;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ counter++;
|
|
|
+ player.combination.Value += cards[i].getDenomination();
|
|
|
+
|
|
|
+ if (counter == 4) {
|
|
|
+ player.combination.Value += cards[i + 1].getDenomination();
|
|
|
+ player.combination.Value *= Combination.Coefficient[Combination.LIST.STRAIGHT.ordinal()];
|
|
|
+ player.combination.CurrentCombination = Combination.LIST.STRAIGHT;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isThreeOfAKind(Card[] cards, Player player) {
|
|
|
+ int count = 0;
|
|
|
+ player.combination.Value = 0;
|
|
|
+ for (int i = 0; i < cards.length - 1; i++) {
|
|
|
+ if (cards[i].getDenomination() == cards[i + 1].getDenomination()) {
|
|
|
+ count++;
|
|
|
+ player.combination.Value += cards[i].getDenomination();
|
|
|
+ } else {
|
|
|
+ count = 0;
|
|
|
+ player.combination.Value = 0;
|
|
|
+ }
|
|
|
+ if (count == 2) {
|
|
|
+ player.combination.Value += cards[i + 1].getDenomination();
|
|
|
+ player.combination.Value *= Combination.Coefficient[Combination.LIST.THREE_OF_A_KIND.ordinal()];
|
|
|
+ player.combination.CurrentCombination = Combination.LIST.THREE_OF_A_KIND;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isTwoPairs(Card[] cards, Player player) {
|
|
|
+ int count1 = 0, value1 = 0;
|
|
|
+ int count2 = 0, value2 = 0;
|
|
|
+ player.combination.Value = 0;
|
|
|
+ for (int i = 0; i < cards.length - 1; i++) {
|
|
|
+ if (cards[i].getDenomination() == cards[i + 1].getDenomination()) {
|
|
|
+ count1++;
|
|
|
+ if (count1 == 1) {
|
|
|
+ value1 = cards[i].getDenomination();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (int j = 0; j < cards.length - 1; j++) {
|
|
|
+ if (cards[j].getDenomination() == value1) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (cards[j].getDenomination() == cards[j + 1].getDenomination()) {
|
|
|
+ count2++;
|
|
|
+ if (count2 == 1) {
|
|
|
+ value2 = cards[j].getDenomination();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (count1 == 1 && count2 == 1) {
|
|
|
+ player.combination.Value = (value1 * 2 + value2 * 2) * Combination.Coefficient[Combination.LIST.TWO_PAIRS.ordinal()];
|
|
|
+ player.combination.CurrentCombination = Combination.LIST.TWO_PAIRS;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isOnePair(Card[] cards, Player player) {
|
|
|
+ player.combination.Value = 0;
|
|
|
+ for (int i = 0; i < cards.length - 1; i++) {
|
|
|
+ if (cards[i].getDenomination() == cards[i + 1].getDenomination()) {
|
|
|
+ player.combination.Value = cards[i].getDenomination() * 2 * Combination.Coefficient[Combination.LIST.ONE_PAIR.ordinal()];
|
|
|
+ player.combination.CurrentCombination = Combination.LIST.ONE_PAIR;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|