Exemple #1
0
        public Guess(IGameProvider provider, CardInHand cardInHand)
        {
            _provider  = provider;
            _converter = new CardsToMatrixConverter(provider);
            _matrix    = provider.CreateFullDeckMatrix();

            CardInHand = cardInHand;
        }
Exemple #2
0
        // карты, которые нельзя сбрасывать, для которых верно:
        // их нет в фейерверке;
        // они должны быть в фейерверке;
        // на руках или в колоде осталась всего одна такая карта.
        public IReadOnlyList <Card> GetUniqueCards(FireworkPile fireworkPile, DiscardPile discardPile)
        {
            if (fireworkPile == null)
            {
                throw new ArgumentNullException(nameof(fireworkPile));
            }
            if (discardPile == null)
            {
                throw new ArgumentNullException(nameof(discardPile));
            }

            Matrix resultMatrix = _provider.CreateFullDeckMatrix();

            // вычитаем сброшенные карты
            Matrix thrown = _converter.Encode(discardPile.Cards);

            foreach (var number in _provider.Ranks)
            {
                foreach (var color in _provider.Colors)
                {
                    if (resultMatrix[number, color] > 0 && thrown[number, color] > 0)
                    {
                        resultMatrix[number, color] -= thrown[number, color];
                    }
                }
            }

            // уберём недостижимые карты
            foreach (var color in _provider.Colors)
            {
                bool wasZero = false;
                foreach (var number in _provider.Ranks)
                {
                    if (!wasZero)
                    {
                        if (resultMatrix[number, color] == 0)
                        {
                            wasZero = true;
                        }
                    }
                    else
                    {
                        resultMatrix[number, color] = 0;
                    }
                }
            }

            // учтём сыгранные карты
            Matrix played = _converter.Encode(fireworkPile.Cards);

            foreach (var number in _provider.Ranks)
            {
                foreach (var color in _provider.Colors)
                {
                    if (played[number, color] == 1)
                    {
                        resultMatrix[number, color] = 0;
                    }
                }
            }

            // интересуют только те ячейки, в которых значение 1
            // остальные зануляем
            foreach (var number in _provider.Ranks)
            {
                foreach (var color in _provider.Colors)
                {
                    if (resultMatrix[number, color] != 1)
                    {
                        resultMatrix[number, color] = 0;
                    }
                }
            }

            // в итоге получили матрицу, в которой
            // 0 стоит у неуникальных карт,
            // 1 стоит у уникальных карт
            return(_converter.Decode(resultMatrix));
        }