Example #1
0
        private static List <MsgCardHand> SearchUseableSingle(List <int> hands2)
        {
            List <MsgCardHand> cardHands = new List <MsgCardHand>();

            ResetSlots(hands2);

            // 找一个较大的单张
            for (var newBombSuitID = 1; newBombSuitID < (int)pokerface.CardID.JOB / 4; newBombSuitID++)
            {
                if (slots[newBombSuitID] > 0)
                {
                    var cardHand = new MsgCardHand();
                    cardHand.cardHandType = (int)pokerface.CardHandType.Single;
                    cardHand.cards.AddRange(extractCardByRank(hands2, newBombSuitID, 1));
                    cardHands.Add(cardHand);
                }
            }

            // 自己有2,那就是最大
            if (slots[0] > 0)
            {
                var cardHand = new MsgCardHand();
                cardHand.cardHandType = (int)pokerface.CardHandType.Single;
                cardHand.cards.AddRange(extractCardByRank(hands2, 0, 1));
                cardHands.Add(cardHand);
            }

            return(cardHands);
        }
Example #2
0
        private static List <MsgCardHand> SearchLongestFlush(List <int> hands)
        {
            List <MsgCardHand> cardHands = new List <MsgCardHand>();

            ResetSlots(hands);
            // 简单起见从3开始搜索,不考虑ACE开始的类似12345这种
            for (var newBombSuitID = 1; newBombSuitID <= (int)pokerface.CardID.AH / 4;)
            {
                var testBombRankID = newBombSuitID;
                for (var i = 0; i < 13; i++)
                {
                    if (slots[testBombRankID + i] < 1)
                    {
                        // 找到了
                        if (i > 4)
                        {
                            var cardHand = new MsgCardHand();
                            cardHand.cards.AddRange(extractCardByRanks(hands, testBombRankID, testBombRankID + i - 1, 1));
                            cardHands.Add(cardHand);
                        }

                        break;
                    }
                }

                newBombSuitID = newBombSuitID + 1;
            }

            return(cardHands);
        }
Example #3
0
        /// <summary>
        /// 寻找所有大于上一手"炸弹"的有效组合
        /// </summary>
        /// <param name="prev">上一手牌</param>
        /// <param name="hands">手上的所有牌</param>
        /// <returns>返回一个牌组列表,如果没有有效牌组,该列表长度为0</returns>
        private static List <MsgCardHand> FindBombGreatThan(MsgCardHand prev, List <int> hands)
        {
            // 注意不需要考虑333这种炸弹,因为他是最小的,而现在是寻找一个大于某个炸弹的炸弹
            List <MsgCardHand> cardHands = new List <MsgCardHand>();

            ResetSlots(hands);

            var bombCardRankID = (prev.cards[0]) / 4;

            for (var newBombSuitID = bombCardRankID + 1; newBombSuitID < (int)pokerface.CardID.AH / 4; newBombSuitID++)
            {
                if (slots[newBombSuitID] > 3)
                {
                    var cardHand = new MsgCardHand();
                    cardHand.cardHandType = (int)pokerface.CardHandType.Bomb;
                    cardHand.cards.AddRange(extractCardByRank(hands, newBombSuitID, 4));
                    cardHands.Add(cardHand);
                }
            }

            // 如果有3个ACE,也是炸弹
            if (slots[(int)pokerface.CardID.AH / 4] > 2)
            {
                var cardHand = new MsgCardHand();
                cardHand.cardHandType = (int)pokerface.CardHandType.Bomb;
                cardHand.cards.AddRange(extractCardByRank(hands, (int)pokerface.CardID.AH / 4, 3));

                cardHands.Add(cardHand);
            }

            return(cardHands);
        }
