public bool Visit(ClueAboutRank clueAboutRank) { if (_stringBuilder.Length > 0) { _stringBuilder.Append(", "); } _stringBuilder.Append(clueAboutRank.Rank); return(true); }
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))); }
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))); } }
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); }
private bool EqualsCore(ClueAboutRank clueAboutRank) { return(Rank == clueAboutRank.Rank); }