public Guess(IGameProvider provider, CardInHand cardInHand) { _provider = provider; _converter = new CardsToMatrixConverter(provider); _matrix = provider.CreateFullDeckMatrix(); CardInHand = cardInHand; }
// карты, которые нельзя сбрасывать, для которых верно: // их нет в фейерверке; // они должны быть в фейерверке; // на руках или в колоде осталась всего одна такая карта. 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)); }