Example #4
0
        private static List <MsgCardHand> SearchLongestPairX(List <int> hands)
        {
            List <MsgCardHand> cardHands = new List <MsgCardHand>();

            ResetSlots(hands);

            for (var newBombSuitID = 0; newBombSuitID <= (int)pokerface.CardID.AH / 4;)
            {
                var testBombRankID = newBombSuitID;
                for (var i = 0; i < 13; i++)
                {
                    if (slots[testBombRankID + i] < 2)
                    {
                        // 找到了
                        if (i >= 1)
                        {
                            var cardHand = new MsgCardHand();
                            cardHand.cards.AddRange(extractCardByRanks(hands, testBombRankID, testBombRankID + i - 1, 2));
                            cardHands.Add(cardHand);
                        }

                        break;
                    }
                }

                newBombSuitID = newBombSuitID + 1;
            }


            return(cardHands);
        }
Example #5
0
        /// <summary>
        /// 判断当前的手牌是否大于上一手牌
        /// </summary>
        /// <param name="prevCardHand">上一手牌</param>
        /// <param name="current">当前的手牌</param>
        /// <returns>如果大于则返回true,其他各种情形都会返回false</returns>
        public static bool agariGreatThan(MsgCardHand prevCardHand, MsgCardHand current)
        {
            // 如果当前的是炸弹
            //if (current.cardHandType == (int)CardHandType.Bomb)
            //{
            //    // 上一手不是炸弹
            //    if (prevCardHand.cardHandType != (int)CardHandType.Bomb)
            //    {
            //        return true;
            //    }

            //    // 上一手也是炸弹,则比较炸弹牌的大小,大丰关张不存在多于4个牌的炸弹
            //    return current.cards[0]/4 > prevCardHand.cards[0]/4;
            //}

            //// 如果上一手牌是炸弹
            //if (prevCardHand.cardHandType == (int)CardHandType.Bomb)
            //{
            //    return false;
            //}

            //// 必须类型匹配
            //if (prevCardHand.cardHandType != current.cardHandType)
            //{
            //    return false;
            //}

            //// 张数匹配
            //if (prevCardHand.cards.Count != current.cards.Count)
            //{
            //    return false;
            //}

            //// 单张时,2是最大的
            //if (prevCardHand.cardHandType == (int)CardHandType.Single)
            //{
            //    if (prevCardHand.cards[0] / 4 == 0)
            //    {
            //        return false;

            //    }

            //    if (current.cards[0] / 4 == 0)
            //    {
            //        return true;
            //    }
            //}

            //// 现在只比较最大牌的大小
            //return current.cards[0]/4 > prevCardHand.cards[0]/4;

            return(false);
        }
Example #6
0
        /// <summary>
        /// 寻找手牌上的所有炸弹
        /// </summary>
        /// <param name="hands">手上的所有牌</param>
        /// <returns>返回一个牌组列表,如果没有有效牌组,该列表长度为0</returns>
        private static List <MsgCardHand> FindBomb(List <int> hands)
        {
            List <MsgCardHand> cardHands = new List <MsgCardHand>();

            ResetSlots(hands);

            for (var newBombSuitID = 0; newBombSuitID < (int)pokerface.CardID.AH / 4; newBombSuitID++)
            {
                if (slots[newBombSuitID] > 3)
                {
                    var cardHand = new MsgCardHand();
                    cardHand.cardHandType = (int)pokerface.CardHandType.Bomb;
                    cardHand.cards.AddRange(extractCardByRank(hands, newBombSuitID, 4));
                    cardHands.Add(cardHand);
                }
            }

            // 如果有3个ACE,也是炸弹
            if (slots[(int)pokerface.CardID.AH / 4] > 2)
            {
                var cardHand = new MsgCardHand();
                cardHand.cardHandType = (int)pokerface.CardHandType.Bomb;
                cardHand.cards.AddRange(extractCardByRank(hands, (int)pokerface.CardID.AH / 4, 3));
                cardHands.Add(cardHand);
            }


            // 黑桃梅花方块3组成炸弹
            List <int> three = new List <int>();

            foreach (var h in hands)
            {
                if (h / 4 == (int)pokerface.CardID.R3H / 4 && h != (int)pokerface.CardID.R3H)
                {
                    three.Add(h);
                }
            }

            if (three.Count == 3)
            {
                var cardHand = new MsgCardHand();
                cardHand.cardHandType = (int)pokerface.CardHandType.Bomb;
                cardHand.cards.AddRange(three);
                cardHands.Add(cardHand);
            }

            return(cardHands);
        }
