/// <summary> /// 查看数组中的牌是否在vnlist中 /// </summary> /// <param name="vnList"></param> /// <param name="dunList"></param> /// <param name="index"></param> /// <returns></returns> bool CheckContainCard(VnList vnList, List <SssDun> dunList, int index) { var list = dunList[index].Cards; int cIndex = vnList.ContainsValues(list); return(cIndex != -1); }
//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); } }