Example #1
0
 public HandCard(TValue value, TSuit suit, int index)
     : base(value, suit)
 {
     this.Index      = index;
     this.TamedValue = TValue.NoValue;
     this.TamedSuit  = TSuit.NoSuit;
 }
Example #2
0
        public Hand GetRandomFlush5(int numCardsDealt, int numCardsInFinalHand)
        {
            Ranker   ranker    = new Ranker(numCardsInFinalHand, false);
            TSuit    flushSuit = GetRandomSuit();
            Hand     hand;
            FullRank fRank;

            HandCard[] hcsRank;
            HandCard[] hcsFill;
            do
            {
                Card[] chosen = GetRandomCardsWithSuit(flushSuit, 5);
                Card[] fill   = GetRandomCards(numCardsDealt - 5).ToArray();
                fRank   = null;
                hcsRank = null;
                hcsFill = null;
                hand    = new Hand(fill.Concat(chosen));
                ranker.GetFullRank(hand, null, out fRank, out hcsRank, out hcsFill);
            } while (fRank.SRank > SimpleRank.Flush5);
            return(hand);
        }
Example #3
0
        public Hand GetRandomStraightOrStraightFlush5(int numCardsDealt, int numCardsInFinalHand, bool doRequireFlush)
        {
            Ranker   ranker = new Ranker(numCardsInFinalHand, false);
            Hand     hand;
            FullRank fRank;
            TSuit    flushSuit = GetRandomSuit();

            HandCard[] hcsRank;
            HandCard[] hcsFill;
            do
            {
                TValue maxValue = (TValue)random.Next((int)TValue.Six, (int)TValue.Ace);
                TValue minValue = maxValue.Prev(4);
                Card[] chosen   = Enumerable.Range((int)minValue, ((int)maxValue - (int)minValue) + 1)
                                  .Select(k => doRequireFlush
                            ? (new Card((TValue)k, flushSuit))
                            : GetRandomCardWithValue((TValue)k))
                                  .Reverse().ToArray();
                Card[] fill = GetRandomCards(numCardsDealt - 5).ToArray();
                hand = new Hand(fill.Concat(chosen));
                ranker.GetFullRank(hand, null, out fRank, out hcsRank, out hcsFill);
            } while (fRank.SRank > (doRequireFlush ? SimpleRank.StraightFlush5 : SimpleRank.Straight5));
            return(hand);
        }
Example #4
0
 public Card(TValue value, TSuit suit)
 {
     this.Value = value;
     this.Suit  = suit;
 }
Example #5
0
 public Card GetRandomCardWithSuit(TSuit s)
 {
     return(new Card((TValue)random.Next((int)TValue.Two, (int)TValue.Ace), s));
 }
Example #6
0
 public Card[] GetRandomCardsWithSuit(TSuit s, int n)
 {
     return(Enumerable.Range(1, n).Select(k => GetRandomCardWithSuit(s)).ToArray());
 }
Example #7
0
        private bool isStraightOrStraightFlushN(HandInfo hi, out FullRank fRank, out HandCard[] hcsRank, out HandCard[] hcsFill, bool isFlushRequired, int n)
        {
            bool   isStraight      = false;
            bool   isStraightFlush = false;
            TValue minVal          = TValue.NoValue; // Suppress compiler warning
            TValue maxVal;
            IEnumerable <IGrouping <TValue, HandCard> > valueGroups = null;
            TSuit flushSuit = TSuit.NoSuit;

            // Note: The loop could be started at Max(hcsPlain.Value) + hi.UnboundCount()
            for (maxVal = TValue.Ace;
                 maxVal >= (TValue)n; // TValue.Five
                 maxVal = maxVal.Prev())
            {
                minVal      = maxVal.Prev(n - 1);
                valueGroups = hi.CardsPlain
                              .Where(hc => (hc.Value >= minVal && hc.Value <= maxVal) || (minVal == TValue.LowAce && hc.Value == TValue.Ace))
                              .GroupBy(hc => hc.Value);
                isStraight = valueGroups.Count() >= n - hi.UnboundCount();
                if (isStraight && isFlushRequired)
                {
                    foreach (TSuit s in Card.Suits)
                    {
                        if (valueGroups.All(grp => grp.Any(hc => hc.Suit == s)))
                        {
                            flushSuit       = s;
                            isStraightFlush = true;
                            break;
                        }
                    }
                }
                if (isStraight && (isStraightFlush || !isFlushRequired))
                {
                    break;
                }
            }
            if (!isStraight || (isFlushRequired && !isStraightFlush))
            {
                setToNull(out fRank, out hcsRank, out hcsFill);
                return(false);
            }
            Func <HandCard, bool> pred = null;

            if (isFlushRequired)
            {
                pred = hc => hc.Suit == flushSuit;
            }
            IEnumerable <HandCard> hcsAvail = valueGroups.EnumerableChoice(pred);

            hcsRank = new HandCard[n];
            hcsFill = new HandCard[NumCardsInFinalHand - n];
            int             index      = 0;
            List <HandCard> hcsUnbound = new List <HandCard>(hi.CardsUnbound);    // Need random access

            for (TValue val = minVal; val <= maxVal; val = val.Next())
            {
                HandCard nextCard = hcsAvail.Where(hc => hc.Value == val).FirstOrDefault();
                if (nextCard != null)
                {
                    hcsRank[index] = nextCard;
                }
                else
                {
                    Debug.Assert(hcsUnbound.Count > 0, "Error: Not enough cards to form straight");
                    IEnumerable <HandCard> hcDesired = hcsUnbound.Where(hc => hc.Value == val).Take(1);
                    if (hcDesired.Count() > 0)
                    {
                        hcsRank[index] = hcDesired.ElementAt(0);
                        hcsUnbound.Remove(hcsRank[index]);
                    }
                    else
                    {
                        hcsRank[index] = hcsUnbound[0];
                        hcsUnbound.RemoveAt(0);
                    }
                    hcsRank[index].TamedValue = val;
                    if (isFlushRequired)
                    {
                        hcsRank[index].TamedSuit = flushSuit;
                    }
                }
                index++;
            }
            fRank = new FullRank(
                isFlushRequired
                    ? SimpleRank.StraightFlush5
                    : SimpleRank.Straight5,
                Enumerable.Range((int)minVal, ((int)maxVal - (int)minVal) + 1)
                .OrderByDescending(x => x)
                .Select(x => (TValue)x)
                .ToArray()
                );
            return(true);
        }
Example #8
0
 public static string ToText(this TSuit s)
 {
     return(toText(s));
 }
Example #9
0
 public Card GetRandomCardWithSuit(TSuit s)
 {
     return new Card((TValue)random.Next((int)TValue.Two, (int)TValue.Ace), s);
 }
Example #10
0
 public Card[] GetRandomCardsWithSuit(TSuit s, int n)
 {
     return Enumerable.Range(1, n).Select(k => GetRandomCardWithSuit(s)).ToArray();
 }