Example #7
0
        /// <summary>
        /// 寻找所有大于上一手"顺子"的有效组合
        /// </summary>
        /// <param name="prev">上一手牌</param>
        /// <param name="hands">手上的所有牌</param>
        /// <returns>返回一个牌组列表,如果没有有效牌组,该列表长度为0</returns>
        private static List <MsgCardHand> FindFlushGreatThan(MsgCardHand prev, List <int> hands)
        {
            List <MsgCardHand> cardHands = new List <MsgCardHand>();

            ResetSlots(hands);

            var flushLen       = prev.cards.Count;
            var bombCardRankID = prev.cards[0] / 4; // 最大的顺子牌rank
            var seqLength      = flushLen / 1;

            for (var newBombSuitID = bombCardRankID + 1; newBombSuitID <= (int)pokerface.CardID.AH / 4;)
            {
                var testBombRankID = newBombSuitID;
                var found          = true;
                for (var i = 0; i < seqLength; i++)
                {
                    if (slots[testBombRankID - i] < 1)
                    {
                        newBombSuitID = newBombSuitID + 1;

                        found = false;

                        break;
                    }
                }

                // 找到了
                if (found)
                {
                    var cardHand = new MsgCardHand();
                    cardHand.cardHandType = (int)pokerface.CardHandType.Flush;
                    cardHand.cards.AddRange(extractCardByRanks(hands, testBombRankID - seqLength + 1, testBombRankID, 1));
                    cardHands.Add(cardHand);

                    newBombSuitID = newBombSuitID + 1;
                }
            }

            return(cardHands);
        }
Example #8
0
        /// <summary>
        /// 寻找所有大于上一手"对子"的有效组合
        /// </summary>
        /// <param name="prev">上一手牌</param>
        /// <param name="hands">手上的所有牌</param>
        /// <returns>返回一个牌组列表,如果没有有效牌组,该列表长度为0</returns>
        private static List <MsgCardHand> FindPairGreatThan(MsgCardHand prev, List <int> hands)
        {
            List <MsgCardHand> cardHands = new List <MsgCardHand>();

            ResetSlots(hands);

            var bombCardRankID = prev.cards[0] / 4;

            // 找一个较大的对子
            for (var newBombSuitID = bombCardRankID + 1; newBombSuitID < (int)pokerface.CardID.JOB / 4; newBombSuitID++)
            {
                if (slots[newBombSuitID] > 1)
                {
                    var cardHand = new MsgCardHand();
                    cardHand.cardHandType = (int)pokerface.CardHandType.Pair;
                    cardHand.cards.AddRange(extractCardByRank(hands, newBombSuitID, 2));
                    cardHands.Add(cardHand);
                }
            }

            return(cardHands);
        }
