internal HandValue GetHandValue() { var rankGroups = Cards.GroupBy(card => card.Rank); if (rankGroups.Count() == 5) { // todo: check exotics return(new HandValue { HandType = HandType.HighCard, HighCard = Cards.Select(card => GetCardValue(card.Rank)).Max() }); } if (rankGroups.Count() == 4) { var pair = rankGroups.Single(group => group.Count() == 2); return(new HandValue { HandType = HandType.SinglePair, HighCard = GetCardValue(pair.Key) }); } // todo, todo, todo, todo, todo, toodoooo // 1. check if all cards are different // hint use grouping return(HandValue.GetEmpty()); }
internal HandValue GetHandValue() { var rankGroups = Cards.GroupBy(card => card.Rank); var suiteGroups = Cards.GroupBy(card => card.Suit); // Flush, RoyalFlush, StraightFlush. if (rankGroups.Count() == 5 && suiteGroups.Count() == 1) { var max = Cards.Select(card => GetCardValue(card.Rank)).Max(); var min = Cards.Select(card => GetCardValue(card.Rank)).Min(); var getCards = Cards.OrderBy(a => a.Rank).Select(card => GetCardValue(card.Rank)).ToList(); var streetCards = $"{getCards[0]}{getCards[1]}{getCards[2]}{getCards[3]}{getCards[4]}"; var royalCards = $"{min}{getCards[2]}{getCards[3]}{getCards[4]}{max}"; var convertToIntStreet = Convert.ToInt32(streetCards); var convertToIntRoyal = Convert.ToInt32(royalCards); if (max == 14 && min == 10) { if ((max - min) == 4) { return(new HandValue { HandType = HandType.RoyalFlush, HighCard = convertToIntRoyal }); } } if ((max - min) == 4) { return(new HandValue { HandType = HandType.StraightFlush, HighCard = convertToIntStreet }); } return(new HandValue { HandType = HandType.Flush, HighCard = Cards.Select(card => GetCardValue(card.Rank)).Max() }); } // Straight, HighCard . if (rankGroups.Count() == 5) { var max = Cards.Select(card => GetCardValue(card.Rank)).Max(); var min = Cards.Select(card => GetCardValue(card.Rank)).Min(); var getCards = Cards.OrderBy(a => a.Rank).Select(card => GetCardValue(card.Rank)).ToList(); var streetCards = $"{getCards[0]}{getCards[1]}{getCards[2]}{getCards[3]}{getCards[4]}"; var convertToInt = Convert.ToInt32(streetCards); if ((max - min) == 4) { return(new HandValue { HandType = HandType.Straight, HighCard = convertToInt }); } return(new HandValue { HandType = HandType.HighCard, HighCard = max }); } // Single Pair if (rankGroups.Count() == 4) { var pair = rankGroups.Single(group => group.Count() == 2); return(new HandValue { HandType = HandType.SinglePair, HighCard = GetCardValue(pair.Key) }); } // FullHouse, FourOfAKind if (rankGroups.Count() == 2) { var threeOfKind = rankGroups.Where(group => group.Count() == 3); var twoPair = rankGroups.Where(group => group.Count() == 2); if (threeOfKind.Count() == 1 && twoPair.Count() == 1) { int getFullHouseArray = 0; foreach (var item in threeOfKind) { getFullHouseArray = GetCardValue(item.Key); } return(new HandValue { HandType = HandType.FullHouse, HighCard = getFullHouseArray }); } else { var poker = rankGroups.Where(group => group.Count() == 4); int getKeyInArray = 0; foreach (var item in poker) { getKeyInArray = GetCardValue(item.Key); } return(new HandValue { HandType = HandType.FourOfAKind, HighCard = getKeyInArray }); } } // ThreeOfAKind, TwoPair. if (rankGroups.Count() == 3) { var threeOfKind = rankGroups.Where(group => group.Count() == 3); var twoPair = rankGroups.Where(group => group.Count() == 2).ToList(); if (twoPair.Count() == 2) { var getKeyInArrayForTwo = GetCardValue(twoPair[0].Key); var getKeyInArrayForSecondPair = GetCardValue(twoPair[1].Key); var twoPairs = $"{getKeyInArrayForTwo}{getKeyInArrayForSecondPair}"; var ConvertToInt = Convert.ToInt32(twoPairs); return(new HandValue { HandType = HandType.TwoPairs, HighCard = ConvertToInt }); } int getKeyInArray = 0; foreach (var item in threeOfKind) { getKeyInArray = GetCardValue(item.Key); } return(new HandValue { HandType = HandType.ThreeOfAKind, HighCard = getKeyInArray }); } return(HandValue.GetEmpty()); }