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 回答