Esempio n. 1
0
 public RoomState(int roomID)
 {
     RoomID            = roomID;
     CurrentGameState  = new GameState();
     CurrentHandState  = new CurrentHandState(this.CurrentGameState);
     CurrentTrickState = new CurrentTrickState();
     roomSetting       = new RoomSetting();
 }
Esempio n. 2
0
        /// <summary>
        /// </summary>
        /// <param name="handState"></param>
        /// <param name="lastTrickState">扣抵的牌</param>
        /// <returns></returns>
        public PlayerEntity NextRank(CurrentHandState handState, CurrentTrickState lastTrickState)
        {
            if (!Players.Exists(p => p.PlayerId == handState.Starter))
            {
                //log
                return(null);
            }


            if (handState.Rank != 9)
            {
                return(NextRank(handState.Starter, handState.Score));
            }
            if (handState.Score >= 80)
            {
                //主J勾到底

                var cardscp = new CurrentPoker(lastTrickState.ShowedCards[lastTrickState.LatestPlayerShowedCard()],
                                               handState.Trump, handState.Rank);
                if (cardscp.MasterRank > 0)
                {
                    foreach (PlayerEntity player in Players)
                    {
                        if (ArePlayersInSameTeam(handState.Starter,
                                                 player.PlayerId))
                        {
                            player.Rank = 0;
                        }
                    }
                }
                //副J勾一半
                else if (cardscp.SubRank > 0)
                {
                    foreach (PlayerEntity player in Players)
                    {
                        if (ArePlayersInSameTeam(handState.Starter,
                                                 player.PlayerId))
                        {
                            player.Rank = handState.Rank / 2;
                        }
                    }
                }

                return(GetNextPlayerAfterThePlayer(false, handState.Starter));
            }

            return(null);
        }
