Exemplo n.º 1
0
        /** 获得单张的个数,对子的个数,三张的个数,4张的个数 */

        public static CardCount GetCardCount(List <Card> list)
        {
            CardCount cardIndex = new CardCount();

            int[] count = AnalyzeCards(list);
            for (int i = 0; i < 15; ++i)
            {
                int v = count[i];
                if (v == 0)
                {
                    continue;
                }
                if (v > 4)
                {
                    v = 4;
                }
                cardIndex.a[v - 1].Add(i + 3); //card's weight
            }
            return(cardIndex);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 从服务器端copy的卡牌类型判断方法
        /// </summary>
        /// <param name="list"></param>
        /// <param name="orgCdsLen">原始牌组长度</param>
        /// <returns></returns>
        static CardTypeResult GetCardTypeResult(List <Card> list, int orgCdsLen)
        {
            int len = list.Count;

            if (len == 0)
            {
                //			GameUtil.logError("landlord getCardType error,len is 0",0);
                return(null);
            }
            int first = list[0].getWeight();
            int last  = list[len - 1].getWeight();

            if (len <= 4)
            {
                if (first == last)
                {
                    if (len == 1)
                    {
                        return(new CardTypeResult(CardType.C1, first));
                    }
                    else if (len == 2)
                    {
                        return(new CardTypeResult(CardType.C2, first));
                    }
                    else if (len == 3)
                    {
                        return(new CardTypeResult(CardType.C3, first));
                    }
                    else
                    {
                        return(new CardTypeResult(CardType.C4, first));
                    }
                }
                else
                {
                    if (len == 2 && first > 15 && last > 15)
                    {
                        return(new CardTypeResult(CardType.C42, first));
                    }
                    else if (len == 4)
                    {
                        int second = list[1].getWeight();
                        int third  = list[2].getWeight();
                        if (second == third && (first == second || third == last))
                        {
                            return(new CardTypeResult(CardType.C31, second));
                        }
                    }
                }
            }
            else
            {
                CardCount  ci   = GetCardCount(list);
                List <int> arr0 = ci.a[0];
                List <int> arr1 = ci.a[1];
                List <int> arr2 = ci.a[2];
                List <int> arr3 = ci.a[3];
                //超级炸弹
                if (len == 5 && first == last)
                {
                    return(new CardTypeResult(CardType.C5, first));
                }
                // 链子
                if (arr0.Count == len && IsSequenceArr(arr0))
                {
                    return(new CardTypeResult(CardType.C123, last));
                }

                // 连对
                if (arr1.Count * 2 == len && IsSequenceArr(arr1))
                {
                    return(new CardTypeResult(CardType.C1122, last));
                }

                // 3带一对
                if (arr2.Count == 1 && len == 5 && arr1.Count == 1)
                {
                    return(new CardTypeResult(CardType.C32, arr2[0]));
                }

                // 4带2
                if (arr3.Count == 1 && len == 6)
                {
                    return(new CardTypeResult(CardType.C411, arr3[0]));
                }

                // 4带2对
                if (arr3.Count == 1 && arr1.Count == 2 && len == 8)
                {
                    return(new CardTypeResult(CardType.C411, arr3[0]));
                }

                // 分析飞机
                int arr2Count = arr2.Count;
                if (arr2Count > 0)
                {
                    //如果是三顺 存在类似 333,444,555,777 这样的飞机带单排的情况和 333,555,666,777,888,带1张单牌的 两种特殊情况
                    if (!IsSequenceArr(arr2) && (arr2Count == 4 || arr2Count == 5))
                    {
                        var listTemp = new List <int>();
                        //去头
                        for (int i = 1; i < arr2Count; i++)
                        {
                            listTemp.Add(arr2[i]);
                        }
                        if (IsSequenceArr(listTemp))
                        {
                            if (arr2Count == 4 && (arr0.Count + arr1.Count + arr3.Count) == 0)
                            {
                                return(new CardTypeResult(CardType.C11122234, arr2[arr2Count - 1], ci));
                            }

                            //如果是4组连三, 那必须是带一组3张 和 1个1张的组合组成 飞机带单张
                            if (arr2Count == 5)
                            {
                                if (arr0.Count == 1 && (arr1.Count + arr3.Count == 0))
                                {
                                    return(new CardTypeResult(CardType.C11122234, arr2[arr2Count - 1], ci));
                                }
                            }
                        }


                        //去尾
                        listTemp.Clear();
                        for (int i = 0; i < arr2Count - 1; i++)
                        {
                            listTemp.Add(arr2[i]);
                        }
                        if (IsSequenceArr(listTemp))
                        {
                            if (arr2Count == 4 && (arr0.Count + arr1.Count + arr3.Count) == 0)
                            {
                                return(new CardTypeResult(CardType.C11122234, arr2[arr2Count - 2], ci));
                            }

                            //如果是4组连三, 那必须是带一组3张 和 1个1张的组合组成 飞机带单张
                            if (arr2Count == 5)
                            {
                                if (arr0.Count == 1 && (arr1.Count + arr3.Count == 0))
                                {
                                    return(new CardTypeResult(CardType.C11122234, arr2[arr2Count - 2], ci));
                                }
                            }
                        }


                        /*
                         *          //start--------------这组代码包括了 可以提取中间有顺三的情况,但实际上如果最多20张牌的话不存在中间有顺三,头尾单出2组3张的情况-------类似:333,555,666,777,999------------------------------------
                         *
                         * bool hasfindShun = false;
                         * int starti = 0;
                         * var testList = new List<int>();
                         * while (starti < count)
                         * {
                         *  int tail = count;
                         *  while (tail > starti + 1)
                         *  {
                         *
                         *      for (int i = starti; i < tail; i++)
                         *      {
                         *          testList.Add(arr2[i]);
                         *      }
                         *
                         *      if (isSequenceArr(testList))
                         *      {
                         *
                         *          if (tail - starti == count - 1)
                         *          {
                         *
                         *
                         *          }
                         *
                         *          hasfindShun = true;
                         *          break;
                         *      }
                         *      tail--;
                         *      testList.Clear();
                         *  }
                         *
                         *  if (hasfindShun) break;
                         *  starti++;
                         * }*/
                        //--------------------------------------------------------------------------end
                    }
                    else if (IsSequenceArr(arr2))
                    {
                        if (arr2Count * 3 == len)
                        {
                            return(new CardTypeResult(CardType.C111222, arr2[arr2Count - 1], ci));
                        }

                        if (arr0.Count + arr1.Count * 2 + arr3.Count * 4 == arr2Count)
                        {
                            return(new CardTypeResult(CardType.C11122234, arr2[arr2Count - 1], ci));
                        }

                        if (arr1.Count + arr3.Count * 2 == arr2Count && arr0.Count == 0)
                        {
                            return(new CardTypeResult(CardType.C1112223344, arr2[arr2Count - 1], ci));
                        }
                    }
                }

                //只有炸弹不让出牌
                if (arr3.Count > 1)
                {
                    return(null);
                }

                //如果上面没分析出飞机,则进一步吧炸弹拆成3张的,分析飞机带单牌
                if (arr3.Count > 0)
                {
                    var threeCdsList = new List <int>();
                    threeCdsList.AddRange(arr2);
                    threeCdsList.AddRange(arr3);

                    var threeGpList = AnalyAllPartOfShun(threeCdsList.ToArray(), 2);

                    if (threeGpList.Select(cds => cds.Length).Any(cdsLen => cdsLen == orgCdsLen - cdsLen * 3))
                    {
                        var maxcard     = arr2[arr2Count - 1];      //3张同牌最大的牌面值 (不含花色)
                        int arr3MaxCard = arr3[arr3.Count - 1];     //4张同牌最大的牌面值 (不含花色)
                        if (arr3MaxCard > maxcard)
                        {
                            maxcard = arr3MaxCard;
                        }
                        return(new CardTypeResult(CardType.C11122234, maxcard, ci));
                    }
                }
            }
            return(null);
        }
Exemplo n.º 3
0
 public void setCi(CardCount ci)
 {
     this.ci = ci;
 }
Exemplo n.º 4
0
        private CardCount ci; //当前只有飞机牌型此值有效

        public CardTypeResult(CardType type, int value, CardCount ci = null)
        {
            this.type  = type;
            this.value = value;
            this.ci    = ci;
        }