Пример #1
0
        //---------------------------------------------------------------------
        internal BestHandNiuNiu(HandRankTypeNiuNiu rankType, ICollection <CardData> cards)
        {
            if (cards.Count != 5)
            {
                //throw new ArgumentException("Cards collection should contains exactly 5 elements", nameof(cards));
            }

            this.Cards    = cards.ToList();
            this.RankType = rankType;
        }
Пример #2
0
        //---------------------------------------------------------------------
        public List <Card> GetCardsWithHundredHandRankType(HandRankTypeNiuNiu hand_ranktype)
        {
            List <Card> list_cards = new List <Card>();

            switch (hand_ranktype)
            {
            case HandRankTypeNiuNiu.HighCard:
                list_cards = _getHighCard();
                break;

            case HandRankTypeNiuNiu.Niu1:
            case HandRankTypeNiuNiu.Niu2:
            case HandRankTypeNiuNiu.Niu3:
            case HandRankTypeNiuNiu.Niu4:
            case HandRankTypeNiuNiu.Niu5:
            case HandRankTypeNiuNiu.Niu6:
            case HandRankTypeNiuNiu.Niu7:
            case HandRankTypeNiuNiu.Niu8:
            case HandRankTypeNiuNiu.Niu9:
            case HandRankTypeNiuNiu.NiuNiu:
                list_cards = _getNiun((byte)hand_ranktype);
                break;

            case HandRankTypeNiuNiu.JinNiu:
                list_cards = _getJinNiu();
                break;

            case HandRankTypeNiuNiu.SiZha:
                list_cards = _getFourOfAKind();
                break;

            case HandRankTypeNiuNiu.WuXiaoNiu:
                list_cards = _getWuXiaoNiu();
                break;

            default:
                break;
            }

            return(list_cards);
        }
        //---------------------------------------------------------------------
        // <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 BestHand</returns>
        public BestHandNiuNiu GetBestHand(IEnumerable <Card> cards)
        {
            var all_cards_sum_value = cards.Sum(x => x.Type > 10 ? 10 : x.Type);

            if (all_cards_sum_value <= 10 && !cards.Any(x => x.Type >= 5))
            {
                var card_datas = cards.Select(x => x.GetCardData()).ToList();
                return(new BestHandNiuNiu(HandRankTypeNiuNiu.WuXiaoNiu, card_datas));
            }

            var cardTypeMap = new Dictionary <CardTypeNiuNiu, List <Card> >();

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

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

            // Four of a kind
            if (cardTypeMap.Any(x => x.Value.Count == 4))
            {
                var bestFourOfAKind = this.GetTypesWithNCards(cardTypeMap, 4).ToList();
                var best_cards      = new List <CardData>();
                best_cards.AddRange(bestFourOfAKind);
                best_cards.Add(cards.Where(x => !bestFourOfAKind.Exists((CardData best_hand) => { return(best_hand.type == x.Type); })).Max(x => x.GetCardData()));

                return(new BestHandNiuNiu(HandRankTypeNiuNiu.SiZha, best_cards, bestFourOfAKind));
            }

            if (!cards.Any(x => x.Type <= 10))
            {
                HandRankTypeNiuNiu rank_type = HandRankTypeNiuNiu.JinNiu;
                //if (cards.Any(x => x.Type == 10))
                //{
                //    rank_type = HandRankTypeNiuNiu.YinNiu;
                //}

                var best_cards = cards.Select(x => x.GetCardData()).OrderByDescending(x => x.type).ToList();
                return(new BestHandNiuNiu(rank_type, best_cards));
            }

            var have_niu = false;
            var cards_ex = cards.ToList();

            for (var i = 0; i <= 2; i++)
            {
                for (var j = i + 1; j <= 3; j++)
                {
                    for (var k = j + 1; k <= 4; k++)
                    {
                        var card_i_type = cards_ex[i].Type;
                        if (card_i_type > 10)
                        {
                            card_i_type = 10;
                        }

                        var card_j_type = cards_ex[j].Type;
                        if (card_j_type > 10)
                        {
                            card_j_type = 10;
                        }

                        var card_k_type = cards_ex[k].Type;
                        if (card_k_type > 10)
                        {
                            card_k_type = 10;
                        }

                        if ((card_i_type + card_j_type + card_k_type) % 10 == 0)
                        {
                            have_niu = true;
                        }
                    }
                }
            }

            if (have_niu)
            {
                var niu_num = all_cards_sum_value % 10;

                HandRankTypeNiuNiu rank_type = HandRankTypeNiuNiu.Niu1;
                switch (niu_num)
                {
                case 0:
                    rank_type = HandRankTypeNiuNiu.NiuNiu;
                    break;

                case 1:
                    rank_type = HandRankTypeNiuNiu.Niu1;
                    break;

                case 2:
                    rank_type = HandRankTypeNiuNiu.Niu2;
                    break;

                case 3:
                    rank_type = HandRankTypeNiuNiu.Niu3;
                    break;

                case 4:
                    rank_type = HandRankTypeNiuNiu.Niu4;
                    break;

                case 5:
                    rank_type = HandRankTypeNiuNiu.Niu5;
                    break;

                case 6:
                    rank_type = HandRankTypeNiuNiu.Niu6;
                    break;

                case 7:
                    rank_type = HandRankTypeNiuNiu.Niu7;
                    break;

                case 8:
                    rank_type = HandRankTypeNiuNiu.Niu8;
                    break;

                case 9:
                    rank_type = HandRankTypeNiuNiu.Niu9;
                    break;

                default:
                    break;
                }

                var best_cards = cards.Select(x => x.GetCardData()).OrderByDescending(x => x.type).ToList();
                return(new BestHandNiuNiu(rank_type, best_cards));
            }

            var bestCards = cards.Select(x => x.GetCardData()).OrderByDescending(x => x.type).ToList();

            return(new BestHandNiuNiu(HandRankTypeNiuNiu.HighCard, bestCards, bestCards));
        }