Example #9
0
        /// <summary>
        /// 寻找所有大于上一手"单张"的有效组合
        /// </summary>
        /// <param name="prev">上一手牌</param>
        /// <param name="hands">手上的所有牌</param>
        /// <returns>返回一个牌组列表,如果没有有效牌组,该列表长度为0</returns>
        private static List <MsgCardHand> FindSingleGreatThan(MsgCardHand prev, List <int> hands)
        {
            List <MsgCardHand> cardHands = new List <MsgCardHand>();

            ResetSlots(hands);

            var bombCardRankID = prev.cards[0] / 4;

            if (bombCardRankID == 0)
            {
                // 2已经是最大的单张了
                return(cardHands);
            }

            // 找一个较大的单张
            for (var newBombSuitID = bombCardRankID + 1; newBombSuitID < (int)pokerface.CardID.JOB / 4; newBombSuitID++)
            {
                if (slots[newBombSuitID] > 0)
                {
                    var cardHand = new MsgCardHand();
                    cardHand.cardHandType = (int)pokerface.CardHandType.Single;
                    cardHand.cards.AddRange(extractCardByRank(hands, newBombSuitID, 1));
                    cardHands.Add(cardHand);
                }
            }

            // 自己有2,那就是最大
            if (slots[0] > 0)
            {
                var cardHand = new MsgCardHand();
                cardHand.cardHandType = (int)pokerface.CardHandType.Single;
                cardHand.cards.AddRange(extractCardByRank(hands, 0, 1));
                cardHands.Add(cardHand);
            }

            return(cardHands);
        }
Example #10
0
        /// <summary>
        /// 根据牌列表,构造MsgCardHand对象
        /// </summary>
        /// <param name="hai">手牌列表</param>
        /// <returns>如果牌列表是一个有效的组合,则返回一个MsgCardHand对象,否则返回null</returns>
        public static MsgCardHand  agariConvertMsgCardHand(int[] hai)
        {
            var key = calcKey(hai);

            if (!agariTable.ContainsKey(key))
            {
                return(null);
            }

            var agari = agariTable[key];
            var ct    = (CardHandType)(agari & 0x0f);

            var msgCardhand = new MsgCardHand();

            msgCardhand.CardHandType = (int)ct;

            // 排序,让大的牌在前面
            Array.Sort(hai, (x, y) =>
            {
                return(y - x);
            });

            var cardsNew = new List <int>();

            switch (ct)
            {
            case CardHandType.Flush:
                cardsNew.AddRange(hai);
                // 对于ACE需要特殊考虑,如果ACE作为类似于12345这样的顺子
                var isAceSmallest = ((agari & 0x0100) != 0);
                if (isAceSmallest)
                {
                    var swp = cardsNew[0];
                    cardsNew.RemoveAt(0);
                    cardsNew.Add(swp);
                }
                break;

                //case CardHandType.TripletPair:
                //case CardHandType.Triplet2X2Pair:
                // 确保3张在前面,对子在后面
                //for (var i = 0; i < hai.Length; i++)
                //{
                //    var h = hai[i];
                //    if (slots[h/4] == 3)
                //    {
                //        cardsNew.Add(h);
                //    }
                //}
                //for (var i = 0; i < hai.Length; i++)
                //{
                //    var h = hai[i];
                //    if (slots[h / 4] != 3)
                //    {
                //        cardsNew.Add(h);
                //    }
                //}
                break;

            default:
                cardsNew.AddRange(hai);
                break;
            }

            msgCardhand.Cards.AddRange(cardsNew);

            // 如果是3个3,而且不包含红桃3,则把牌组改为炸弹,而不是三张
            //if (ct == CardHandType.Triplet && msgCardhand.cards[0]/4 == (int)CardID.R3H/4)
            //{
            //    var foundR3H = false;
            //    foreach (var c in msgCardhand.cards)
            //    {
            //        if (c == (int)CardID.R3H)
            //        {
            //            foundR3H = true;
            //            break;
            //        }
            //    }

            //    if (!foundR3H)
            //    {
            //        msgCardhand.cardHandType = (int)CardHandType.Bomb;
            //    }
            //}

            return(msgCardhand);
        }