Esempio n. 3
0
        //确定谁的牌最大,支持部分玩家出了牌
        public static string GetWinnerWithoutAllShowedCards(CurrentTrickState trickState)
        {
            var  cp       = new CurrentPoker[4];
            Suit trump    = trickState.Trump;
            var  trumpInt = (int)trickState.Trump;
            int  rank     = trickState.Rank;

            cp[0] = new CurrentPoker(trickState.ShowedCards[trickState.Learder], trumpInt, rank);
            string nextPlayer1 = trickState.NextPlayer(trickState.Learder);

            cp[1] = new CurrentPoker(trickState.ShowedCards[nextPlayer1], trumpInt, rank);
            string nextPlayer2 = trickState.NextPlayer(nextPlayer1);

            cp[2] = new CurrentPoker(trickState.ShowedCards[nextPlayer2], trumpInt, rank);
            string nextPlayer3 = trickState.NextPlayer(nextPlayer2);

            cp[3] = new CurrentPoker(trickState.ShowedCards[nextPlayer3], trumpInt, rank);
            //cp[0].Sort();
            //cp[1].Sort();
            //cp[2].Sort();
            //cp[3].Sort();

            int leadingCardsCount = trickState.ShowedCards[trickState.Learder].Count;
            int winderNumber      = 0;
            var leadingSuit       = (int)trickState.LeadingSuit;


            List <int> leadingTractor = cp[0].GetTractorOfAnySuit();

            //甩牌 拖拉机
            if ((leadingTractor.Count > 1) && (cp[0].Count > leadingTractor.Count * 2)) //甩拖拉机
            {
                int maxCard = leadingTractor[0];
                if (trickState.ShowedCards[nextPlayer1].Count > 0)
                {
                    List <int> tractor1 = cp[1].GetTractor(trump);
                    if (tractor1.Count >= leadingTractor.Count &&
                        (!cp[1].IsMixed() && cp[1].GetPairs().Count >= cp[0].GetPairs().Count))
                    {
                        int tmpMax = tractor1[0];
                        if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                        {
                            winderNumber = 1;
                            maxCard      = tmpMax;
                        }
                    }
                }
                if (trickState.ShowedCards[nextPlayer2].Count > 0)
                {
                    List <int> tractor2 = cp[2].GetTractor(trump);
                    if (tractor2.Count >= leadingTractor.Count &&
                        (!cp[2].IsMixed() && cp[2].GetPairs().Count >= cp[0].GetPairs().Count))
                    {
                        int tmpMax = tractor2[0];
                        if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                        {
                            winderNumber = 2;
                            maxCard      = tmpMax;
                        }
                    }
                }
                if (trickState.ShowedCards[nextPlayer3].Count > 0)
                {
                    List <int> tractor3 = cp[3].GetTractor(trump);
                    if (tractor3.Count >= leadingTractor.Count &&
                        (!cp[3].IsMixed() && cp[3].GetPairs().Count >= cp[0].GetPairs().Count))
                    {
                        int tmpMax = tractor3[0];
                        if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                        {
                            winderNumber = 3;
                        }
                    }
                }
            }
            //甩牌 对
            else if ((2 < leadingCardsCount) && (cp[0].GetPairs().Count > 0) && leadingTractor.Count < 2)
            {
                int maxCard = CommonMethods.GetMaxCard(cp[0].GetPairs(), trump, rank);
                if (trickState.ShowedCards[nextPlayer1].Count > 0)
                {
                    if (cp[1].GetPairs().Count >= cp[0].GetPairs().Count&& (!cp[1].IsMixed()))
                    {
                        int tmpMax = CommonMethods.GetMaxCard(cp[1].GetPairs(), trump, rank);
                        if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                        {
                            winderNumber = 1;
                            maxCard      = tmpMax;
                        }
                    }
                }
                if (trickState.ShowedCards[nextPlayer2].Count > 0)
                {
                    if (cp[2].GetPairs().Count >= cp[0].GetPairs().Count&& (!cp[2].IsMixed()))
                    {
                        int tmpMax = CommonMethods.GetMaxCard(cp[2].GetPairs(), trump, rank);
                        if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                        {
                            winderNumber = 2;
                            maxCard      = tmpMax;
                        }
                    }
                }
                if (trickState.ShowedCards[nextPlayer3].Count > 0)
                {
                    if (cp[3].GetPairs().Count >= cp[0].GetPairs().Count&& (!cp[3].IsMixed()))
                    {
                        int tmpMax = CommonMethods.GetMaxCard(cp[3].GetPairs(), trump, rank);
                        if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                        {
                            winderNumber = 3;
                        }
                    }
                }
            }
            //甩多个单张牌
            else if ((leadingCardsCount > 1) && (cp[0].GetPairs().Count == 0))
            {
                int maxCard = CommonMethods.GetMaxCard(trickState.ShowedCards[trickState.Learder], trump, rank);
                int tmpMax  = 0;
                if (trickState.ShowedCards[nextPlayer1].Count > 0)
                {
                    tmpMax = CommonMethods.GetMaxCard(trickState.ShowedCards[nextPlayer1], trump, rank);
                    if (cp[1].GetSuitCardsWithJokerAndRank(trumpInt).Count() ==
                        trickState.ShowedCards[trickState.Learder].Count)
                    {
                        if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                        {
                            winderNumber = 1;
                            maxCard      = tmpMax;
                        }
                    }
                }
                if (trickState.ShowedCards[nextPlayer2].Count > 0)
                {
                    if (cp[2].GetSuitCardsWithJokerAndRank(trumpInt).Count() ==
                        trickState.ShowedCards[trickState.Learder].Count)
                    {
                        tmpMax = CommonMethods.GetMaxCard(trickState.ShowedCards[nextPlayer2], trump, rank);
                        if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                        {
                            winderNumber = 2;
                            maxCard      = tmpMax;
                        }
                    }
                }
                if (trickState.ShowedCards[nextPlayer3].Count > 0)
                {
                    if (cp[3].GetSuitCardsWithJokerAndRank(trumpInt).Count() ==
                        trickState.ShowedCards[trickState.Learder].Count)
                    {
                        tmpMax = CommonMethods.GetMaxCard(trickState.ShowedCards[nextPlayer3], trump, rank);
                        if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                        {
                            winderNumber = 3;
                        }
                    }
                }
            }
            //拖拉机
            else if (leadingTractor.Count > 1)
            {
                //如果有拖拉机
                List <int> tractor0 = cp[0].GetTractorOfAnySuit();
                List <int> tractor1 = null;
                List <int> tractor2 = null;
                List <int> tractor3 = null;
                if (trickState.ShowedCards[nextPlayer1].Count > 0)
                {
                    tractor1 = cp[1].GetTractorOfAnySuit();
                }
                if (trickState.ShowedCards[nextPlayer2].Count > 0)
                {
                    tractor2 = cp[2].GetTractorOfAnySuit();
                }
                if (trickState.ShowedCards[nextPlayer3].Count > 0)
                {
                    tractor3 = cp[3].GetTractorOfAnySuit();
                }
                int maxCard = tractor0[0];
                if (trickState.ShowedCards[nextPlayer1].Count > 0)
                {
                    if (tractor1.Count >= tractor0.Count)
                    {
                        int tmpMax = tractor1[0];
                        if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                        {
                            winderNumber = 1;
                            maxCard      = tmpMax;
                        }
                    }
                }
                if (trickState.ShowedCards[nextPlayer2].Count > 0)
                {
                    if (tractor2.Count >= tractor0.Count)
                    {
                        int tmpMax = tractor2[0];
                        if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                        {
                            winderNumber = 2;
                            maxCard      = tmpMax;
                        }
                    }
                }
                if (trickState.ShowedCards[nextPlayer3].Count > 0)
                {
                    if (tractor3.Count >= tractor0.Count)
                    {
                        int tmpMax = tractor3[0];
                        if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                        {
                            winderNumber = 3;
                        }
                    }
                }
            }

            else if (cp[0].GetPairs().Count == 1 && (leadingCardsCount == 2)) //如果有一个对
            {
                var maxCard = (int)cp[0].GetPairs()[0];
                if (trickState.ShowedCards[nextPlayer1].Count > 0)
                {
                    if (cp[1].GetPairs().Count > 0)
                    {
                        var tmpMax = (int)cp[1].GetPairs()[0];
                        if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                        {
                            winderNumber = 1;
                            maxCard      = tmpMax;
                        }
                    }
                }
                if (trickState.ShowedCards[nextPlayer2].Count > 0)
                {
                    if (cp[2].GetPairs().Count > 0)
                    {
                        var tmpMax = (int)cp[2].GetPairs()[0];
                        if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                        {
                            winderNumber = 2;
                            maxCard      = tmpMax;
                        }
                    }
                }
                if (trickState.ShowedCards[nextPlayer3].Count > 0)
                {
                    if (cp[3].GetPairs().Count > 0)
                    {
                        var tmpMax = (int)cp[3].GetPairs()[0];
                        if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                        {
                            winderNumber = 3;
                        }
                    }
                }
            }
            else if (leadingCardsCount == 1) //如果是单张牌
            {
                int maxCard = trickState.ShowedCards[trickState.Learder][0];
                int tmpMax  = 0;
                if (trickState.ShowedCards[nextPlayer1].Count > 0)
                {
                    tmpMax = trickState.ShowedCards[nextPlayer1][0];
                    if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                    {
                        winderNumber = 1;
                        maxCard      = tmpMax;
                    }
                }
                if (trickState.ShowedCards[nextPlayer2].Count > 0)
                {
                    tmpMax = trickState.ShowedCards[nextPlayer2][0];
                    if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                    {
                        winderNumber = 2;
                        maxCard      = tmpMax;
                    }
                }
                if (trickState.ShowedCards[nextPlayer3].Count > 0)
                {
                    tmpMax = trickState.ShowedCards[nextPlayer3][0];
                    if (!CommonMethods.CompareTo(maxCard, tmpMax, trumpInt, rank, leadingSuit))
                    {
                        winderNumber = 3;
                    }
                }
            }

            string winner = "";

            switch (winderNumber)
            {
            case 0:
                winner = trickState.Learder;
                break;

            case 1:
                winner = nextPlayer1;
                break;

            case 2:
                winner = nextPlayer2;
                break;

            case 3:
                winner = nextPlayer3;
                break;
            }

            return(winner);
        }
