private static void find(CardRank rank, ref Card[] cards, ref CardRankDictionary result) { if (cards.Length < cardsNum[Convert.ToInt32(rank)]) { return; } Card[] foundCards = new Card[cardsNum[Convert.ToInt32(rank)]]; int found = 0; findRecursive(rank, ref cards, 0, ref foundCards, found, ref result); }
public static CardRank GetCardRank(ref uint[] cards) { Card[] sortCards = new Card[cards.Length]; for (int i = 0; i < cards.Length; i++) { sortCards[i] = new Card(cards[i]); } Array.Sort(sortCards); CardRankDictionary ret = new CardRankDictionary(); for (CardRank rank = CardRank.StraightFlush; rank > CardRank.HighCard; rank--) { find(rank, ref sortCards, ref ret); if (ret.Count > 0) { var c = ret[rank].First <uint[]>(); if (c.Length == cards.Length) { cards = c; } else { var diff = new uint[cards.Length - c.Length]; int i = 0; foreach (var card in cards) { if (Array.IndexOf(c, card) == -1) { diff[i++] = card; } if (i >= diff.Length) { break; } } Array.Copy(c, cards, c.Length); Array.Copy(diff, 0, cards, c.Length, diff.Length); } return(rank); } } for (int j = 0; j < sortCards.Length; j++) { cards[j] = sortCards[j].CardValue(); } return(CardRank.HighCard); }
public static CardRankDictionary Find(uint[] cards) { Card[] sortCards = new Card[cards.Length]; for (int i = 0; i < cards.Length; i++) { sortCards[i] = new Card(cards[i]); } Array.Sort(sortCards); CardRankDictionary ret = new CardRankDictionary(); for (CardRank rank = CardRank.StraightFlush; rank > CardRank.HighCard; rank--) { find(rank, ref sortCards, ref ret); } return(ret); }
private static void findRecursive(CardRank rank, ref Card[] cards, int pos, ref Card[] foundCards, int found, ref CardRankDictionary result) { for (int i = pos; i < cards.Length; i++) { Card card = cards[i]; foundCards[found] = card; if (!match(rank, ref foundCards, found + 1)) { continue; } if (found + 1 == cardsNum[Convert.ToInt32(rank)]) { // save to result List <uint[]> l; uint[] saveCards = new uint[foundCards.Length]; for (int j = 0; j < foundCards.Length; j++) { saveCards[j] = foundCards[j].CardValue(); } if (result.TryGetValue(rank, out l)) { l.Add(saveCards); } else { l = new List <uint[]>(); l.Add(saveCards); result[rank] = l; } continue; } findRecursive(rank, ref cards, i + 1, ref foundCards, found + 1, ref result); } }