Ejemplo n.º 1
0
 public bool Visit(ClueAboutRank clueAboutRank)
 {
     if (_stringBuilder.Length > 0)
     {
         _stringBuilder.Append(", ");
     }
     _stringBuilder.Append(clueAboutRank.Rank);
     return(true);
 }
Ejemplo n.º 2
0
        private IClueSituationStrategy FindClueToPlayOneRankedCard(IReadOnlyList <Player> players, IEnumerable <Card> expectedOneRankedCards)
        {
            var knownOneRankedCards = new List <Card>();

            var allOneRankedCards = new List <CardInHand>();

            foreach (var player in players)
            {
                var oneRankedCards = player
                                     .ShowCards(_clueGiver)
                                     .Where(cardInHand => expectedOneRankedCards.Contains(cardInHand.Card));

                allOneRankedCards = allOneRankedCards.Concat(oneRankedCards).ToList();

                var clueAboutOneRank = new ClueAboutRank(Rank.One);
                foreach (var card in oneRankedCards)
                {
                    if (player.GetCluesAboutCard(card).Any(c => clueAboutOneRank.Equals(c)))
                    {
                        knownOneRankedCards.Add(card.Card);
                    }
                }
            }

            var unknownOneRankedCards =
                expectedOneRankedCards
                .Except(knownOneRankedCards)
                .ToList();

            if (!unknownOneRankedCards.Any())
            {
                return(null);
            }


            var cardsToClue =
                allOneRankedCards.Where(cardInHand => unknownOneRankedCards.Contains(cardInHand.Card));

            if (!cardsToClue.Any())
            {
                return(null);
            }

            var playerToClue =
                cardsToClue
                .GroupBy(cih => cih.Player)
                .OrderByDescending(group => group.Count())
                .Select(group => group.Key)
                .First();

            var playerContext = new PlayerContext(playerToClue, playerToClue.ShowCards(_clueGiver));

            return(new OnlyClueExistsSituation(playerContext, new ClueAboutRank(Rank.One)));
        }
Ejemplo n.º 3
0
        private ClueType FindClueToDiscard(IPlayerContext playerContext, IEnumerable <Card> uniqueCards)
        {
            // сразу уберём карты, о которых игрок знает.
            var cardsToSearch = uniqueCards.Except(playerContext.Player.GetKnownCards()).ToList();

            if (!cardsToSearch.Any())
            {
                return(null);
            }

            var uniqueUnknownCards =
                playerContext
                .Hand
                .Where(cardInHand => cardsToSearch.Contains(cardInHand.Card))
                .ToList();

            if (!uniqueUnknownCards.Any())
            {
                return(null);
            }

            uniqueUnknownCards =
                uniqueUnknownCards
                .OrderBy(cardInHand => (int)cardInHand.Card.Rank)
                .ToList();

            // если игрок знает о пятёрке, то указывать на неё не будем
            var cardToClue =
                uniqueUnknownCards.FirstOrDefault(cardInHand => !KnownFiveRankedCards(cardInHand));

            if (cardToClue == null)
            {
                return(null);
            }

            return(ClueDetailInfo.CreateClues(cardToClue, playerContext).First());

            bool KnownFiveRankedCards(CardInHand cardInHand)
            {
                if (cardInHand.Card.Rank != Rank.Five)
                {
                    return(false);
                }

                var clueAboutFiveRank = new ClueAboutRank(Rank.Five);

                return
                    (playerContext
                     .GetCluesAboutCard(cardInHand)
                     .Any(clue => clueAboutFiveRank.Equals(clue)));
            }
        }
Ejemplo n.º 4
0
        public bool Visit(ClueAboutRank clueAboutRank)
        {
            foreach (var number in _provider.Ranks)
            {
                if (clueAboutRank.Rank == number)
                {
                    continue;
                }

                foreach (var color in _provider.Colors)
                {
                    _matrix[number, color] = 0;
                }
            }

            return(true);
        }
Ejemplo n.º 5
0
 private bool EqualsCore(ClueAboutRank clueAboutRank)
 {
     return(Rank == clueAboutRank.Rank);
 }