public CnList GetEqualTo(int count, bool sort, bool isResetCount) { CnList ret = new CnList(); foreach (CnItem item in this) { if (isResetCount) { item.ResetCount(); } if (item.Count == count) { //排序 if (sort) { item.SortCards(); } ret.Add(item); } } if (sort && ret.Count > 1) { ret.Sort((i1, i2) => { for (int i = 0; i < count; i++) { int val1 = GetValue(i1.Cards[i]); int val2 = GetValue(i2.Cards[i]); if (val1 - val2 != 0) { return(-(val1 - val2)); } } return(0); }); } return(ret); }
//help public void SetTreeNode(List <int> cards, TreeNode treeNode, int deep) { if (deep > 3) { return; } int cardNum = deep == 3 ? 3 : 5; CnList cnList = new CnList(cards); VnList vnList = new VnList(cards); CnList cn5 = cnList.GetMoreThan(5, true, false); VnList vn2 = vnList.GetMoreThan(2, true); //如果没有关系的牌(有多个 或者 连续) 能组成任何牌型 后面的就不需要去确认别的牌 bool isCheckType = true; //bool isTongHuaShun = false; //同花顺 if (treeNode.Dun.CardType - CardType.tonghuashun >= 0 && deep <= 2) { if (cn5.Count > 0) { foreach (CnItem item in cn5) { List <SssDun> shunzi = new List <SssDun>(); if (CheckShunZi(item.Cards, shunzi, 5, true) && !CheckContainCard(vn2, shunzi, shunzi.Count - 1)) { isCheckType = false; } if (shunzi.Count > 0) { foreach (SssDun dun in shunzi) { AddDunToTree(cards, treeNode, dun, deep + 1); } break; } } } } //铁支 if (isCheckType && treeNode.Dun.CardType - CardType.tiezhi >= 0 && deep <= 2) { VnList vn4 = vnList.GetEqual(4, true); if (vn4.Count > 0) { foreach (VnItem item in vn4) { SssDun dun = new SssDun { CardType = CardType.tiezhi, Cards = vn4[0].Cards }; dun.Cards.Add(0); AddDunToTree(cards, treeNode, dun, deep + 1); if (!CheckLianXu(vnList, item.Cards[0])) { isCheckType = false; break; } } } } VnList vn3 = vnList.GetMoreThan(3, true); //葫芦 if (isCheckType && treeNode.Dun.CardType - CardType.hulu >= 0 && deep <= 2) { if (vn3.Count > 0 && vn2.Count > 0) { foreach (VnItem item3 in vn3) { foreach (VnItem item2 in vn2) { if (item3.Val == item2.Val) { continue; } SssDun dun = new SssDun { CardType = CardType.hulu, Cards = new List <int>(item3.Cards.GetRange(0, 3)) }; dun.Cards.AddRange(item2.Cards.GetRange(0, 2)); AddDunToTree(cards, treeNode, dun, deep + 1); } } } } //同花 if (isCheckType && treeNode.Dun.CardType - CardType.tonghua >= 0 && deep <= 2) { if (cn5.Count > 0) { //截取最前面的5个位最大的5个 //int loopcount while (cn5.Count > 0) { List <int> subCards = cn5[0].Cards.GetRange(0, 5); SssDun dun = new SssDun { CardType = CardType.tonghua, Cards = new List <int>(subCards) }; //如果当前牌型不是同花顺 if (CheckCardType(dun.Cards, false) != CardType.tonghuashun) { AddDunToTree(cards, treeNode, dun, deep + 1); int index = vn2.ContainsValues(dun.Cards); if (index != -1) { cn5[0].Cards.RemoveRange(0, 5); cn5 = cn5.GetMoreThan(5, true, true); } else { isCheckType = false; break; } } else { //移除 牌中最小的那个牌 然后重新确认cn5 cn5[0].Cards.Remove(dun.Cards[dun.Cards.Count - 1]); cn5 = cn5.GetMoreThan(5, true, true); } } } } //顺子 if (isCheckType && treeNode.Dun.CardType - CardType.shunzi >= 0 && deep <= 2) { List <SssDun> shunzi = new List <SssDun>(); if (CheckShunZi(cards, shunzi, 5, false) && !CheckContainCard(vn2, shunzi, shunzi.Count - 1)) { isCheckType = false; } if (shunzi.Count > 0) { foreach (SssDun dun in shunzi) { if (CheckCardType(dun.Cards, false) != CardType.tonghuashun) { AddDunToTree(cards, treeNode, dun, deep + 1); } } } } //三条 if (isCheckType && treeNode.Dun.CardType - CardType.shunzi >= 0) { if (vn3.Count > 0) { SssDun dun = new SssDun { CardType = CardType.santiao, Cards = new List <int>(vn3[0].Cards.GetRange(0, 3)) }; if (cardNum == 5) { dun.Cards.Add(0); dun.Cards.Add(0); } AddDunToTree(cards, treeNode, dun, deep + 1); isCheckType = false; } } //两对 if (isCheckType && treeNode.Dun.CardType - CardType.liangdui >= 0 && deep <= 2) { if (vn2.Count > 1) { SssDun dun = new SssDun { CardType = CardType.liangdui, Cards = vn2[0].Cards.GetRange(0, 2) }; dun.Cards.AddRange(vn2[1].Cards.GetRange(0, 2)); dun.Cards.Add(0); AddDunToTree(cards, treeNode, dun, deep + 1); } } //对子 if (isCheckType && treeNode.Dun.CardType - CardType.yidui >= 0) { if (vn2.Count > 0) { SssDun dun = new SssDun { CardType = CardType.yidui, Cards = vn2[0].Cards.GetRange(0, vn2[0].Cards.Count) }; if (cardNum == 5) { dun.Cards.Add(0); dun.Cards.Add(0); } dun.Cards.Add(0); AddDunToTree(cards, treeNode, dun, deep + 1); isCheckType = false; } } //散牌 if (isCheckType) { cardNum = cardNum > cards.Count ? cards.Count : cardNum; SssDun dun = new SssDun { CardType = CardType.sanpai, Cards = new List <int>(cards.GetRange(0, cardNum)) }; AddDunToTree(cards, treeNode, dun, deep + 1); } }
protected bool checkSanTongHua(PlayerDuns pDun, List <int> allCards) { CnList cnList = new CnList(allCards); if (cnList.Count == 3) { CnList list3 = cnList.GetEqualTo(3, true, true); CnList list5 = cnList.GetEqualTo(5, true, true); if (list3.Count == 1 && list5.Count == 2) { pDun.Duns[0].Cards.Clear(); pDun.Duns[0].Cards.AddRange(list3[0].Cards); pDun.Duns[1].Cards.Clear(); pDun.Duns[1].Cards.AddRange(list5[0].Cards); pDun.Duns[2].Cards.Clear(); pDun.Duns[2].Cards.AddRange(list5[1].Cards); return(true); } } else if (cnList.Count == 2) { CnList list3 = cnList.GetEqualTo(3, true, true); if (list3.Count == 1) { CnList list10 = cnList.GetEqualTo(10, true, true); if (list10.Count == 1) { pDun.Duns[0].Cards.Clear(); pDun.Duns[0].Cards.AddRange(list3[0].Cards); pDun.Duns[1].Cards.Clear(); pDun.Duns[1].Cards.AddRange(list10[0].Cards.GetRange(5, 5)); pDun.Duns[2].Cards.Clear(); pDun.Duns[2].Cards.AddRange(list10[0].Cards.GetRange(0, 5)); return(true); } } else if (list3.Count == 0) { CnList list5 = cnList.GetEqualTo(5, true, true); CnList list8 = cnList.GetEqualTo(8, true, true); if (list5.Count == 1 && list8.Count == 1) { pDun.Duns[0].Cards.Clear(); pDun.Duns[1].Cards.Clear(); pDun.Duns[2].Cards.Clear(); pDun.Duns[0].Cards.AddRange(list8[0].Cards.GetRange(0, 3)); List <int> list8_5 = list8[0].Cards.GetRange(3, 5); List <List <int> > sort = new List <List <int> >(); sort.Add(list8_5); sort.Add(list5[0].Cards); sort.Sort((o1, o2) => { for (int i = 0; i < o1.Count; i++) { int o1val = GetValue(o1[i]); int o2val = GetValue(o2[i]); if (o1val - o2val != 0) { return(o1val - o2val); } } for (int i = 0; i < o1.Count; i++) { int o1val = GetColor(o1[i]); int o2val = GetColor(o2[i]); if (o1val - o2val != 0) { return(o1val - o2val); } } return(0); }); pDun.Duns[1].Cards.AddRange(sort[0]); pDun.Duns[2].Cards.AddRange(sort[1]); return(true); } } } else if (cnList.Count == 1) { return(true); } return(false); }
/// <summary> /// 获取特殊牌型 /// </summary> /// <param name="cards"></param> /// <param name="dunsOut"></param> public void GetSpecialCardType(List <int> cards, List <PlayerDuns> dunsOut) { CardType type = CheckCardType(cards, true); VnList vnList = new VnList(cards); CnList cnList = new CnList(cards); List <int> cardValues = vnList.GetValues(); SssGameData gData = App.GetGameData <SssGameData>(); bool isJ_A = true; bool is8_k = true; bool is2_8 = true; foreach (int card in cardValues) { int val = GetValue(card); if (val < 11) { isJ_A = false; } if (val < 8) { is8_k = false; } if (val > 8) { is2_8 = false; } if (!isJ_A && !is8_k && !is2_8) { break; } } PlayerDuns pDun = new PlayerDuns { Special = CardType.none, Duns = dunsOut[0].Duns }; if (type == CardType.tonghuashun && gData.IsAllowSpecialType((int)CardType.tonghuashisanshui)) { pDun.Special = CardType.tonghuashisanshui; dunsOut.Insert(0, pDun); } else if ((type == CardType.shunzi || type == CardType.tonghuashun) && gData.IsAllowSpecialType((int)CardType.shisanshui)) { pDun.Special = CardType.shisanshui; dunsOut.Insert(0, pDun); } else if (isJ_A && gData.IsAllowSpecialType((int)CardType.shierhuang)) { pDun.Special = CardType.shierhuang; dunsOut.Insert(0, pDun); } else { PlayerDuns p = dunsOut[0]; CardType frist = CheckCardType(p.Duns[0].Cards, true); if (p.Duns[1].CardType == CardType.tonghuashun && p.Duns[2].CardType == CardType.tonghuashun && frist == CardType.tonghuashun && gData.IsAllowSpecialType((int)CardType.santonghuashun)) { pDun.Special = CardType.santonghuashun; dunsOut.Insert(0, pDun); } else if (vnList.GetMoreThan(4, false).Count >= 3 && gData.IsAllowSpecialType((int)CardType.santonghuashun)) { pDun.Special = CardType.santonghuashun; dunsOut.Insert(0, pDun); } else if (is8_k && gData.IsAllowSpecialType((int)CardType.quanda)) { pDun.Special = CardType.quanda; dunsOut.Insert(0, pDun); } else if (is2_8 && gData.IsAllowSpecialType((int)CardType.quanxiao)) { pDun.Special = CardType.quanxiao; dunsOut.Insert(0, pDun); } else if (cnList.Count == 2 && Mathf.Abs(cnList[0].Color - cnList[1].Color) == 0x10 && gData.IsAllowSpecialType((int)CardType.couyise)) { pDun.Special = CardType.couyise; dunsOut.Insert(0, pDun); } else if (vnList.GetMoreThan(3, false).Count >= 4 && gData.IsAllowSpecialType((int)CardType.sitiaosan)) { pDun.Special = CardType.sitiaosan; dunsOut.Insert(0, pDun); } else if (vnList.GetMoreThan(2, false).Count >= 6 && vnList.GetMoreThan(3, false).Count >= 1 && gData.IsAllowSpecialType((int)CardType.wuduisan)) { pDun.Special = CardType.wuduisan; dunsOut.Insert(0, pDun); } else if (vnList.GetMoreThan(2, false).Count >= 6 && gData.IsAllowSpecialType((int)CardType.liuduiban)) { pDun.Special = CardType.liuduiban; dunsOut.Insert(0, pDun); } else if (gData.IsAllowSpecialType((int)CardType.santonghua) && checkSanTongHua(pDun, cards)) { pDun.Special = CardType.santonghua; dunsOut.Insert(0, pDun); } else if (gData.IsAllowSpecialType((int)CardType.sanshunzi) && checkSanShunZi(pDun, cards)) { pDun.Special = CardType.sanshunzi; dunsOut.Insert(0, pDun); } } }