private bool isTwoPair(HandInfo hi, out FullRank fRank, out HandCard[] hcsRank, out HandCard[] hcsFill) { // Note: In the presence of wild cards, any hand with two pair // would also have a higher rank (e.g., 3 of a kind). FullRank fRank1; HandCard[] hcsRank1; HandCard[] hcsFill1; if (!isKindN(hi, out fRank1, out hcsRank1, out hcsFill1, 2, 0)) { setToNull(out fRank, out hcsRank, out hcsFill); return false; } TValue value1 = fRank1.Values[0]; FullRank fRank2; HandCard[] hcsRank2; HandInfo hi2 = new HandInfo(new Hand(hi.CardsAll.Except(hcsRank1)), hi.WildCards()); if (!isKindN(hi2, out fRank2, out hcsRank2, out hcsFill, 2, NumCardsInFinalHand - 4)) { setToNull(out fRank, out hcsRank, out hcsFill); return false; } TValue value2 = fRank2.Values[0]; TValue[] fillValues = hcsFill .Select(hc => hc.TamedValue == TValue.NoValue ? hc.Value : hc.TamedValue) .ToArray(); IEnumerable<TValue> vals = Util.PairEnumerable(value1, value2).Concat(fillValues); fRank = new FullRank(SimpleRank.TwoPair, vals); hcsRank = hcsRank1.Concat(hcsRank2).ToArray(); return true; }
private bool isFullHouse(HandInfo hi, out FullRank fRank, out HandCard[] hcsRank, out HandCard[] hcsFill) { FullRank fRankTrio; HandCard[] hcsRankTrio; HandCard[] hcsFillTrio; if (!isKindN(hi, out fRankTrio, out hcsRankTrio, out hcsFillTrio, 3, 0)) { setToNull(out fRank, out hcsRank, out hcsFill); return false; } TValue trioValue = fRankTrio.Values[0]; FullRank fRankPair; HandCard[] hcsRankPair; HandInfo hi2 = new HandInfo(new Hand(hi.CardsAll.Except(hcsRankTrio)), hi.WildCards()); if (!isKindN(hi2, out fRankPair, out hcsRankPair, out hcsFill, 2, NumCardsInFinalHand - 3 - 2)) { setToNull(out fRank, out hcsRank, out hcsFill); return false; } TValue pairValue = fRankPair.Values[0]; fRank = new FullRank(SimpleRank.FullHouse, Util.PairEnumerable(trioValue, pairValue).Concat(hcsFill.Select(hc => TValue.Ace))); hcsRank = hcsRankTrio.Concat(hcsRankPair).ToArray(); return true; }