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); }
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); }