示例#1
0
            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);
            }
示例#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);
            }
        }
示例#3
0
        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);
        }
示例#4
0
        /// <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);
                }
            }
        }