package com.bassoli.poker; public class HandAnalyzer { public static String getWinCode(Hand hand) { return getWinCode(hand.getCards()); } public static String getWinCode(Card[] cards) { String winCode = null; if ((winCode = HandAnalyzer.straightFlushWinCode(cards)) != null) { return winCode; } else if ((winCode = HandAnalyzer.fourKindWinCode(cards)) != null) { return winCode; } else if ((winCode = HandAnalyzer.fullHouseWinCode(cards)) != null) { return winCode; } else if ((winCode = HandAnalyzer.flushWinCode(cards)) != null) { return winCode; } else if ((winCode = HandAnalyzer.straightWinCode(cards)) != null) { return winCode; } else if ((winCode = HandAnalyzer.threeKindWinCode(cards)) != null) { return winCode; } else if ((winCode = HandAnalyzer.twoPairWinCode(cards)) != null) { return winCode; } else if ((winCode = HandAnalyzer.pairWinCode(cards)) != null) { return winCode; } else { return HandAnalyzer.highCardWinCode(cards); } } public static String straightFlushWinCode(Card[] cards) { if (cards.length < 5) { return null; } String winCode = "9"; String clubBucket = ""; String spadeBucket = ""; String diamondBucket = ""; String heartBucket = ""; SortHand.sort(cards); for (int i = 0 ; i < cards.length ; i++) { if (cards[i].getSuit().equals("C")) { clubBucket = clubBucket + cards[i].getValue(); } else if (cards[i].getSuit().equals("S")) { spadeBucket = spadeBucket + cards[i].getValue(); } else if (cards[i].getSuit().equals("D")) { diamondBucket = diamondBucket + cards[i].getValue(); } else if (cards[i].getSuit().equals("H")) { heartBucket = heartBucket + cards[i].getValue(); } } if (clubBucket.length() > 4) { Card[] tempCards = new Card[clubBucket.length()]; for (int i = 0 ; i < clubBucket.length() ; i++) { tempCards[i] = new Card("C" + clubBucket.substring(i,i+1)); } String straightWinCode = straightWinCode(tempCards); if (straightWinCode != null) { winCode = winCode + "C" + straightWinCode.substring(2,3); return winCode; } else { return null; } } else if (spadeBucket.length() > 4) { Card[] tempCards = new Card[spadeBucket.length()]; for (int i = 0 ; i < spadeBucket.length() ; i++) { tempCards[i] = new Card("S" + spadeBucket.substring(i,i+1)); } String straightWinCode = straightWinCode(tempCards); if (straightWinCode != null) { winCode = winCode + "S" + straightWinCode.substring(2,3); return winCode; } else { return null; } } else if (diamondBucket.length() > 4) { Card[] tempCards = new Card[diamondBucket.length()]; for (int i = 0 ; i < diamondBucket.length() ; i++) { tempCards[i] = new Card("D" + diamondBucket.substring(i,i+1)); } String straightWinCode = straightWinCode(tempCards); if (straightWinCode != null) { winCode = winCode + "D" + straightWinCode.substring(2,3); return winCode; } else { return null; } } else if (heartBucket.length() > 4) { Card[] tempCards = new Card[heartBucket.length()]; for (int i = 0 ; i < heartBucket.length() ; i++) { tempCards[i] = new Card("H" + heartBucket.substring(i,i+1)); } String straightWinCode = straightWinCode(tempCards); if (straightWinCode != null) { winCode = winCode + "H" + straightWinCode.substring(2,3); return winCode; } else { return null; } } else { return null; } } public static String fourKindWinCode(Card[] cards) { if (cards.length < 4) { return null; } String winCode = "8|"; SortHand.sort(cards); String quadValue = null; for (int i = 0 ; i < cards.length ; i++) { if ((i < cards.length - 3)&&(cards[i].isSameValue(cards[i+1]))&&(cards[i].isSameValue(cards[i+2]))&&(cards[i].isSameValue(cards[i+3]))) { quadValue = cards[i].getValue(); break; } } if (quadValue != null) { Card[] tempCards = SortHand.removeFirstQuad(cards); winCode = winCode + quadValue; for (int i = 0 ; i < tempCards.length ; i++) { if (i > 0) break; winCode = winCode + tempCards[i].getValue(); } return winCode; } else { return null; } } public static String fullHouseWinCode(Card[] cards) { if (cards.length < 5) { return null; } String winCode = "7|"; SortHand.sort(cards); Card[] tempCards; if (HandAnalyzer.threeKindWinCode(cards) != null) { winCode = winCode + HandAnalyzer.threeKindWinCode(cards).substring(2,3); tempCards = SortHand.removeFirstTrip(cards); if (HandAnalyzer.pairWinCode(tempCards) != null) { winCode = winCode + HandAnalyzer.pairWinCode(tempCards).substring(2,3); SortHand.sort(tempCards); return winCode; } else { return null; } } else { return null; } } public static String flushWinCode(Card[] cards) { if (cards.length < 5) { return null; } String winCode = "6"; String clubBucket = ""; String spadeBucket = ""; String diamondBucket = ""; String heartBucket = ""; SortHand.sort(cards); for (int i = 0 ; i < cards.length ; i++) { if (cards[i].getSuit().equals("C")) { clubBucket = clubBucket + cards[i].getValue(); } else if (cards[i].getSuit().equals("S")) { spadeBucket = spadeBucket + cards[i].getValue(); } else if (cards[i].getSuit().equals("D")) { diamondBucket = diamondBucket + cards[i].getValue(); } else if (cards[i].getSuit().equals("H")) { heartBucket = heartBucket + cards[i].getValue(); } } if (clubBucket.length() > 4) { winCode = winCode + "C" + clubBucket.substring(0,5); return winCode; } else if (spadeBucket.length() > 4) { winCode = winCode + "S" + spadeBucket.substring(0,5); return winCode; } else if (diamondBucket.length() > 4) { winCode = winCode + "D" + diamondBucket.substring(0,5); return winCode; } else if (heartBucket.length() > 4) { winCode = winCode + "H" + heartBucket.substring(0,5); return winCode; } else { return null; } } public static String straightWinCode(Card[] cards) { if (cards.length < 5) { return null; } String winCode = "5|"; SortHand.sort(cards); int countCombo = 0; String currentHighOfStraight = ""; for (int i = 0 ; i < cards.length - 1 ; i++) { if (countCombo > 3) { break; } if (cards[i].isNextCardBelow(cards[i+1])) { if (countCombo == 0) { currentHighOfStraight = cards[i].getValue(); } countCombo++; } else if (cards[i].getValueInt() == cards[i+1].getValueInt()) { continue; } else { countCombo = 0; } } if (countCombo > 3) { winCode = winCode + currentHighOfStraight; return winCode; } else { return straightWinCode_aceProvision(cards); } } public static String straightWinCode_aceProvision(Card[] cards) { if (cards.length < 5) { return null; } String winCode = "4|"; SortHand.sort_aceProvision(cards); int countCombo = 0; String currentHighOfStraight = ""; for (int i = 0 ; i < cards.length - 1 ; i++) { if (countCombo > 3) { break; } if (cards[i].isNextCardBelow(cards[i+1])) { if (countCombo == 0) { currentHighOfStraight = cards[i].getValue(); } countCombo++; } else if (cards[i].getValueInt() == cards[i+1].getValueInt()) { continue; } else { countCombo = 0; } } if (countCombo > 3) { winCode = winCode + currentHighOfStraight; return winCode; } else { return null; } } public static String threeKindWinCode(Card[] cards) { if (cards.length < 3) { return null; } String winCode = "3|"; SortHand.sort(cards); String tripValue = null; for (int i = 0 ; i < cards.length ; i++) { if ((i < cards.length - 2)&&(cards[i].isSameValue(cards[i+1]))&&(cards[i].isSameValue(cards[i+2]))) { tripValue = cards[i].getValue(); break; } } if (tripValue != null) { Card[] tempCards = SortHand.removeFirstTrip(cards); winCode = winCode + tripValue; for (int i = 0 ; i < tempCards.length ; i++) { if (i > 1) break; winCode = winCode + tempCards[i].getValue(); } return winCode; } else { return null; } } public static String twoPairWinCode(Card[] cards) { if (cards.length < 4) { return null; } String winCode = "2|"; SortHand.sort(cards); Card[] tempCards; if (HandAnalyzer.pairWinCode(cards) != null) { winCode = winCode + HandAnalyzer.pairWinCode(cards).substring(2,3); tempCards = SortHand.removeFirstPair(cards); if (HandAnalyzer.pairWinCode(tempCards) != null) { winCode = winCode + HandAnalyzer.pairWinCode(tempCards).substring(2,3); SortHand.sort(tempCards); tempCards = SortHand.removeFirstPair(tempCards); for (int i = 0 ; i < tempCards.length ; i++) { if (i > 0) break; winCode = winCode + tempCards[i].getValue(); } return winCode; } else { return null; } } else { return null; } } public static String pairWinCode(Card[] cards) { if (cards.length < 2) { return null; } String winCode = "1|"; SortHand.sort(cards); String pairValue = null; for (int i = 0 ; i < cards.length ; i++) { if ((i < cards.length - 1)&&(cards[i].isSameValue(cards[i+1]))) { pairValue = cards[i].getValue(); break; } } if (pairValue != null) { Card[] tempCards = SortHand.removeFirstPair(cards); winCode = winCode + pairValue; for (int i = 0 ; i < tempCards.length ; i++) { if (i > 2) break; winCode = winCode + tempCards[i].getValue(); } return winCode; } else { return null; } } public static String highCardWinCode(Card[] cards) { String winCode = "0|"; SortHand.sort(cards); for (int i = 0 ; i < cards.length ; i++) { if (i > 4) break; winCode = winCode + cards[i].getValue(); } return winCode; } public static void main(String[] args) { Card[] cards = new Card[5]; cards[0] = new Card("D5"); cards[1] = new Card("D4"); cards[2] = new Card("D3"); cards[3] = new Card("D2"); cards[4] = new Card("DA"); //cards[5] = new Card("H2"); //cards[6] = new Card("DA"); // System.out.println(HandAnalyzer.highCardWinCode(cards)); // System.out.println(HandAnalyzer.pairWinCode(cards)); // System.out.println(HandAnalyzer.twoPairWinCode(cards)); // System.out.println(HandAnalyzer.threeKindWinCode(cards)); // System.out.println(HandAnalyzer.straightWinCode(cards)); // System.out.println(HandAnalyzer.flushWinCode(cards)); // System.out.println(HandAnalyzer.fullHouseWinCode(cards)); // System.out.println(HandAnalyzer.fourKindWinCode(cards)); // System.out.println(HandAnalyzer.straightFlushWinCode(cards)); System.out.println(HandAnalyzer.getWinCode(cards)); } }