我在检查扑克手牌时遇到了一些问题。所以在这段代码中,我们选择要玩多少副牌,然后剩下的就像视频扑克一样。我的问题是一些被检查的手是“看到的”。直接来说,我假设因为我将它设置为好像我的 arraylist 是按假设排序的,我将如何解决这个问题?
另外,对于两对,我的 friend 说有几次它不能正确检查我是否真的有两对,说它检查不正确。这是我的检查算法,谁能告诉我如何修复它们?此外,如果除了顺子和两对有问题之外,您还看到任何问题。我还没有达到满堂彩或更高的水平来测试。 .get(#) 从我的手(数组列表)中获取牌组或等级(getsuit 或 getrank)。我还认为我的皇家同花顺可能不正确。
private boolean flush(){
if (currentHand.get(0).getSuit() == currentHand.get(1).getSuit()
&& currentHand.get(1).getSuit() == currentHand.get(2).getSuit()
&& currentHand.get(2).getSuit() == currentHand.get(3).getSuit()
&& currentHand.get(3).getSuit() == currentHand.get(4).getSuit()){
return true;
}
return false;
}
private boolean royal(){
if ((currentHand.get(0).getRank() == 1)
&& (currentHand.get(1).getRank() == 10)
&& (currentHand.get(2).getRank() == 11)
&& (currentHand.get(3).getRank() == 12)
&& (currentHand.get(4).getRank() == 13)) {
return true;
}
return false;
}
private boolean straight(){//look up
if (currentHand.get(0).getRank() + 1 == currentHand.get(1).getRank()
&& currentHand.get(1).getRank() + 1 == currentHand.get(2).getRank()
&& currentHand.get(2).getRank() + 1 == currentHand.get(3).getRank()
&& currentHand.get(3).getRank() + 1 == currentHand.get(4).getRank()) {
return true;
}
return false;
}
private boolean four(){
if (currentHand.get(0).getRank() == currentHand.get(1).getRank()
&& currentHand.get(1).getRank() == currentHand.get(2).getRank()
&& currentHand.get(2).getRank() == currentHand.get(3).getRank()) {
return true;
} else if (currentHand.get(1).getRank() == currentHand.get(2).getRank()
&& currentHand.get(2).getRank() == currentHand.get(3).getRank()
&& currentHand.get(3).getRank() == currentHand.get(4).getRank()) {
return true;
}
return false;
}
private boolean fullHouse() {
if (currentHand.get(0).getRank() == currentHand.get(1).getRank()
&& currentHand.get(1).getRank() == currentHand.get(2).getRank()) {
if (currentHand.get(3).getRank() == currentHand.get(4).getRank()) {
return true;
}
}else if(currentHand.get(0).getRank() == currentHand.get(1).getRank()){
if(currentHand.get(2).getRank() == currentHand.get(3).getRank()
&& currentHand.get(3).getRank() == currentHand.get(4).getRank()){
return true;
}
}
return false;
}
private boolean threeOfKind(){
if ((currentHand.get(0).getRank() == currentHand.get(1).getRank()
&& currentHand.get(1).getRank() == currentHand.get(2).getRank())
|| (currentHand.get(1).getRank() == currentHand.get(2).getRank()
&& currentHand.get(2).getRank() == currentHand.get(3).getRank())
|| (currentHand.get(2).getRank() == currentHand.get(3).getRank()
&& currentHand.get(3).getRank() == currentHand.get(4).getRank())){
return true;
}
return false;
}
private boolean twoPair() {
if (currentHand.get(0).getRank() == currentHand.get(1).getRank()
&& currentHand.get(2).getRank() == currentHand.get(3).getRank()){
return true;
}
else if((currentHand.get(1).getRank() == currentHand.get(2).getRank())&&
(currentHand.get(3).getRank() == currentHand.get(4).getRank())){
return true;
}
else if((currentHand.get(0).getRank() == currentHand.get(1).getRank())&&
(currentHand.get(3).getRank() == currentHand.get(4).getRank())){
return true;
}else
return false;
}
private boolean jackOrBetter() {
for (int i = 11; i <= 14; i++) {
int comp;
if (i == 14)
comp =1;
else comp = i;
for (int j = 0; j < 4; j++) {
if (currentHand.get(j).getRank() ==comp ) {
if (currentHand.get(j).getRank() == currentHand.get(j + 1).getRank()) {
return true;
}
}
}
}
return false;
最佳答案
通常情况下,您会在已知的(而且速度非常快的)扑克评估器中找到的代码类型比这低得多:没有花哨的 OO 或类似的东西。只是简单的快速位操作和疯狂的快速表查找。那里的快手评估器可以评估数亿(!)手……每秒!但是让我们把它放在一边,从你的 OOish 代码开始。
我认为您需要一个五张牌评估器,然后如果您玩德州扑克,那么您将要测试 C(7,5),它给出了 21 种可能的方法来取出 5 张牌七张(棋盘上有 5 张 + 2 张底牌)。并保持最好的手。
接下来是您的五张牌评估器。
“技巧”是通过保留中间信息来简化您的工作。您的逻辑将大大简化。
这是您可以做到的一种方法(再一次:与真正的快速评估器相比,这是一种过度简化的方法,但它应该可以帮助您完成工作):
final boolean isFlush = flush();
final int[] nbPerRank = findNumberForEachRank();
final boolean isStraight = straight( nbPerRank );
nbPerRank
数组,比方说,“Queens full of five”(三个皇后和两个五)可能看起来像这样:
; 2 3 4 5 6 7 8 9 T J Q K A
int[] nbPerRank = [ 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 0, 0 ]
那么你的主要方法应该看起来有点像这样:
if ( isStraight ) {
final int highCard = findStraightHighCard();
if ( isFlush ) {
if ( highCard == 13 ) { // starting with the 'A'
System.out.println( "You have a royal flush" );
else if ( highCard = 4 ) { // starting with the '5'
System.out.println( "You have a wheel straight flush" );
} else {
System.out.println( "You have a straight flush " );
}
} else {
... // rinse and repeat for normal straight
}
} else {
...
请注意,您的评估员是 5 张牌评估员,一旦您有顺子,您知道只有两种可能的情况:顺子和同花顺(有五张牌,如果您已经有,则不可能有一对有这五张牌的顺子)。
所以现在您已经考虑了同花顺和顺子,现在您需要按顺序检查:
- 四种
- 满屋/船
- 同花顺(但不再是同花顺)
- 设置
- 两对
- 一对
要检查您是否有四种类型,您可以查看 nbPerRank
int
数组中是否有数字 4。
伪代码可能是这样的:
// no need to test for straight an straight flush anymore...
if ( hasFourSameRank ) {
" You have four of a kind ";
} else if ( hasThreeSameRank && hasTwoSameRank ) {
" You have a full house ";
} else if ( isFlush ) {
" You have a flush";
} else if ( hasThreeSameRank ) {
" You have a set ";
} else if ( hasTwoSameRank ) {
// two possible cases here: two pairs or one pair
if ( hasTwoPairs ) {
"You have two pairs";
} else {
"You have one pair";
} else {
"You have no pair";
}
嵌套的 if/else 在此类评估器中非常正常(至少在不使用查找表/LUT 的评估器中)。
请注意,这只是一种方法。你可以更“花哨”,而不是简单地返回一个包含每个级别每张卡片数量的 int[],你还可以返回最大卡片、相似级别的最大数量等。
然后您必须找到一种方法来为每只手分配一个值(因此称为“评估者”名称),以便“两对,8 和 2,踢球手” 击败 < em>“两对,8 和 2,踢脚 9” 等
但这应该让你开始。
另一种解决方案是简单地重用其中一个现有的求值器(除了经过试验和测试之外,它应该非常快:它只是位操作和查找表,没有缓慢的 OO)。
(稍微相关)您可能还想在这里阅读我的旧答案:On Two Plus Two poker hand evaluator, how do you get the best 5 cards combination out of the 7 that you passed to it?
关于java - 检查扑克牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20578974/