/** 获得单张的个数,对子的个数,三张的个数,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); }
/// <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); }
public void setCi(CardCount ci) { this.ci = ci; }
private CardCount ci; //当前只有飞机牌型此值有效 public CardTypeResult(CardType type, int value, CardCount ci = null) { this.type = type; this.value = value; this.ci = ci; }