0

これまでのところ、私はこのコードを持っています

public class Card
{
    public int suitID;
    public int cardValue;
}

public class DeckManager
{
    private List<List<Card>> FindCardsPerSuit(List<Card> cards)
    {
        var _cardsCombination = cards
                                .GroupBy(x => x.cardValue)
                                .Where(g => g.Count() > 2)
                                .Select(c => c.ToList())
                                .ToList();

        return _cardsCombination;
    }
}

私はラミー カード ゲームに取り組んでいます。私がやろうとしているのは、プレイヤーがプレイしたいカードの組み合わせが有効かどうかを調べることです。

プレーヤーが手札からいくつかのカードを選択するとき、同じ値を持つカードが一意のスーツを持っているかどうかを確認する必要があります。そうでない場合は、新しいリストに追加します。

ラミーカードの組み合わせ

例: プレイヤーは 8 枚のカードをすべて同じ値で異なるスーツを持っています。最小組み合わせは 4 であるため、2 つの組み合わせを実行できます。2 つのデッキでプレイするため、スーツごとに 2 枚のカードがあります。

組み合わせのリストのリストを作成するかどうかを確認するにはどうすればよいですか?

現時点では、_cardsCombination クエリは選択されたすべてのカードを取得し、同じ値を持つすべてのカードで小さなグループを作成します。どうすれば同じことを行い、スーツが重複している各カードのサブグループを作成できますか?

ありがとうございました。

4

1 に答える 1

1
var _cardsCombination = cards
    .GroupBy(x => x.cardValue)
    .SelectMany(g => {
        // group cards by suit
        var cardsPerSuit = g.GroupBy(c => c.suitId);
            
        // max number of cards with same suit (will be 1 or 2 for two decks)
        // this will be number of subsets
        var maxCardsPerSuit = cardsPerSuit.Max(gg => gg.Count());
        
        return Enumerable
            // create subset for each setNumber from 0 to maxCardsPerSuit - 1
            .Range(0, maxCardsPerSuit)
            .Select(setNumber => cardsPerSuit
                // take nth card from each suit
                .Select(s => s.ElementAtOrDefault(setNumber))
                // skip nulls
                .Where(s => s != null)
            );
    })
    .Where(g => g.Count() > 2)
    .Select(c => c.ToList())
    .ToList();
于 2020-06-26T09:40:40.273 に答える