是否可以在条件内递减计数器?
Is it possible to decrement counter within a condition?
我正在尝试在分析扑克牌时检测 jokerStraightFlush。
我需要在这只手工作的地方添加一个功能 8S JK 6S JK 4S
。 JK
是小丑。我使用的代码逻辑与 https://www.codeproject.com/Articles/38821/Make-a-poker-hand-evalutator-in-Java.
完全相同
cardsTable
代表手牌的牌位分布。该数组的每个元素代表手牌中该等级(从 1 到 13,1 为 A)的牌的数量。所以对于 8S JK 6S JK 4S
,分布将是
0 0 0 0 1 0 1 0 1 0 0 0 0 0
note that the position 1 is for ace (because it's simpler)
我需要找到一种方法来检测 cardsTable[i] == 1
是否失败并减少用于检测 jokerStraightFlush 的小丑数量 (numberOfJokers
) 因为在这段不完整的代码中,numberOfJokers
不要递减,我不知道如何以一种好的方式编写它。我在这里做的是检查这个等级的卡片是否存在 cardsTable[i] == 1
或者它是否是小丑...但我不知道如何检查其他连续排名中的小丑
我不知道我是否清楚,这是一个扭曲的情况..如果我不让我知道的话。
straight = false; // assume no straight
int numberOfJokers = 2; //(the maximum number of jokers in a hand is 2)
for (int i = 1; i <= 9; i++) { // can't have straight with lowest value of more than 10
numberOfJokers = 2 //reset the number of jokers available after each loop
if ((cardsTable[i] == 1 || numberOfJokers > 0) &&
(cardsTable[i + 1] == 1 || numberOfJokers > 0) &&
(cardsTable[i + 2] == 1 || numberOfJokers > 0) &&
(cardsTable[i + 3] == 1 || numberOfJokers > 0) &&
(cardsTable[i + 4] == 1 || numberOfJokers > 0)) {
straight = true;
break;
}
}
我也有这段代码,但我不知道如何检测第一个条件是否失败,所以我可以减少剩余的小丑数量。
for (int i = 1; i <= 9; i++) {
numberOfJokers = 2
if (cardsTable[i] == 1 || numberOfJokers>0) {
if (cardsTable[i + 1] == 1 || numberOfJokers>0) {
if (cardsTable[i + 2] == 1 || numberOfJokers > 0) {
if (cardsTable[i + 3] == 1 || numberOfJokers > 0) {
if (cardsTable[i + 4] == 1 || numberOfJokers > 0) {
straight = true;
break;
}
}
}
}
}
}
从概念上讲,您只需要 5 个槽中的 3 个等于 1,另外 2 个等于 0。您可以这样做:
for (int i = 1; i <= 9; i++) {
boolean straight = true;
int numberOfJokers = 2;
for (int j = i; j <= i + 5; j++) { // I used a for loop instead of writing the statement 5 times
if (cardsTable[j] > 1) { // Can't have straight if more than one of a kind
straight = false;
}
if (cardsTable[j] == 0) {
numberOfJokers--;
}
}
if (numberOfJokers >= 0 && straight == true) {
break;
}
}
或者,也许更简单的方法是在 cardsTable 数组中添加一个位置,指示小丑的数量。
nvm 我在我的条件下使用了一个函数..我不知道这是否是正确的方法,但它对我来说是合乎逻辑的 x)
straight = false; // assume no straight
for (int i = 1; i <= 9; i++) // can't have straight with lowest value of more than 10
{
remainingJokers=jokers;
System.out.println("resetjokers : "+jokers);
if (cardsTable[i] == 1 || useJoker()) {
if (cardsTable[i + 1] == 1 || useJoker()) {
if (cardsTable[i + 2] == 1 || useJoker()) {
if (cardsTable[i + 3] == 1 || useJoker()) {
if (cardsTable[i + 4] == 1 || useJoker()) {
System.out.println("straight");
straight = true;
topStraightValue = i + 4; // 4 above bottom value
break;
}
}
}
}
}
}
}
private boolean useJoker() {
int remaining = remainingJokers;//remainingJokers is a global variable
remainingJokers--;
return remaining>0;
}
由于 "short-circuiting" behaviour,您不需要 detect
||
的左操作数导致 true
:如果左操作数一个是 false
,只有一个。
(cardsTable[i + c] == 1 || numberOfJokers-- > 0)
会起作用;注意
(numberOfJokers-- > 0 || cardsTable[i + c] == 1)
不会。
这样的代码是否可维护或可读是一个独立的考虑因素,因为是解决问题和解决方案的整体方法的质量。
我正在尝试在分析扑克牌时检测 jokerStraightFlush。
我需要在这只手工作的地方添加一个功能 8S JK 6S JK 4S
。 JK
是小丑。我使用的代码逻辑与 https://www.codeproject.com/Articles/38821/Make-a-poker-hand-evalutator-in-Java.
cardsTable
代表手牌的牌位分布。该数组的每个元素代表手牌中该等级(从 1 到 13,1 为 A)的牌的数量。所以对于 8S JK 6S JK 4S
,分布将是
0 0 0 0 1 0 1 0 1 0 0 0 0 0
note that the position 1 is for ace (because it's simpler)
我需要找到一种方法来检测 cardsTable[i] == 1
是否失败并减少用于检测 jokerStraightFlush 的小丑数量 (numberOfJokers
) 因为在这段不完整的代码中,numberOfJokers
不要递减,我不知道如何以一种好的方式编写它。我在这里做的是检查这个等级的卡片是否存在 cardsTable[i] == 1
或者它是否是小丑...但我不知道如何检查其他连续排名中的小丑
我不知道我是否清楚,这是一个扭曲的情况..如果我不让我知道的话。
straight = false; // assume no straight
int numberOfJokers = 2; //(the maximum number of jokers in a hand is 2)
for (int i = 1; i <= 9; i++) { // can't have straight with lowest value of more than 10
numberOfJokers = 2 //reset the number of jokers available after each loop
if ((cardsTable[i] == 1 || numberOfJokers > 0) &&
(cardsTable[i + 1] == 1 || numberOfJokers > 0) &&
(cardsTable[i + 2] == 1 || numberOfJokers > 0) &&
(cardsTable[i + 3] == 1 || numberOfJokers > 0) &&
(cardsTable[i + 4] == 1 || numberOfJokers > 0)) {
straight = true;
break;
}
}
我也有这段代码,但我不知道如何检测第一个条件是否失败,所以我可以减少剩余的小丑数量。
for (int i = 1; i <= 9; i++) {
numberOfJokers = 2
if (cardsTable[i] == 1 || numberOfJokers>0) {
if (cardsTable[i + 1] == 1 || numberOfJokers>0) {
if (cardsTable[i + 2] == 1 || numberOfJokers > 0) {
if (cardsTable[i + 3] == 1 || numberOfJokers > 0) {
if (cardsTable[i + 4] == 1 || numberOfJokers > 0) {
straight = true;
break;
}
}
}
}
}
}
从概念上讲,您只需要 5 个槽中的 3 个等于 1,另外 2 个等于 0。您可以这样做:
for (int i = 1; i <= 9; i++) {
boolean straight = true;
int numberOfJokers = 2;
for (int j = i; j <= i + 5; j++) { // I used a for loop instead of writing the statement 5 times
if (cardsTable[j] > 1) { // Can't have straight if more than one of a kind
straight = false;
}
if (cardsTable[j] == 0) {
numberOfJokers--;
}
}
if (numberOfJokers >= 0 && straight == true) {
break;
}
}
或者,也许更简单的方法是在 cardsTable 数组中添加一个位置,指示小丑的数量。
nvm 我在我的条件下使用了一个函数..我不知道这是否是正确的方法,但它对我来说是合乎逻辑的 x)
straight = false; // assume no straight
for (int i = 1; i <= 9; i++) // can't have straight with lowest value of more than 10
{
remainingJokers=jokers;
System.out.println("resetjokers : "+jokers);
if (cardsTable[i] == 1 || useJoker()) {
if (cardsTable[i + 1] == 1 || useJoker()) {
if (cardsTable[i + 2] == 1 || useJoker()) {
if (cardsTable[i + 3] == 1 || useJoker()) {
if (cardsTable[i + 4] == 1 || useJoker()) {
System.out.println("straight");
straight = true;
topStraightValue = i + 4; // 4 above bottom value
break;
}
}
}
}
}
}
}
private boolean useJoker() {
int remaining = remainingJokers;//remainingJokers is a global variable
remainingJokers--;
return remaining>0;
}
由于 "short-circuiting" behaviour,您不需要 detect
||
的左操作数导致 true
:如果左操作数一个是 false
,只有一个。
(cardsTable[i + c] == 1 || numberOfJokers-- > 0)
会起作用;注意
(numberOfJokers-- > 0 || cardsTable[i + c] == 1)
不会。
这样的代码是否可维护或可读是一个独立的考虑因素,因为是解决问题和解决方案的整体方法的质量。