Java - 如何在没有排序的情况下检查扑克手中的直线?

时间:2017-11-18 02:47:22

标签: java arrays sorting poker

这不重复。我理解如果你可以排序是多么容易,但我不允许对数组使用sort方法,我不允许自己编写。我无法在任何地方找到任何帮助,包括StackOverflow。

在这种情况下,我有一个方法应该检查五张牌是否是直线。我有一个卡对象,它包含一个值(整数)和一个套装(整数)。我也有一些关于实现这种方法的规则。

  • 除了王牌外,没有面部卡片
    • ace可以算作1或10,但不能同时计算
  • 直筒不能环绕
  • 您不能对数组使用排序方法或编写自己的排序方法

最后一条规则就是杀了我。我有一系列卡片。如果我可以对它进行排序,这将是如此简单,但我甚至无法编写自己的方法来对数组进行排序。对于我的其他方法,可以很容易地遍历手并将有关手的信息存储在两个单独的数组中,如下所示:

private static int[] cardValues = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
private static int[] cardSuits = {0, 0, 0, 0, 0};

private static void evaluationHelper(Card[] cards) {
    for (int i = 0; i < cardValues.length; i++) {
        cardValues[i] = 0;
    }

    for (int i = 0; i <cardSuits.length; i++) {
        cardSuits[i] = 0;
    }

    for (int i = 0; i < 5; i++) {
        cardValues[cards[i].getValue() - 1]++;
        cardSuits[cards[i].getSuit()]++;

        if (cards[i].getValue() == 1) {
            cardValues[9]++;
        }
    }
}

所以在我第一次尝试解决这个问题时,我尝试过这样的事情:

public static boolean hasStraight(Card [] cards) {
    int sequenCounter = 0;
    evaluationHelper(cards);

    for (int i = 0; i < cardValues.length; i++) {
        if (sequenCounter != 5) {
            if (cardValues[i] != 0) {
                sequenCounter++;
            } else {
                sequenCounter = 0;
            }
        } else {
            return true;
        }
    }
    return false;
}

那不起作用。所以我试过这个:

public static boolean hasStraight(Card [] cards) {
    int min = 100, max = 0;
    boolean seenSix = false, seenAce = false;
    evaluationHelper(cards);

    for (int i = 0; i < cards.length; i++) {
        if (cards[i].getValue() > max) {
            max = cards[i].getValue();
        }

        if (cards[i].getValue() < min) {
            min = cards[i].getValue();
        }

        if (cards[i].getValue() == 6) {
            seenSix = true;
        }

        if (cards[i].getValue() == 1) {
            seenAce = true;
        }
    }

    if (seenSix && seenAce) {
        max = 10;
    }

    if (max - min == 4) {
        return true;
    }
    return false;
}

这也不起作用。我感到很沮丧,因为这两次尝试都在过程中经历了许多不同的变化而且没有任何效果。我甚至无法弄清楚他们为什么不工作。我唯一的信息是这种方法没有吐出正确的值。我不知道传递给方法的值是什么。我不知道这个方法在测试过程中吐出的是什么。当它应该吐真时,它可能吐出错误,反之亦然。请帮忙!

3 个答案:

答案 0 :(得分:1)

在您的evaluationHelper中,当10添加if (cards[i].getValue() == 10) { cardValues[0]++; } 时,您忘了解决问题。

class

至少会使你的第一个解决方案工作(我没有检查过第二个解决方案)。

请注意,此方法的作用仍然是Radix sort的一种形式,因此我不确定它是否满足您的要求。

答案 1 :(得分:0)

规则:

  • max_value - min_value必须为4
  • 其他3张卡&#39;值必须介于最小值和最大值之间
  • 所有5张牌必须具有相同的诉讼

假设没有重复的西装号码。

如果这些规则都没有违反,那么你就有了直线。

唯一棘手的事情,如果Ace。王牌可以是10? 10号卡怎么样? Ace 1或10,或1或11?

答案 2 :(得分:0)

我假设你理解了evaluationHelper()方法的目的; 如果没有,我建议您在运行后查看两个数组的内容

您需要在cardValues []数组中找到第一个非零值。如果该条目和后续的4都是一个,则返回true;否则返回false。

将来如果你需要找到同花顺,你首先要确认其中一个cardSuit []条目等于5(即所有5个必须是同一套装);如果没有,则返回false。