Java - 如何在不排序的情况下检查扑克牌中的顺子?
Java - How do I check for a straight in a poker hand without sorting?
这不是重复的。我知道如果可以排序,这是多么容易,但我不允许对数组使用排序方法,也不允许我自己编写。我在任何地方都找不到任何帮助,包括 Whosebug。
在这种情况下,我有一个方法可以检查五张牌是否是顺子。我有一个卡片对象,它包含一个值(整数)和一套西装(整数)。我也有一些关于实现这个方法的规则。
- 除了A以外没有人头牌
- A 可以算作 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;
}
那也不行。我感到很沮丧,因为这两种尝试在检查过程中经历了许多不同的变化,但没有任何效果。我什至不明白为什么他们不工作。我所掌握的唯一信息是这种方法没有吐出正确的值。我不知道传递给该方法的值是什么。不知道测试的时候吐出的是什么方法。当它应该是正确的时,它可能会吐出错误,反之亦然。请帮忙!
规则:
- max_value - min_value 必须是 4
- 其他3张牌的点数必须在最小值和最大值之间
- 所有 5 张牌必须有相同的花色
假设没有重复的花色。
如果违反了这些规则中的 none 条,那么您就有顺子了。
唯一棘手的事情是Ace。 Ace 可以是 10? 10号卡呢? A 是 1 还是 10,还是 1 还是 11?
我假设您了解 evaluationHelper() 方法的用途; 如果不是,建议你查看后两个数组的内容是运行.
您需要在 cardValues[] 数组中找到第一个非零值。如果该条目和随后的 4 个都是一个,则 return 为真;否则 return 错误。
以后如果要找同花顺,首先要确认cardSuit[]中的一个条目等于5(即所有5个必须是同花色);如果不是,则 return false。
在您的 evaluationHelper
中,您忘记在 A 是 10
时添加地址:
if (cards[i].getValue() == 10) {
cardValues[0]++;
}
至少会让你的第一个解决方案起作用(我还没有检查第二个)。
请注意,此方法的作用仍然是Radix sort的一种形式,因此我不确定它是否满足您的要求。
这不是重复的。我知道如果可以排序,这是多么容易,但我不允许对数组使用排序方法,也不允许我自己编写。我在任何地方都找不到任何帮助,包括 Whosebug。
在这种情况下,我有一个方法可以检查五张牌是否是顺子。我有一个卡片对象,它包含一个值(整数)和一套西装(整数)。我也有一些关于实现这个方法的规则。
- 除了A以外没有人头牌
- A 可以算作 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;
}
那也不行。我感到很沮丧,因为这两种尝试在检查过程中经历了许多不同的变化,但没有任何效果。我什至不明白为什么他们不工作。我所掌握的唯一信息是这种方法没有吐出正确的值。我不知道传递给该方法的值是什么。不知道测试的时候吐出的是什么方法。当它应该是正确的时,它可能会吐出错误,反之亦然。请帮忙!
规则:
- max_value - min_value 必须是 4
- 其他3张牌的点数必须在最小值和最大值之间
- 所有 5 张牌必须有相同的花色
假设没有重复的花色。
如果违反了这些规则中的 none 条,那么您就有顺子了。
唯一棘手的事情是Ace。 Ace 可以是 10? 10号卡呢? A 是 1 还是 10,还是 1 还是 11?
我假设您了解 evaluationHelper() 方法的用途; 如果不是,建议你查看后两个数组的内容是运行.
您需要在 cardValues[] 数组中找到第一个非零值。如果该条目和随后的 4 个都是一个,则 return 为真;否则 return 错误。
以后如果要找同花顺,首先要确认cardSuit[]中的一个条目等于5(即所有5个必须是同花色);如果不是,则 return false。
在您的 evaluationHelper
中,您忘记在 A 是 10
时添加地址:
if (cards[i].getValue() == 10) {
cardValues[0]++;
}
至少会让你的第一个解决方案起作用(我还没有检查第二个)。
请注意,此方法的作用仍然是Radix sort的一种形式,因此我不确定它是否满足您的要求。