Exemple #1
0
        /// <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);
        }
Exemple #2
0
        //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);
            }
        }