Exemplo n.º 1
0
            public int Compare(VnList list1)
            {
                if (list1.Count != Count)
                {
                    return(0);
                }

                for (int i = 0; i < Count; i++)
                {
                    int comp = this[i].Compare(list1[i]);
                    if (comp != 0)
                    {
                        return(comp);
                    }
                    if (this[i].Val != list1[i].Val)
                    {
                        //if (i > 0)
                        //{
                        //    if (this[0].count > 2)
                        //    {
                        //        return -this[i].val.CompareTo(list1[i].val);
                        //    }
                        //    else
                        //        return this[i].val.CompareTo(list1[i].val);
                        //}
                        return(this[i].Val.CompareTo(list1[i].Val));
                    }
                }
                return(0);
            }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
0
        public bool CheckLianXu(VnList list, int card)
        {
            for (int i = card - 2; i <= card + 2; i++)
            {
                if (!list.ContainsValue(i))
                {
                    return(false);
                }
            }

            return(true);
        }
Exemplo n.º 4
0
 /// <summary>
 /// 与其他SssDun比较大小
 /// </summary>
 /// <param name="dun"></param>
 /// <returns></returns>
 public int CompareLine(SssDun dun)
 {
     if (CardType != dun.CardType)
     {
         return(CardType - dun.CardType);
     }
     else
     {
         VnList list1 = new VnList(Cards);
         VnList list2 = new VnList(dun.Cards);
         return(list1.CompareLine(list2));
     }
 }
Exemplo n.º 5
0
            public VnList GetMoreThan(int count, bool sort)
            {
                VnList list = new VnList();

                foreach (VnItem item in this)
                {
                    if (item.Count >= count)
                    {
                        list.Add(item);
                    }
                }
                if (sort && list.Count > 1)
                {
                    list.Sort((o1, o2) => o2.Val - o1.Val);
                }
                return(list);
            }
Exemplo n.º 6
0
            public VnList GetEqual(int count, bool sort)
            {
                VnList list = new VnList();

                foreach (VnItem item in this)
                {
                    if (item.Count == count)
                    {
                        list.Add(item);
                    }
                }
                if (sort && list.Count > 0)
                {
                    list.SortByNum();
                }

                return(list);
            }
Exemplo n.º 7
0
            public int CompareLine(VnList list1)
            {
                if (list1.Count != Count)
                {
                    return(0);
                }

                for (int i = 0; i < Count; i++)
                {
                    int comp = this[i].Compare(list1[i]);
                    if (comp != 0)
                    {
                        return(comp);
                    }
                    else if (this[i].Val - list1[i].Val != 0)
                    {
                        int val1 = this[i].Val == 1 ? 14 : this[i].Val;     //如果是A,改为14
                        int val2 = list1[i].Val == 1 ? 14 : list1[i].Val;   //如果是A,改为14

                        return(val1 - val2);
                    }
                }
                return(0);
            }
Exemplo n.º 8
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);
            }
        }
Exemplo n.º 9
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);
                }
            }
        }