Example #11
0
        /// <summary>
        /// 寻找所有大于上一手"3张+对子"的有效组合
        /// </summary>
        /// <param name="prev">上一手牌</param>
        /// <param name="hands">手上的所有牌</param>
        /// <returns>返回一个牌组列表,如果没有有效牌组,该列表长度为0</returns>
        private static List <MsgCardHand> FindTripletPairGreatThan(MsgCardHand prev, List <int> hands)
        {
            List <MsgCardHand> cardHands = new List <MsgCardHand>();

            ResetSlots(hands);

            var flushLen       = prev.cards.Count - 2;// 减去对子
            var bombCardRankID = prev.cards[0] / 4;
            var seqLength      = flushLen / 3;

            for (var newBombSuitID = bombCardRankID + 1; newBombSuitID <= (int)pokerface.CardID.AH / 4;)
            {
                var testBombRankID = newBombSuitID;
                var found          = true;
                for (var i = 0; i < seqLength; i++)
                {
                    if (slots[testBombRankID - i] < 3)
                    {
                        newBombSuitID = newBombSuitID + 1;

                        found = false;

                        break;
                    }
                }

                // 找到了
                if (found)
                {
                    var left  = newBombSuitID + 1 - seqLength;
                    var right = newBombSuitID;

                    var        pairCount = 0;
                    List <int> pairAble  = new List <int>();
                    for (var testPair = 0; testPair < left; testPair++)
                    {
                        if (slots[testPair] > 1)
                        {
                            pairCount++;
                            pairAble.Add(testPair);
                        }
                    }

                    for (var testPair = right + 1; testPair < (int)pokerface.CardID.JOB / 4; testPair++)
                    {
                        if (slots[testPair] > 1)
                        {
                            pairCount++;
                            pairAble.Add(testPair);
                        }
                    }

                    if (pairCount > 0)
                    {
                        // 此处不再遍历各个对子
                        var cardHand = new MsgCardHand();
                        cardHand.cardHandType = (int)pokerface.CardHandType.TripletPair;
                        cardHand.cards.AddRange(extractCardByRank(hands, left, 3));
                        cardHand.cards.AddRange(extractCardByRank(hands, pairAble[0], 2));
                        cardHands.Add(cardHand);
                    }

                    newBombSuitID = newBombSuitID + 1;
                }
            }

            return(cardHands);
        }
Example #12
0
        /// <summary>
        /// 寻找比上一手牌大的所有有效牌组
        /// 这个主要用于自动打牌以及给出提示之类
        /// </summary>
        /// <param name="prev">上一手牌</param>
        /// <param name="hands">当前手上所有的牌</param>
        /// <returns>返回一个牌组列表,如果没有有效牌组,该列表长度为0</returns>
        public static List <pokerface.MsgCardHand> FindGreatThanCardHand(pokerface.MsgCardHand prev, List <int> hands, int specialCardID)
        {
            var  prevCT = (pokerface.CardHandType)prev.cardHandType;
            bool isBomb = false;
            List <pokerface.MsgCardHand> tt = null;

            if (specialCardID >= 0)
            {
                tt = new List <MsgCardHand>();
                var cardHand = new MsgCardHand();
                cardHand.cardHandType = (int)pokerface.CardHandType.Single;
                cardHand.cards.AddRange(extractCardByRank(hands, 0, 1));
                tt.Add(cardHand);
                return(tt);
            }

            switch (prevCT)
            {
            case pokerface.CardHandType.Bomb:
                tt     = FindBombGreatThan(prev, hands);
                isBomb = true;
                break;

            case pokerface.CardHandType.Flush:
                tt = FindFlushGreatThan(prev, hands);
                break;

            case pokerface.CardHandType.Single:
                tt = FindSingleGreatThan(prev, hands);
                break;

            case pokerface.CardHandType.Pair:
                tt = FindPairGreatThan(prev, hands);
                break;

            case pokerface.CardHandType.Pair2X:
                tt = FindPair2XGreatThan(prev, hands);
                break;

            case pokerface.CardHandType.Triplet:
                tt = FindTripletGreatThan(prev, hands);
                break;

            case pokerface.CardHandType.Triplet2X:
                tt = FindTriplet2XGreatThan(prev, hands);
                break;

            case pokerface.CardHandType.Triplet2X2Pair:
                tt = FindTriplet2X2PairGreatThan(prev, hands);
                break;

            case pokerface.CardHandType.TripletPair:
                tt = FindTripletPairGreatThan(prev, hands);
                break;
            }

            if (!isBomb)
            {
                var tt2 = FindBomb(hands);
                tt.AddRange(tt2);
            }
            return(tt);
        }
