コード例 #1
0
ファイル: Player.cs プロジェクト: IvanovAndrew/Hanabi
        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);
        }
コード例 #2
0
ファイル: Player.cs プロジェクト: IvanovAndrew/Hanabi
        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());
        }