Esempio n. 4
0
        /// <summary>
        ///     判断玩家出的牌是否合法
        ///     不能检查甩牌是否成功
        /// </summary>
        /// <param name="currentTrickState">这回和出牌的状态</param>
        /// <param name="selectedCards">玩家选择的牌</param>
        /// <param name="currentCards">玩家的牌(包括选择的)</param>
        /// <returns></returns>
        public static ShowingCardsValidationResult IsValid(CurrentTrickState currentTrickState, List <int> selectedCards,
                                                           CurrentPoker currentCards)
        {
            //玩家选择牌之后剩下的牌
            var leftCardsCp = (CurrentPoker)currentCards.Clone();

            foreach (int card in selectedCards)
            {
                leftCardsCp.RemoveCard(card);
            }

            var showingCardsCp = new CurrentPoker();

            showingCardsCp.TrumpInt = (int)currentCards.Trump;
            showingCardsCp.Rank     = currentCards.Rank;
            foreach (int showingCard in selectedCards)
            {
                showingCardsCp.AddCard(showingCard);
            }
            //showingCardsCp.Sort();

            var leadingCardsCp = new CurrentPoker();

            leadingCardsCp.TrumpInt = (int)currentCards.Trump;
            leadingCardsCp.Rank     = currentCards.Rank;
            foreach (int card in currentTrickState.LeadingCards)
            {
                leadingCardsCp.AddCard(card);
            }
            // leadingCardsCp.Sort();

            //the first player to show cards
            if (!currentTrickState.IsStarted())
            {
                if (showingCardsCp.Count > 0 && !showingCardsCp.IsMixed())
                {
                    if (selectedCards.Count == 1) //如果是单张牌
                    {
                        return(new ShowingCardsValidationResult {
                            ResultType = ShowingCardsValidationResultType.Valid
                        });
                    }
                    if (selectedCards.Count == 2 && (showingCardsCp.GetPairs().Count == 1)) //如果是一对
                    {
                        return(new ShowingCardsValidationResult {
                            ResultType = ShowingCardsValidationResultType.Valid
                        });
                    }
                    if ((showingCardsCp.GetTractorOfAnySuit().Count > 1) &&
                        selectedCards.Count == showingCardsCp.GetTractorOfAnySuit().Count *2) //如果是拖拉机
                    {
                        return(new ShowingCardsValidationResult {
                            ResultType = ShowingCardsValidationResultType.Valid
                        });
                    }
                    return(new ShowingCardsValidationResult {
                        ResultType = ShowingCardsValidationResultType.TryToDump
                    });
                }
            }

            //牌的数量
            if (currentTrickState.LeadingCards.Count != selectedCards.Count)
            {
                return new ShowingCardsValidationResult {
                           ResultType = ShowingCardsValidationResultType.Invalid
                }
            }
            ;

            //得到第一个家伙出的花色
            Suit leadingSuit = currentTrickState.LeadingSuit;
            bool isTrump     = PokerHelper.IsTrump(currentTrickState.LeadingCards[0], currentCards.Trump, currentCards.Rank);

            if (isTrump)
            {
                leadingSuit = currentCards.Trump;
            }

            //如果出的牌混合的,则判断手中是否还剩出的花色,如果剩,false;如果不剩;true
            if (showingCardsCp.IsMixed())
            {
                if (leftCardsCp.HasSomeCards((int)leadingSuit))
                {
                    return(new ShowingCardsValidationResult {
                        ResultType = ShowingCardsValidationResultType.Invalid
                    });
                }
                return(new ShowingCardsValidationResult {
                    ResultType = ShowingCardsValidationResultType.Valid
                });
            }

            //出的牌的花色
            Suit mysuit = PokerHelper.GetSuit(selectedCards[0]);

            isTrump = PokerHelper.IsTrump(selectedCards[0], currentCards.Trump, currentCards.Rank);
            if (isTrump)
            {
                mysuit = currentCards.Trump;
            }


            //花色是否一致
            if (mysuit != leadingSuit)
            {
                //而且确实没有此花色
                if (leftCardsCp.HasSomeCards((int)leadingSuit))
                {
                    return(new ShowingCardsValidationResult {
                        ResultType = ShowingCardsValidationResultType.Invalid
                    });
                }
                return(new ShowingCardsValidationResult {
                    ResultType = ShowingCardsValidationResultType.Valid
                });
            }

            //别人如果出对,我也应该出对
            int leadingCardsPairs  = leadingCardsCp.GetPairs().Count;
            int selectedCardsPairs = showingCardsCp.GetPairs().Count;
            int holdingCardsPairs  = currentCards.GetPairs((int)leadingSuit).Count;


            //2.如果别人出拖拉机,我如果有,也应该出拖拉机
            if (leadingCardsCp.HasTractors())
            {
                if ((!showingCardsCp.HasTractors()) && (currentCards.GetTractor((int)leadingSuit) > -1))
                {
                    return(new ShowingCardsValidationResult {
                        ResultType = ShowingCardsValidationResultType.Invalid
                    });
                }
                if ((selectedCardsPairs < leadingCardsPairs) && (holdingCardsPairs > selectedCardsPairs))
                //出的对比第一个玩家少,而且没有出所有的对
                {
                    return(new ShowingCardsValidationResult {
                        ResultType = ShowingCardsValidationResultType.Invalid
                    });
                }
                return(new ShowingCardsValidationResult {
                    ResultType = ShowingCardsValidationResultType.Valid
                });
            }


            if (leadingCardsPairs > 0)
            {
                //如果对出的不够多,而且没有出所有的对
                if ((holdingCardsPairs > selectedCardsPairs) && (selectedCardsPairs < leadingCardsPairs))
                {
                    return(new ShowingCardsValidationResult {
                        ResultType = ShowingCardsValidationResultType.Invalid
                    });
                }
                return(new ShowingCardsValidationResult {
                    ResultType = ShowingCardsValidationResultType.Valid
                });
            }


            return(new ShowingCardsValidationResult {
                ResultType = ShowingCardsValidationResultType.Valid
            });
        }
