Ejemplo n.º 1
0
        /// <summary>
        /// 分析选中的牌,并计算出相同逻辑值牌的个数
        /// </summary>
        /// <param name="cbHandCards"></param>
        /// <param name="cbSingleCardData"></param>
        public static void GetSingleCollection(byte[] cbHandCards, ref Dictionary <byte, OutTagCard> cbSingleCardData)
        {
            byte ST_ORDER        = 0;
            byte cbHandCardCount = (byte)cbHandCards.Length;

            //short
            GameLogic.SortCardList(ref cbHandCards, cbHandCardCount, ST_ORDER);

            for (int i = 0; i < cbHandCardCount; i++)
            {
                var  tmpCard           = cbHandCards[i];
                var  tmpCardLogicValue = GameLogic.GetCardLogicValue(tmpCard);
                byte tmpCardCount      = GetCountBySpecifyCard(cbHandCards, cbHandCardCount, tmpCard);
                if (!cbSingleCardData.ContainsKey(tmpCardLogicValue))
                {
                    OutTagCard tagCard = new OutTagCard()
                    {
                        CardCount  = tmpCardCount,
                        Cards      = new byte[tmpCardCount],
                        LogicValue = tmpCardLogicValue
                    };
                    tagCard.Cards[0] = tmpCard;

                    cbSingleCardData.Add(tmpCardLogicValue, tagCard);
                }
                else
                {
                    byte[] resultCard = cbSingleCardData[tmpCardLogicValue].Cards;
                    for (int j = 0; j < resultCard.Length; j++)
                    {
                        if (resultCard[j] == 0)
                        {
                            resultCard[j] = tmpCard;
                            break;
                        }
                    }

                    cbSingleCardData[tmpCardLogicValue].Cards = resultCard;
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 智能提牌
        /// </summary>
        /// <param name="srcCard">选中的牌型</param>
        /// <param name="outResultCard">输出的牌型</param>
        public static void SmartPickupCard(byte[] srcCard, ref byte[] outResultCard)
        {
            //少于等于2张牌 原样输出
            if (srcCard.Length <= 2)
            {
                outResultCard = srcCard;
                return;
            }

            Dictionary <byte, OutTagCard> analyseCard = new Dictionary <byte, OutTagCard>();

            GetSingleCollection(srcCard, ref analyseCard);

            if (analyseCard == null || analyseCard.Count == 0)
            {
                return;
            }

            //获取所有单牌
            List <OutTagCard> singleCard = new List <OutTagCard>();

            foreach (var card in analyseCard)
            {
                if (card.Value.CardCount == 1)
                {
                    singleCard.Add(card.Value);
                }
            }

            //获取所有对子
            List <OutTagCard> pairCard = new List <OutTagCard>();

            foreach (var card in analyseCard)
            {
                if (card.Value.CardCount == 2)
                {
                    pairCard.Add(card.Value);
                }
            }

            //获取所有三张
            List <OutTagCard> threeCard = new List <OutTagCard>();

            foreach (var card in analyseCard)
            {
                if (card.Value.CardCount == 3)
                {
                    threeCard.Add(card.Value);
                }
            }


            //获取炸弹(不包括王炸)
            List <OutTagCard> bombCard = new List <OutTagCard>();

            foreach (var card in analyseCard)
            {
                if (card.Value.CardCount == 4)
                {
                    bombCard.Add(card.Value);
                }
            }

            #region 飞机
            List <ArrayList> planeCard = new List <ArrayList>();

            bool hasPlane = false;

            List <OutTagCard> greatThanThreeCards = new List <OutTagCard>();
            foreach (var card in analyseCard)
            {
                if (card.Value.CardCount >= 3 && card.Key <= 14)
                {
                    greatThanThreeCards.Add(card.Value);
                }
            }

            if (greatThanThreeCards.Count > 0)
            {
                OutTagCard otcFirstCard    = greatThanThreeCards[greatThanThreeCards.Count - 1];
                byte       bThreeFirstCard = otcFirstCard.LogicValue;

                ArrayList plane = new ArrayList();
                plane.AddRange(new byte[3]
                {
                    otcFirstCard.Cards[otcFirstCard.CardCount - 1],
                    otcFirstCard.Cards[otcFirstCard.CardCount - 2],
                    otcFirstCard.Cards[otcFirstCard.CardCount - 3]
                }
                               );

                for (int i = greatThanThreeCards.Count - 2; i >= 0; i--)
                {
                    //判断下一个元素是否存在首元素的LogicValue + 1的关系
                    bool isExists = greatThanThreeCards[i].LogicValue == bThreeFirstCard + (greatThanThreeCards.Count - i - 1);
                    if (greatThanThreeCards[i].LogicValue >= 14)
                    {
                        continue;
                    }
                    if (isExists)
                    {
                        plane.AddRange(new byte[3]
                        {
                            greatThanThreeCards[i].Cards[greatThanThreeCards[i].CardCount - 1],
                            greatThanThreeCards[i].Cards[greatThanThreeCards[i].CardCount - 2],
                            greatThanThreeCards[i].Cards[greatThanThreeCards[i].CardCount - 3]
                        });

                        hasPlane = true;
                    }
                    else
                    {
                        if (plane.Count >= 6)
                        {
                            planeCard.Add(plane);
                        }
                        //重新初始化牌,进入下一轮查询
                        plane           = new ArrayList();
                        bThreeFirstCard = greatThanThreeCards[i].LogicValue;
                    }
                }
                if (hasPlane && plane.Count >= 6)
                {
                    planeCard.Add(plane);
                }
            }
            //如果包含飞机,则检查飞机的个数
            if (hasPlane)
            {
                //飞机个数
                int planeCount = planeCard.Count;

                ArrayList resultCard = new ArrayList();
                //飞机长度
                int planeLength = planeCard[0].Count;
                resultCard.AddRange(planeCard[0].ToArray(typeof(byte)));

                //飞机个数大于1,则找到最长的飞机
                if (planeCount > 1)
                {
                    foreach (ArrayList plane in planeCard)
                    {
                        if (plane.Count > planeLength)
                        {
                            resultCard  = new ArrayList();
                            planeLength = plane.Count;
                            resultCard.AddRange(plane.ToArray(typeof(byte)));
                        }
                    }
                }

                //搭配翅膀
                int pairCount = pairCard.Count;
                //计算飞机长度
                planeLength = resultCard.Count / 3;

                if (pairCount >= planeLength)
                {
                    //查找飞机长度相等个数的最小对子
                    var myPairs = pairCard.GetRange(pairCount - planeLength, planeLength);
                    foreach (var kvPair in myPairs)
                    {
                        resultCard.AddRange(kvPair.Cards);
                    }
                }
                else
                {
                    //查找单张翅膀
                    int singleCount = singleCard.Count;
                    if (singleCount >= planeLength)
                    {
                        //查找飞机长度相等个数的最小单牌
                        var mySingle = singleCard.GetRange(singleCount - planeLength, planeLength);
                        foreach (var kvPair in mySingle)
                        {
                            resultCard.AddRange(kvPair.Cards);
                        }
                    }
                    else
                    {
                        //在单牌和对子不能单独满足翅膀情况下,先取出所有单牌,不够的牌由最小的对子凑齐翅膀
                        List <OutTagCard> mySingle = new List <OutTagCard>();
                        foreach (var card in singleCard)
                        {
                            if (card.LogicValue <= 14)
                            {
                                mySingle.Add(card);
                            }
                        }

                        foreach (var kvPair in mySingle)
                        {
                            resultCard.AddRange(kvPair.Cards);
                        }

                        //计算需要拆的对子长度
                        int mySinglePairLength = planeLength - mySingle.Count;
                        if (mySinglePairLength < 0)
                        {
                            mySinglePairLength = 0;
                        }

                        List <byte> bytes = new List <byte>();
                        //按照大小顺序获取所有对子
                        foreach (var kvPair in pairCard)
                        {
                            bytes.AddRange(kvPair.Cards);
                        }
                        if (bytes.Count > 0)
                        {
                            bytes.Reverse();                             //逆序,以便后面从最小的对子开始拆
                            resultCard.AddRange(
                                bytes.GetRange(0, mySinglePairLength).ToArray());
                        }
                    }
                }
                outResultCard = (byte[])resultCard.ToArray(typeof(byte));
                return;
            }

            #endregion

            List <byte[]> outTempResultCard = new List <byte[]>();
            #region 单顺
            //获取顺子(大于等于5张)
            List <ArrayList> singleCards = new List <ArrayList>();

            List <OutTagCard> greatThanOneCard = new List <OutTagCard>();
            foreach (var card in analyseCard)
            {
                if (card.Value.CardCount >= 1 && card.Key <= 14)
                {
                    greatThanOneCard.Add(card.Value);
                }
            }
            var gtThanOneCard = greatThanOneCard;
            gtThanOneCard.Reverse();
            //最长的单顺长度
            int maxSingleStraightLength = 0;
            if (gtThanOneCard.Count > 0)
            {
                OutTagCard otcFirstCard  = gtThanOneCard[0];
                byte       bOneFirstCard = otcFirstCard.LogicValue;

                ArrayList single = new ArrayList();

                //连续变动值
                int iJump = 0;
                for (int i = 1; i < gtThanOneCard.Count; i++)
                {
                    if (i == 1)
                    {
                        iJump = i;
                    }
                    //判断下一个元素是否存在首元素的LogicValue + 1的关系
                    bool isExists = (gtThanOneCard[i].LogicValue == bOneFirstCard + iJump);
                    //判断是否牌是否比2大
                    if (gtThanOneCard[i].LogicValue > 14)
                    {
                        continue;
                    }
                    if (isExists)
                    {
                        if (single.Count == 0)
                        {
                            single.Add(otcFirstCard.Cards[0]);
                        }
                        single.Add(gtThanOneCard[i].Cards[0]);
                        iJump++;
                    }
                    else
                    {
                        if (single.Count >= 5)
                        {
                            singleCards.Add(single);
                        }
                        else
                        {
                            singleCards.Remove(single);
                            iJump = 1;
                        }
                        //重新初始化牌,进入下一轮查询
                        single = new ArrayList();

                        //gtThanOneCard[i].LogicValue - bOneFirstCard - 1;
                        bOneFirstCard = gtThanOneCard[i].LogicValue;
                        otcFirstCard  = gtThanOneCard[i];
                    }
                    if (i == gtThanOneCard.Count - 1 && single.Count >= 5)
                    {
                        singleCards.Add(single);
                    }
                }
            }
            //判断是否有存在顺子
            if (singleCards.Count >= 1)
            {
                ArrayList resultCard = new ArrayList();

                resultCard.AddRange((byte[])singleCards[0].ToArray(typeof(byte)));
                if (singleCards.Count > 1)
                {
                    int singletraightLength = singleCards[0].Count;
                    //查找最长的顺子
                    foreach (var kvItem in singleCards)
                    {
                        if (kvItem.Count > singletraightLength)
                        {
                            resultCard = new ArrayList();

                            singletraightLength = kvItem.Count;
                            resultCard.AddRange((byte[])kvItem.ToArray(typeof(byte)));
                        }
                    }
                    maxSingleStraightLength = singletraightLength;
                }
                outTempResultCard.Add((byte[])resultCard.ToArray(typeof(byte)));
            }

            #endregion

            #region 连对
            List <ArrayList> pairCards = new List <ArrayList>();

            List <OutTagCard> greatThanTwoCard = new List <OutTagCard>();
            foreach (var card in analyseCard)
            {
                if (card.Value.CardCount >= 2 && card.Value.LogicValue <= 14)
                {
                    greatThanTwoCard.Add(card.Value);
                }
            }

            var gtThanTwoCard = greatThanTwoCard;
            gtThanTwoCard.Reverse();
            if (gtThanTwoCard.Count > 0)
            {
                OutTagCard otcFirstCard  = gtThanTwoCard[0];
                byte       bTwoFirstCard = otcFirstCard.LogicValue;

                ArrayList pairs = new ArrayList();
                //连续变动值
                int iJump = 0;
                for (int i = 1; i < gtThanTwoCard.Count; i++)
                {
                    if (i == 1)
                    {
                        iJump = i;
                    }
                    //判断下一个元素是否存在首元素的LogicValue + 1的关系
                    bool isExists = (gtThanTwoCard[i].LogicValue == bTwoFirstCard + iJump);
                    //判断是否牌是否比2大
                    if (gtThanTwoCard[i].LogicValue > 14)
                    {
                        continue;
                    }
                    if (isExists)
                    {
                        if (pairs.Count == 0)
                        {
                            pairs.AddRange(new byte[2]
                            {
                                otcFirstCard.Cards[0],
                                otcFirstCard.Cards[1]
                            }
                                           );
                        }
                        pairs.AddRange(new byte[2]
                        {
                            gtThanTwoCard[i].Cards[0],
                            gtThanTwoCard[i].Cards[1]
                        });
                        iJump++;
                    }
                    else
                    {
                        if (pairs.Count >= 6)
                        {
                            pairCards.Add(pairs);
                        }
                        else
                        {
                            pairCards.Remove(pairs);
                            iJump = 1;
                        }
                        //重新初始化牌,进入下一轮查询
                        pairs         = new ArrayList();
                        bTwoFirstCard = gtThanTwoCard[i].LogicValue;
                        otcFirstCard  = gtThanTwoCard[i];
                    }
                    if (i == gtThanTwoCard.Count - 1 && pairs.Count >= 6)
                    {
                        pairCards.Add(pairs);
                    }
                }
            }

            int maxPairSingleCount = 0;            //构成连对的最大单张牌个数
            if (pairCards.Count >= 1)
            {
                ArrayList resultCard = new ArrayList();
                resultCard.AddRange((byte[])pairCards[0].ToArray(typeof(byte)));

                int pairStraightLength = pairCards[0].Count;

                if (pairCards.Count > 1)
                {
                    //查找最长的连对
                    foreach (var kvItem in pairCards)
                    {
                        if (kvItem.Count > pairStraightLength)
                        {
                            resultCard = new ArrayList();

                            pairStraightLength = kvItem.Count;
                            resultCard.AddRange((byte[])kvItem.ToArray(typeof(byte)));
                        }
                    }
                }

                maxPairSingleCount = pairStraightLength / 2;
                if (maxPairSingleCount > maxSingleStraightLength)                 //判断单顺长度和连对的单牌个数
                {
                    outTempResultCard.Add((byte[])resultCard.ToArray(typeof(byte)));
                }
            }


            #endregion


            //取得除飞机外最长的牌型
            if (outTempResultCard.Count > 0)
            {
                int maxReturnCardLength = outTempResultCard[0].Length;
                outResultCard = outTempResultCard[0];
                foreach (byte[] tempResultCard in outTempResultCard)
                {
                    if (tempResultCard.Length > maxReturnCardLength)
                    {
                        outResultCard = tempResultCard;
                    }
                }
                return;
            }

            #region 其他牌处理
            //三张牌
            ArrayList threeTakeOne = new ArrayList();
            if (threeCard.Count == 1)
            {
                threeTakeOne.AddRange(threeCard[0].Cards);
                if (pairCard.Count > 0)
                {
                    threeTakeOne.AddRange(pairCard[pairCard.Count - 1].Cards);
                    outResultCard = (byte[])threeTakeOne.ToArray(typeof(byte));
                    return;
                }
                if (singleCard.Count > 0)
                {
                    threeTakeOne.AddRange(singleCard[singleCard.Count - 1].Cards);
                    outResultCard = (byte[])threeTakeOne.ToArray(typeof(byte));
                    return;
                }
            }

            outResultCard = srcCard;
            return;

            #endregion
        }