从7张牌中挑选最好牌(德州扑克德州扑克)

时间:2011-05-03 18:52:45

标签: c# algorithm oop

我使用C#实现了德州扑克游戏 我写了卡,甲板,播放器,桌子等课程。
例如:

    Player player1 = new Player("player1");
    player1.Card1 = new Card(4, Symbol.Clubs, true);
    player1.Card2 = new Card(5, Symbol.Clubs, true);

    Card card1 = new Card(4, Symbol.Clubs, true);
    Card card2 = new Card(7, Symbol.Hearts, true);
    Card card3 = new Card(2, Symbol.Spades, true);
    Card card4 = new Card(4, Symbol.Diamonds, true);
    Card card5 = new Card(4, Symbol.Clubs, true);
    Card[] tableCards = {card1, card2, card3, card4, card5};

我还为评估卡阵列编写了一些方法,如IsFlush,IsStraight,IsPair等。
我的问题是,如果我有7张牌(2手牌,5张桌子牌),我应该如何选择最好的手牌组合 在这个代码示例中,它是{4,4,4,4,7}。

5 个答案:

答案 0 :(得分:3)

请勿针对5张牌手写代码。相反,一般写它。所以,

ContainsStraightFlush
ContainsFourOfAKind
ContainsFullHouse

等。如果这些卡的某些子集是同花顺,四种类型等,则会吃掉一些卡片并返回true。

然后从最高排名的手向后跑到最低点。如果这些方法中的一个返回true,那么您可以轻松地选择满足该条件的最佳手。例如

2h Kh Qh Jh Th 9h 6c

ContainsStraightFlush会返回true,然后您可以选择9h Th Jh Qh Kh作为最佳牌。

答案 1 :(得分:2)

首先对卡片进行分类,这将使你更容易搜索最好的手牌,然后你只需要比较相同数量或直道的倍数的相邻元素。那么你只需要一个特殊的案例来寻找同花顺

答案 2 :(得分:2)

最简单的方法是使每张5张牌都成为可能并抓住手牌价值。记住最好的手。 7卡情况只有21种组合,所以在最佳性方面并不好,但除非你将它用于研究,否则它并不可怕。

foreach (possible 5 card combination in allCards)
    bestHand = Max(bestHand, GetValue(possible));

或者你可以创建一个每个卡有1个条目的数组,每个索引是一个指向新数组的指针,该数组包含所有2个卡组合,并且每个索引都是一个用于所有3个卡组合的数组,等等。你可以使用所有套装和等级抽象来实现它,数据结构的总大小在内存中大约是128 MB。在2 + 2论坛上有一个c ++参考实现。

答案 3 :(得分:1)

不要这样做,它非常慢,实际上写起来很麻烦(逻辑非常多毛)。此外,对于需要运行数亿手的蒙特卡罗模拟,这种方法根本无法忍受。

有关可用技术的调查,请参阅this link。实际上,使用基于表格的比较算法比使用大量if语句更简单代码。

上面文章中介绍的大多数例程都可以在已捆绑的C#库中找到,您可以将代码插入其中。

[第一个高性能的原创想法是there,并使用查找表,完美的散列和一个很好的技巧来乘以素数来一目了然地评估一只手。]

答案 4 :(得分:-1)

创建一系列卡片,并添加前5张卡片。然后,预先附加卡片,找到卡片中最低的卡片,看看额外的卡片是否更大,如果是,请切换它们。请记住,你需要找到成对,直道和满屋等等