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; }
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; }
public int Straight(Hand h) { if (h.Consecutive()) { return (int)h.Cards.OrderByDescending(c => (int)c.Value).First().Value; } return 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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; } }