Esempio n. 5
0
        //先手
        public static void ShouldSelectedCards(List <int> selectedCards, CurrentTrickState currentTrickState, CurrentPoker currentPoker)
        {
            var currentCards   = (CurrentPoker)currentPoker.Clone();
            var allSuitCardsCp = (CurrentPoker)currentPoker.Clone();
            var allSuitCards   = allSuitCardsCp.Cards;
            var maxValue       = currentPoker.Rank == 12 ? 11 : 12;

            //先出A
            foreach (Suit st in Enum.GetValues(typeof(Suit)))
            {
                if (st == Suit.None || st == Suit.Joker || st == currentCards.Trump)
                {
                    continue;
                }
                int maxCards = currentCards.GetMaxCards((int)st);
                if (maxCards % 13 == maxValue && allSuitCards[maxCards] == 1)
                {
                    selectedCards.Add(maxCards);
                    return;
                }
                //dumping causing concurrency issue, TODO: use timer tick
                //if (maxCards % 13 == maxValue)
                //{
                //    while (maxCards % 13 > 0 && allSuitCards[maxCards] == 2 || maxCards == currentTrickState.Rank)
                //    {
                //    if(maxCards != currentTrickState.Rank){
                //        selectedCards.Add(maxCards);
                //        selectedCards.Add(maxCards);
                //    }
                //        maxCards--;
                //    }
                //    selectedCards.Add(maxCards);
                //    if (allSuitCards[maxCards] == 2) selectedCards.Add(maxCards);
                //    return;
                //}
            }
            //再出对子
            foreach (Suit st in Enum.GetValues(typeof(Suit)))
            {
                if (st == Suit.None || st == Suit.Joker || st == currentCards.Trump)
                {
                    continue;
                }
                List <int> currentTractors = currentCards.GetTractor(st);
                if (currentTractors.Count > 1)
                {
                    foreach (int tr in currentTractors)
                    {
                        selectedCards.Add(tr);
                        selectedCards.Add(tr);
                    }
                    return;
                }
                var currentPairs = currentCards.GetPairs((int)st);
                if (currentPairs.Count > 0)
                {
                    selectedCards.Add((int)currentPairs[currentPairs.Count - 1]);
                    selectedCards.Add((int)currentPairs[currentPairs.Count - 1]);
                    return;
                }
            }


            List <int> masterTractors = currentCards.GetTractor(currentTrickState.Trump);

            if (masterTractors.Count > 1)
            {
                foreach (int tr in masterTractors)
                {
                    selectedCards.Add(tr);
                    selectedCards.Add(tr);
                }
                return;
            }

            var masterPair = currentCards.GetPairs((int)currentTrickState.Trump);

            if (masterPair.Count > 0)
            {
                selectedCards.Add((int)masterPair[masterPair.Count - 1]);
                selectedCards.Add((int)masterPair[masterPair.Count - 1]);
                return;
            }

            int minMaster = currentCards.GetMinMasterCards((int)currentTrickState.Trump);

            if (minMaster >= 0)
            {
                selectedCards.Add(minMaster);
                return;
            }

            //其他花色的牌
            for (int i = 0; i < allSuitCards.Length; i++)
            {
                if (allSuitCards[i] > 0)
                {
                    selectedCards.Add(i);
                    return;
                }
            }
        }
