예제 #1
0
        //---------------------------------------------------------------------
        private static int CompareTwoHandsWithHighCard(
            ICollection <CardData> firstHand,
            ICollection <CardData> secondHand)
        {
            int first_hand_value = 0;

            foreach (var i in firstHand)
            {
                MaJiangSuit mj_suit = (MaJiangSuit)i.suit;
                if (mj_suit == MaJiangSuit.Tong)
                {
                    first_hand_value += i.type;
                }
            }
            first_hand_value = first_hand_value % 10;

            int second_hand_value = 0;

            foreach (var i in secondHand)
            {
                MaJiangSuit mj_suit = (MaJiangSuit)i.suit;
                if (mj_suit == MaJiangSuit.Tong)
                {
                    second_hand_value += i.type;
                }
            }
            second_hand_value = second_hand_value % 10;

            if (first_hand_value > second_hand_value)
            {
                return(1);
            }

            if (first_hand_value < second_hand_value)
            {
                return(-1);
            }

            var firstSorted    = firstHand.OrderByDescending(x => x.type).ToList();
            var secondSorted   = secondHand.OrderByDescending(x => x.type).ToList();
            var cardsToCompare = Math.Min(firstHand.Count, secondHand.Count);

            for (var i = 0; i < cardsToCompare; i++)
            {
                if (firstSorted[i].type > secondSorted[i].type)
                {
                    return(1);
                }

                if (firstSorted[i].type < secondSorted[i].type)
                {
                    return(-1);
                }
            }

            return(0);
        }
예제 #2
0
        //---------------------------------------------------------------------
        Card _getNextOrLastCardTypeCard(MaJiangType card_type, MaJiangSuit card_suit, bool is_same_suit, bool is_next)
        {
            Card        card          = null;
            MaJiangType need_cardtype = MaJiangType.Two;

            if (is_next)
            {
                int next_cardtype = ((int)card_type) + 1;
                if (next_cardtype == 15)
                {
                    need_cardtype = MaJiangType.Two;
                }
                else
                {
                    need_cardtype = (MaJiangType)next_cardtype;
                }
            }
            else
            {
                int last_cardtype = ((int)card_type) - 1;
                if (last_cardtype == 1)
                {
                    need_cardtype = MaJiangType.Nine;
                }
                else
                {
                    need_cardtype = (MaJiangType)last_cardtype;
                }
            }

            if (is_same_suit)
            {
                List <Card> list_same_suitcards = null;
                if (mapSameSuitCard.TryGetValue(card_suit, out list_same_suitcards))
                {
                    byte need_cardtype_bte = (byte)need_cardtype;
                    var  list_suit_card    = list_same_suitcards.Where(x => x.Type == need_cardtype_bte);
                    if (list_suit_card != null && list_suit_card.Count() > 0)
                    {
                        card = list_suit_card.First();
                        _removeCard(card);
                    }
                }
            }
            else
            {
                card = _getSameTypeCard(need_cardtype);
            }

            return(card);
        }
예제 #3
0
        //---------------------------------------------------------------------
        Card _getSameSuitCard(MaJiangSuit card_suit)
        {
            Card        card = null;
            List <Card> list_samesuitcard = null;

            mapSameSuitCard.TryGetValue(card_suit, out list_samesuitcard);
            if (list_samesuitcard != null && list_samesuitcard.Count > 0)
            {
                int index = RandomEx.Next(0, list_samesuitcard.Count);
                card = list_samesuitcard[index];
                _removeCard(card);
            }

            return(card);
        }
예제 #4
0
        //---------------------------------------------------------------------
        public static string GetMaJiangCardResName(CardData card_data)
        {
            string      card_res_name = "";
            MaJiangSuit majiang_suit  = (MaJiangSuit)card_data.suit;

            if (majiang_suit != MaJiangSuit.Wan && majiang_suit != MaJiangSuit.Tong &&
                majiang_suit != MaJiangSuit.Tiao)
            {
                card_res_name = majiang_suit.ToString();
            }
            else
            {
                MaJiangType majiang_type = (MaJiangType)card_data.type;
                card_res_name = majiang_type.ToString() + majiang_suit.ToString();
            }

            return(card_res_name);
        }
예제 #5
0
        //---------------------------------------------------------------------
        // <summary>
        // Finds the best possible hand given a player's cards and all revealed comunity cards.
        // </summary>
        // <param name="cards">A player's cards + all revealed comunity cards (at lesat 5 in total)</param>
        // <returns>Returns an object of type BestHandZhongFB</returns>
        public BestHandZhongFB GetBestHand(IEnumerable <Card> cards)
        {
            var cardTypeMap = new Dictionary <MaJiangType, List <Card> >();

            foreach (var card in cards)
            {
                List <Card> listTypeCard = null;
                cardTypeMap.TryGetValue((MaJiangType)card.Type, out listTypeCard);
                if (listTypeCard == null)
                {
                    listTypeCard = new List <Card>();
                }

                listTypeCard.Add(card);
                cardTypeMap[(MaJiangType)card.Type] = listTypeCard;
            }

            var pairTypes = this.GetTypesWithNCards(cardTypeMap, 2);

            // Pair
            if (pairTypes.Count == 2)
            {
                var bestCards = new List <CardData>();
                bestCards.AddRange(pairTypes);
                CardData            card_data_first = bestCards[0];
                HandRankTypeZhongFB rank_type       = HandRankTypeZhongFB.BaoZi;
                if (card_data_first.suit == (byte)MaJiangSuit.Bai)
                {
                    rank_type = HandRankTypeZhongFB.BaoZiBai;
                }
                else if (card_data_first.suit == (byte)MaJiangSuit.Zhong)
                {
                    rank_type = HandRankTypeZhongFB.BaoZiZhong;
                }
                else if (card_data_first.suit == (byte)MaJiangSuit.Fa)
                {
                    rank_type = HandRankTypeZhongFB.BaoZiFa;
                }
                return(new BestHandZhongFB(rank_type, bestCards, pairTypes));
            }
            else
            {
                // High card
                int cards_count = cards.Count();
                int take_count  = (cards_count >= ComparableCards) ? ComparableCards : cards_count;

                var  bestCards     = cards.Select(x => x.GetCardData()).OrderByDescending(x => x.type).Take(take_count).ToList();
                bool exists_2_bing = bestCards.Exists(x => x.type == (byte)MaJiangType.Two && x.suit == (byte)MaJiangSuit.Tong);
                bool exists_8_bing = bestCards.Exists(x => x.type == (byte)MaJiangType.Eight && x.suit == (byte)MaJiangSuit.Tong);

                HandRankTypeZhongFB rank_type = HandRankTypeZhongFB.Dian0;
                if (exists_2_bing && exists_8_bing)
                {
                    rank_type = HandRankTypeZhongFB.TianGang;
                }
                else
                {
                    var hand_value = 0;
                    foreach (var i in cards)
                    {
                        MaJiangSuit mj_suit = (MaJiangSuit)i.Suit;
                        if (mj_suit == MaJiangSuit.Tong)
                        {
                            hand_value += i.Type;
                        }
                    }

                    var dian = hand_value % 10;
                    foreach (var i in Enum.GetValues(typeof(HandRankTypeZhongFB)))
                    {
                        HandRankTypeZhongFB t = (HandRankTypeZhongFB)i;
                        if ((int)t == dian)
                        {
                            rank_type = t;
                            break;
                        }
                    }
                }

                return(new BestHandZhongFB(rank_type, bestCards, bestCards));
            }
        }