Esempio n. 1
0
        private IList <PlayAction> GetValidPlayActions()
        {
            if (StickResult != null)
            {
                return(new List <PlayAction>());
            }
            var allHandPlayActionList = PlayerHandDictionary[CurrentPlayer.PlayerId].Cards
                                        .Select(c => new PlayAction
            {
                PlayerInfo = CurrentPlayer,
                Card       = c
            })
                                        .ToList();

            if (!StickSuit.HasValue)
            {
                //Case nothing played yet
                return(allHandPlayActionList);
            }
            var cardComparer      = GetCardComparer();
            var highestPlayedCard = PlayActionList
                                    .OrderByDescending(a => a.Card, cardComparer)
                                    .Select(a => a.Card)
                                    .First();
            var canUnderTrump = PlayType.IsTrump() &&
                                allHandPlayActionList
                                .All(a => a.Card.CardSuit == PlayType.GetTrumpSuit()) &&
                                allHandPlayActionList
                                .All(a => a.Card.CardRank == CardRank.Jack || cardComparer.Compare(a.Card, highestPlayedCard) < 0);
            var hasSameSuitCardBesidesTrumpJack = allHandPlayActionList
                                                  .Any(a => a.Card.CardSuit == StickSuit.Value &&
                                                       !(PlayType.IsTrump() && a.Card.CardSuit == PlayType.GetTrumpSuit() && a.Card.CardRank == CardRank.Jack));
            var validPlayActions = allHandPlayActionList
                                   .Where(a =>
            {
                var isTrump = PlayType.IsTrump() && a.Card.CardSuit == PlayType.GetTrumpSuit();
                var isHigherThenPlayedCard = cardComparer.Compare(a.Card, highestPlayedCard) > 0;

                //disjoint condition list
                var isSameSuit = a.Card.CardSuit == StickSuit.Value;
                var isHigherNonSuitTrumpCard      = !isSameSuit && isTrump && isHigherThenPlayedCard;
                var isLowerNonSuitUnderTrumpCard  = !isSameSuit && isTrump && !isHigherThenPlayedCard && canUnderTrump;
                var isPlayableNonSuitNonTrumpCard = !isSameSuit && !hasSameSuitCardBesidesTrumpJack;

                var isValid = isSameSuit ||
                              isHigherNonSuitTrumpCard ||
                              isLowerNonSuitUnderTrumpCard ||
                              isPlayableNonSuitNonTrumpCard;
                return(isValid);
            })
                                   .ToList();

            return(validPlayActions);
        }
Esempio n. 2
0
        private StickResult GetStickResult()
        {
            if (!StickSuit.HasValue || PlayActionList.Count != 4)
            {
                return(null);
            }
            var winner = PlayActionList
                         .OrderByDescending(a => a.Card, GetCardComparer())
                         .First()
                         .PlayerInfo;
            var cardList = PlayActionList
                           .Select(a => a.Card)
                           .ToList();
            var stickResult = new StickResult
            {
                Winner    = winner,
                StickPile = cardList
            };

            return(stickResult);
        }