Esempio n. 6
0
        //跟选:在有必选牌的情况下自动选择必选牌,方便玩家快捷出牌
        public static void MustSelectedCardsNoShow(List <int> selectedCards, CurrentTrickState currentTrickState, CurrentPoker currentPoker)
        {
            var currentCards   = (CurrentPoker)currentPoker.Clone();
            var leadingCardsCp = new CurrentPoker();

            leadingCardsCp.TrumpInt = (int)currentTrickState.Trump;
            leadingCardsCp.Rank     = currentTrickState.Rank;
            foreach (int card in currentTrickState.LeadingCards)
            {
                leadingCardsCp.AddCard(card);
            }

            Suit leadingSuit = currentTrickState.LeadingSuit;
            bool isTrump     = PokerHelper.IsTrump(currentTrickState.LeadingCards[0], currentCards.Trump, currentCards.Rank);

            if (isTrump)
            {
                leadingSuit = currentCards.Trump;
            }

            selectedCards.Clear();
            List <int> currentSuitCards = currentCards.GetSuitCardsWithJokerAndRank((int)leadingSuit).ToList <int>();

            List <int> leadingTractors = leadingCardsCp.GetTractor(leadingSuit);
            var        leadingPairs    = leadingCardsCp.GetPairs((int)leadingSuit);

            //如果别人出拖拉机,则选择我手中相同花色的拖拉机
            List <int> currentTractors = currentCards.GetTractor(leadingSuit);

            if (currentTractors.Count <= leadingTractors.Count)
            {
                for (int i = 0; i < leadingTractors.Count && i < currentTractors.Count && selectedCards.Count < leadingCardsCp.Count; i++)
                {
                    selectedCards.Add(currentTractors[i]);
                    selectedCards.Add(currentTractors[i]);
                    currentSuitCards.Remove(currentTractors[i]);
                    currentSuitCards.Remove(currentTractors[i]);
                    leadingPairs.Remove(currentTractors[i]);
                }
            }
            //如果别人出对子,则选择我手中相同花色的对子
            var currentPairs = currentCards.GetPairs((int)leadingSuit);

            if (currentPairs.Count <= leadingPairs.Count)
            {
                for (int i = 0; i < leadingPairs.Count && i < currentPairs.Count && selectedCards.Count < leadingCardsCp.Count; i++)
                {
                    if (selectedCards.Contains((int)currentPairs[i]))
                    {
                        continue;
                    }
                    selectedCards.Add((int)currentPairs[i]);
                    selectedCards.Add((int)currentPairs[i]);
                    currentSuitCards.Remove((int)currentPairs[i]);
                    currentSuitCards.Remove((int)currentPairs[i]);
                }
            }
            //如果别人出单张,则选择我手中相同花色的单张
            if (currentSuitCards.Count() <= leadingCardsCp.Count - selectedCards.Count)
            {
                selectedCards.AddRange(currentSuitCards);
            }
        }
