public void ListenClue(Clue clue) { if (clue == null) { throw new ArgumentNullException(nameof(clue)); } if (!clue.Type.IsStraightClue) { throw new IncorrectClueException("You can give clues only about Rank IS or Nominal IS type"); } // эвристика if (clue.IsSubtleClue(FireworkPile.GetExpectedCards())) { Logger.Log.Info("It's a subtle clue"); _specialCards.Add(clue.Cards.First()); } _memory.Update(clue); }
private CardInHand GetCardToPlay() { // cards we need to play var neededCards = FireworkPile.GetExpectedCards(); List <CardInHand> cardsToPlay = new List <CardInHand>(); if (_specialCards.Count > 0) { Logger.Log.Info("Use a subtle clue"); var cardToPlay = _specialCards.First(); _specialCards.RemoveAt(0); if (neededCards.Any(c => cardToPlay.Card == c)) { return(cardToPlay); } } // получить список карт, которые уже сброшены или находятся на руках у других игроков var excludedCards = _pilesAnalyzer.GetThrownCards(FireworkPile, DiscardPile) .Concat(GetOtherPlayersCards().Select(cardInHand => cardInHand.Card)); // поискать у себя карты из списка нужных foreach (Guess guess in Guesses) { var probability = guess.GetProbability(neededCards, excludedCards); if (probability > PlayProbabilityThreshold) { cardsToPlay.Add(_memory.GetCardByGuess(guess)); } } // эвристика: // если игрок знает, что у него есть единица, то пусть играет ей. // при условии, что ещё нужны единицы if ( FireworkPile.GetExpectedCards().Any(card => card.Rank == Rank.One) && cardsToPlay.Count == 0 && BlowCounter > 1) { CardInHand card = GetCardWithRankOneToPlay(); if (card != null) { Logger.Log.Info("I know that I have One. I'll try to play it."); cardsToPlay.Add(card); } } if (cardsToPlay.Count == 0) { return(null); } cardsToPlay = cardsToPlay .OrderBy(card => (int)card.Card.Rank) .ToList(); return(cardsToPlay.Last().Card.Rank == Rank.Five ? cardsToPlay.Last() : cardsToPlay.First()); }