我使用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}。
答案 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张卡片。然后,预先附加卡片,找到卡片中最低的卡片,看看额外的卡片是否更大,如果是,请切换它们。请记住,你需要找到成对,直道和满屋等等