c# - 生成一手扑克牌的所有不同的 7 张牌组合?

标签 c# combinations permutation poker

我正在尝试生成扑克牌的所有不同组合,如下所述:

Generating all 5 card poker hands

但我总是卡住。当在上述 URL 尝试 NickLarsen 的 C# 答案时,我在第 49 行收到未处理的异常错误。(https://stackoverflow.com/a/3832781/689881)

我想要的很简单:生成所有卡片组合并在一个简单的 .txt 文件中一次打印一行

此外,我实际上想要所有 7 个卡片组合(而不是 5 个)。 例如,前两行可能如下所示:

2c2d2h2s3c3d3h
2c2d2h2s3c3d3s

我如何实现这一目标?速度并不那么重要。

下面是 NickLarsen 的代码(经过我的修改)失败了:

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication20
{
struct Card
{
    public int Suit { get; set; }
    public int Rank { get; set; }
}

class Program
{
    static int ranks = 13;
    static int suits = 4;
    static int cardsInHand = 7;

    static void Main(string[] args)
    {
        List<Card> cards = new List<Card>();
        //cards.Add(new Card() { Rank = 0, Suit = 0 });
        int numHands = GenerateAllHands(cards);

        Console.WriteLine(numHands);
        Console.ReadLine();
    }

    static int GenerateAllHands(List<Card> cards)
    {
        if (cards.Count == cardsInHand) return 1;

        List<Card> possibleNextCards = GetPossibleNextCards(cards);

        int numSubHands = 0;

        foreach (Card card in possibleNextCards)
        {
            List<Card> possibleNextHand = cards.ToList(); // copy list
            possibleNextHand.Add(card);
            numSubHands += GenerateAllHands(possibleNextHand);
        }

        return numSubHands;
    }

    static List<Card> GetPossibleNextCards(List<Card> hand)
    {
        int maxRank = hand.Max(x => x.Rank);

        List<Card> result = new List<Card>();

        // only use ranks >= max
        for (int rank = maxRank; rank < ranks; rank++)
        {
            List<int> suits = GetPossibleSuitsForRank(hand, rank);
            var possibleNextCards = suits.Select(x => new Card { Rank = rank, Suit = x });
            result.AddRange(possibleNextCards);
        }

        return result;
    }

    static List<int> GetPossibleSuitsForRank(List<Card> hand, int rank)
    {
        int maxSuit = hand.Max(x => x.Suit);

        // select number of ranks of different suits
        int[][] card = GetArray(hand, rank);

        for (int i = 0; i < suits; i++)
        {
            card[i][rank] = 0;
        }

        int[][] handRep = GetArray(hand, rank);

        // get distinct rank sets, then find which ranks they correspond to
        IEnumerable<int[]> distincts = card.Distinct(new IntArrayComparer());

        List<int> possibleSuits = new List<int>();

        foreach (int[] row in distincts)
        {
            for (int i = 0; i < suits; i++)
            {
                if (IntArrayComparer.Compare(row, handRep[i]))
                {
                    possibleSuits.Add(i);
                    break;
                }
            }
        }

        return possibleSuits;
    }

    class IntArrayComparer : IEqualityComparer<int[]>
    {
        #region IEqualityComparer<int[]> Members

        public static bool Compare(int[] x, int[] y)
        {
            for (int i = 0; i < x.Length; i++)
            {
                if (x[i] != y[i]) return false;
            }

            return true;
        }

        public bool Equals(int[] x, int[] y)
        {
            return Compare(x, y);
        }

        public int GetHashCode(int[] obj)
        {
            return 0;
        }

        #endregion
    }

    static int[][] GetArray(List<Card> hand, int rank)
    {
        int[][] cards = new int[suits][];
        for (int i = 0; i < suits; i++)
        {
            cards[i] = new int[ranks];
        }

        foreach (Card card in hand)
        {
            cards[card.Suit][card.Rank] = 1;
        }

        return cards;
    }
}
}

最佳答案

这是因为你注释掉了//cards.Add(new Card() { Rank = 0, Suit = 0 });。您的 cards 列表是空的,您的代码找不到空数组的 max - 这是可以预见的。

关于c# - 生成一手扑克牌的所有不同的 7 张牌组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26575312/

相关文章:

algorithm - 如何为每个 n 构造一个算术自由排列?

c# - 使用 getJSON 显示数组

c# - 将类型约束到接口(interface)的目的是什么?

c# - Log4Net 的 ThreadContext 和 Task 之间的冲突

寻找最大有效组合数的算法?

java - 使用 ArrayList<Integer> 进行排列,在控制台中按 10 的大小打印

c# - 集合被修改;哈希表可能无法执行枚举操作

Excel VBA 宏生成可能组合的列表

PHP采取所有组合

java - Java程序中的重复排列