Example #13
0
        private static List <MsgCardHand> SearchLongestTriplet2XOrTriplet2X2Pair(List <int> hands)
        {
            List <MsgCardHand> cardHands = new List <MsgCardHand>();

            ResetSlots(hands);

            for (var newBombSuitID = 0; newBombSuitID <= (int)pokerface.CardID.AH / 4;)
            {
                var testBombRankID = newBombSuitID;
                for (var i = 0; i < 13; i++)
                {
                    if (slots[testBombRankID + i] < 3)
                    {
                        // 找到了
                        if (i >= 2)
                        {
                            var cardHand = new MsgCardHand();
                            cardHand.cards.AddRange(extractCardByRanks(hands, testBombRankID, testBombRankID + i - 1, 3));
                            cardHands.Add(cardHand);

                            // 寻找2个对子
                            var left  = testBombRankID;
                            var right = testBombRankID + i - 1;

                            var        pairCount = 0;
                            List <int> pairAble  = new List <int>();
                            for (var testPair = 0; testPair < left; testPair++)
                            {
                                if (slots[testPair] > 1)
                                {
                                    pairCount++;
                                    pairAble.Add(testPair);
                                }
                            }

                            for (var testPair = right + 1; testPair < (int)pokerface.CardID.JOB / 4; testPair++)
                            {
                                if (slots[testPair] > 1)
                                {
                                    pairCount++;
                                    pairAble.Add(testPair);
                                }
                            }

                            if (pairCount >= i)
                            {
                                // 此处不在遍历各种对子组合
                                var addPairCount = 0;
                                foreach (var pp in pairAble)
                                {
                                    cardHand.cards.AddRange(extractCardByRank(hands, pp, 2));
                                    addPairCount++;
                                    if (addPairCount == i)
                                    {
                                        break;
                                    }
                                }
                            }
                        }


                        break;
                    }
                }



                newBombSuitID = newBombSuitID + 1;
            }

            return(cardHands);
        }
Example #14
0
        private static List <MsgCardHand> SearchUseableTripletOrTripletPair(List <int> hands)
        {
            List <MsgCardHand> cardHands = new List <MsgCardHand>();

            ResetSlots(hands);

            for (var newBombSuitID = 0; newBombSuitID <= (int)pokerface.CardID.AH / 4;)
            {
                var testBombRankID = newBombSuitID;
                var found          = true;
                for (var i = 0; i < 1; i++)
                {
                    if (slots[testBombRankID - i] < 3)
                    {
                        newBombSuitID = newBombSuitID + 1;

                        found = false;

                        break;
                    }
                }

                // 找到了
                if (found)
                {
                    var cardHand = new MsgCardHand();
                    cardHand.cards.AddRange(extractCardByRank(hands, newBombSuitID, 3));
                    cardHands.Add(cardHand);

                    var left  = newBombSuitID;
                    var right = newBombSuitID;

                    var        pairCount = 0;
                    List <int> pairAble  = new List <int>();
                    for (var testPair = 0; testPair < left; testPair++)
                    {
                        if (slots[testPair] > 1)
                        {
                            pairCount++;
                            pairAble.Add(testPair);
                        }
                    }

                    for (var testPair = right + 1; testPair < (int)pokerface.CardID.JOB / 4; testPair++)
                    {
                        if (slots[testPair] > 1)
                        {
                            pairCount++;
                            pairAble.Add(testPair);
                        }
                    }

                    if (pairCount > 0)
                    {
                        // 此处不再遍历各个对子
                        cardHand.cards.AddRange(extractCardByRank(hands, pairAble[0], 2));
                    }

                    newBombSuitID = newBombSuitID + 1;
                }
            }

            return(cardHands);
        }