Пример #1
0
        private static bool GetWinner(HandPattern p1, HandPattern p2)
        {
            if (p1.Pattern != p2.Pattern)
            {
                return(p1.Pattern > p2.Pattern);
            }
            else
            {
                for (int i = 0; i < 5; i++)
                {
                    if (p1.Max[i] != p2.Max[i])
                    {
                        return(p1.Max[i] > p2.Max[i]);
                    }
                }

                return(false);
            }
        }
Пример #2
0
        private static HandPattern GetHandPattern(IEnumerable <string> pokers)
        {
            HandPattern result = new HandPattern();

            int[] values = pokers.Select(p =>
            {
                string value = p[0].ToString();
                if (!int.TryParse(value, out int count))
                {
                    count = value switch
                    {
                        "T" => 10,
                        "J" => 11,
                        "Q" => 12,
                        "K" => 13,
                        "A" => 14,
                        _ => 0,
                    };
                }

                return(count);
            }
                                         ).ToArray();
            Array.Sort(values);
            values = values.Reverse().ToArray();

            if (pokers.Select(p => p[1]).Distinct().Count() == 1)
            {
                if (values[0] - values[4] == 4)
                {
                    if (values[0] == 14)
                    {
                        result.Pattern = Pattern.RoyalFlush;
                    }
                    else
                    {
                        result.Pattern = Pattern.StraightFlush;
                    }
                }
                else
                {
                    result.Pattern = Pattern.Flush;
                }

                result.Max = values;
            }
            else
            {
                if (values.Distinct().Count() == 5)
                {
                    if (values[0] - values[4] == 4)
                    {
                        result.Pattern = Pattern.Straight;
                        result.Max     = values;
                    }
                    else
                    {
                        result.Pattern = Pattern.HighCard;
                        result.Max     = values;
                    }
                }
                else if (values.Distinct().Count() == 4)
                {
                    result.Pattern = Pattern.OnePair;
                    int[] four = values.Distinct().ToArray();
                    int   pair = values.Sum() - four.Sum();
                    result.Max[0] = pair;
                    int[] three = values.Where(j => j != pair).ToArray();
                    result.Max[1] = three[0];
                    result.Max[2] = three[1];
                    result.Max[3] = three[2];
                }
                else if (values.Distinct().Count() == 3)
                {
                    if ((values[0] == values[1] && values[1] == values[2]) ||
                        (values[1] == values[2] && values[2] == values[3]) ||
                        (values[2] == values[3] && values[3] == values[4]))
                    {
                        result.Pattern = Pattern.ThreeKind;
                        result.Max[0]  = values[2];
                        int[] tmp = values.Where(j => j != result.Max[0]).ToArray();
                        result.Max[1] = Math.Max(tmp[0], tmp[1]);
                        result.Max[2] = Math.Min(tmp[0], tmp[1]);
                    }
                    else
                    {
                        result.Pattern = Pattern.TwoPairs;
                        int[]      dis = values.Distinct().ToArray();
                        List <int> two = new List <int>();
                        for (int i = 0; i < dis.Length; i++)
                        {
                            if (values.Where(j => j == dis[i]).Count() == 1)
                            {
                                result.Max[2] = dis[i];
                            }
                            else
                            {
                                two.Add(dis[i]);
                            }
                        }
                        result.Max[0] = Math.Max(two[0], two[1]);
                        result.Max[1] = Math.Min(two[0], two[1]);
                    }
                }
                else if (values.Distinct().Count() == 2)
                {
                    if (values[1] == values[3])
                    {
                        result.Pattern = Pattern.FourKind;
                        result.Max[0]  = values[1];
                        result.Max[1]  = values[1] == values[0] ? values[4] : values[0];
                    }
                    else
                    {
                        result.Pattern = Pattern.FullHouse;
                        result.Max[0]  = values[2];
                        result.Max[1]  = values[2] == values[0] ? values[4] : values[0];
                    }
                }
            }

            return(result);
        }