Esempio n. 7
0
        //跟出
        public static void MustSelectedCards(List <int> selectedCards, CurrentTrickState currentTrickState, CurrentPoker currentPoker)
        {
            var currentCards   = (CurrentPoker)currentPoker.Clone();
            var leadingCardsCp = new CurrentPoker();

            leadingCardsCp.TrumpInt = (int)currentTrickState.Trump;
            leadingCardsCp.Rank     = currentTrickState.Rank;
            foreach (int card in currentTrickState.LeadingCards)
            {
                leadingCardsCp.AddCard(card);
            }

            Suit leadingSuit = currentTrickState.LeadingSuit;
            bool isTrump     = PokerHelper.IsTrump(currentTrickState.LeadingCards[0], currentCards.Trump, currentCards.Rank);

            if (isTrump)
            {
                leadingSuit = currentCards.Trump;
            }


            selectedCards.Clear();
            var allSuitCardsCp = (CurrentPoker)currentPoker.Clone();
            var allSuitCards   = allSuitCardsCp.Cards;

            List <int> leadingTractors = leadingCardsCp.GetTractor(leadingSuit);
            var        leadingPairs    = leadingCardsCp.GetPairs((int)leadingSuit);

            //如果别人出拖拉机,我如果有,也应该出拖拉机
            List <int> currentTractors = currentCards.GetTractor(leadingSuit);

            for (int i = 0; i < leadingTractors.Count && i < currentTractors.Count && selectedCards.Count < leadingCardsCp.Count; i++)
            {
                selectedCards.Add(currentTractors[i]);
                selectedCards.Add(currentTractors[i]);
                allSuitCards[currentTractors[i]] -= 2;
                leadingPairs.Remove(currentTractors[i]);
            }
            //对子
            var currentPairs = currentCards.GetPairs((int)leadingSuit);

            for (int i = 0; i < leadingPairs.Count && i < currentPairs.Count && selectedCards.Count < leadingCardsCp.Count; i++)
            {
                if (selectedCards.Contains((int)currentPairs[i]))
                {
                    continue;
                }
                selectedCards.Add((int)currentPairs[i]);
                selectedCards.Add((int)currentPairs[i]);
                allSuitCards[(int)currentPairs[i]] -= 2;
            }
            //单张先跳过对子
            var currentSuitCards = currentCards.GetSuitCardsWithJokerAndRank((int)leadingSuit);

            for (int i = 0; i < currentSuitCards.Length && selectedCards.Count < leadingCardsCp.Count; i++)
            {
                if (currentPairs.Contains(currentSuitCards[i]) || allSuitCards[(int)currentSuitCards[i]] <= 0)
                {
                    continue;
                }
                selectedCards.Add(currentSuitCards[i]);
                allSuitCards[(int)currentSuitCards[i]]--;
            }
            //单张
            for (int i = 0; i < currentSuitCards.Length && selectedCards.Count < leadingCardsCp.Count; i++)
            {
                if (allSuitCards[currentSuitCards[i]] <= 0)
                {
                    continue;
                }
                selectedCards.Add(currentSuitCards[i]);
                allSuitCards[(int)currentSuitCards[i]]--;
            }
            //其他花色的牌先跳过所有主牌,和副牌对子,即副牌单张
            for (int i = 0; i < allSuitCards.Length && selectedCards.Count < leadingCardsCp.Count; i++)
            {
                bool isITrump = PokerHelper.IsTrump(i, currentCards.Trump, currentCards.Rank);
                if (isITrump || allSuitCards[i] <= 0 || allSuitCards[i] == 2)
                {
                    continue;
                }
                selectedCards.Add(i);
                allSuitCards[i]--;
            }
            //其他花色的牌跳过所有主牌
            for (int i = 0; i < allSuitCards.Length && selectedCards.Count < leadingCardsCp.Count; i++)
            {
                bool isITrump = PokerHelper.IsTrump(i, currentCards.Trump, currentCards.Rank);
                if (isITrump || allSuitCards[i] <= 0)
                {
                    continue;
                }
                while (allSuitCards[i] > 0 && selectedCards.Count < leadingCardsCp.Count)
                {
                    selectedCards.Add(i);
                    allSuitCards[i]--;
                }
            }
            //其他花色的牌先跳过对子
            for (int i = 0; i < allSuitCards.Length && selectedCards.Count < leadingCardsCp.Count; i++)
            {
                if (allSuitCards[i] <= 0 || allSuitCards[i] == 2)
                {
                    continue;
                }
                selectedCards.Add(i);
                allSuitCards[i]--;
            }
            //其他花色的牌
            for (int i = 0; i < allSuitCards.Length && selectedCards.Count < leadingCardsCp.Count; i++)
            {
                while (allSuitCards[i] > 0 && selectedCards.Count < leadingCardsCp.Count)
                {
                    selectedCards.Add(i);
                    allSuitCards[i]--;
                }
            }
        }