예제 #1
0
        public int Three(Hand h)
        {
            var gv = h.GroupByValue()
                .OrderByDescending(kvp => kvp.Value)
                .ThenByDescending(kvp => (int)kvp.Key)
                .ToList();

            if (gv.Count() == 3 && gv.First().Value == 3)
            {
                return D * D * (int)gv[0].Key
                    + D * (int)gv[1].Key
                    + 1 * (int)gv[2].Key;
            }

            return 0;
        }
예제 #2
0
        public static Hand Parse(string s)
        {
            var cardsString = s.Split(' ');

            var hand = new Hand();

            for (int i = 0; i < 5; i++)
            {
                hand.Cards[i] = Card.Parse(cardsString[i]);
            }

            return hand;
        }
예제 #3
0
        public int Straight(Hand h)
        {
            if (h.Consecutive())
            {
                return (int)h.Cards.OrderByDescending(c => (int)c.Value).First().Value;
            }

            return 0;
        }
예제 #4
0
        public int StraightFlush(Hand h)
        {
            if (h.SameSuit()
                && h.Consecutive())
            {
                return (int)h.Cards.Select(c => c.Value).OrderByDescending(c => c).First();
            }

            return 0;
        }
예제 #5
0
 public bool IsWin(Hand h1, Hand h2)
 {
     return (
         null
         ?? Chk(RoyalFlush, h1, h2)
         ?? Chk(StraightFlush, h1, h2)
         ?? Chk(Four, h1, h2)
         ?? Chk(FullHouse, h1, h2)
         ?? Chk(Flush, h1, h2)
         ?? Chk(Straight, h1, h2)
         ?? Chk(Three, h1, h2)
         ?? Chk(IsTwoPairs, h1, h2)
         ?? Chk(IsOnePair, h1, h2)
         ?? Chk(HighestCard, h1, h2)
         )
         .Value;
 }
예제 #6
0
        public int RoyalFlush(Hand h)
        {
            bool ss = h.SameSuit();
            bool cs = h.Consecutive();

            if (ss)
            {
                if (cs)
                {
                    if (h.ThereIs(CardValue.Ace))
                    {
                        return 1;
                    }
                }
            }

            return 0;
        }
예제 #7
0
        public int IsOnePair(Hand h)
        {
            var gv = h.GroupByValue()
                .OrderByDescending(kvp => kvp.Value)
                .ThenByDescending(kvp => (int)kvp.Key)
                .ToList();

            if (gv.Count() == 4 && gv[0].Value == 2)
            {
                return D * D * D * (int)gv[0].Key
                    + D * D * (int)gv[1].Key
                    + D * (int)gv[2].Key
                    + 1 * (int)gv[3].Key;
            }

            return 0;
        }
예제 #8
0
        public int HighestCard(Hand h)
        {
            var gv = h.GroupByValue()
                .OrderByDescending(kvp => (int)kvp.Key)
                .ToList();

            if (gv.Count() == 5)
            {
                return D * D * D * D * (int)gv[0].Key
                    + D * D * D * (int)gv[1].Key
                    + D * D * (int)gv[2].Key
                    + D * (int)gv[3].Key
                    + 1 * (int)gv[4].Key;
            }

            //throw new Exception();

            return 0;
        }
예제 #9
0
        public int FullHouse(Hand h)
        {
            var gv = h.GroupByValue()
                .OrderByDescending(kvp => kvp.Value);

            if (gv.Count() == 2 && gv.First().Value == 3)
            {
                return D * (int)gv.First().Key
                    + (int)gv.Last().Key;
            }

            return 0;
        }
예제 #10
0
        public int Flush(Hand h)
        {
            if (h.SameSuit())
            {
                int r = 0;
                int m = 1;

                var v = h.Cards.OrderBy(c => (int)c.Value).ToList();

                for (int i = 0; i < 5; i++)
                {
                    r += m * (int)v[i].Value;

                    m *= D;
                }

                return r;
            }

            return 0;
        }
예제 #11
0
        public bool? Chk(Func<Hand, int> ev, Hand h1, Hand h2)
        {
            int h1r = ev.Invoke(h1);
            int h2r = ev.Invoke(h2);

            if (h1r != 0)
            {
                (ev.Method.Name + ": " + h1.ToString() + " =" + h1r).Dump();
            }

            if (h2r != 0)
            {
                (ev.Method.Name + ": " + h2.ToString() + " =" + h2r).Dump();
            }

            if (h1r == h2r)
            {
                return null;
            } else if (h1r > h2r)
            {
                return true;
            } else
            {
                return false;
            }
        }