为什么我的程序总是发重复的牌? (JAVA)
Why does my program keep dealing duplicate cards? (JAVA)
所以对于家庭作业任务,我必须制作一个程序来处理 N(命令行输入)数量的扑克牌(5 张牌)。我有一个 for-loop 检查卡片是否已被使用,但仍然打印了重复的卡片。任何帮助将不胜感激。
检查重复项的代码
do {///check for dupes
bUsed = false;
randS = (int) (Math.random() * 4);
randV = (int) (Math.random() * 13);
for (int k = 0; k < 52; k++) {
value[randV]);
if ((used[k] == (suit[randS] + value[randV])) && (used[k] != null)) {
bUsed = true;
}
}
} while (bUsed);///end check
完整代码
public class Deal {
public static void main(String[] args) {
String[] suit = {"Hearts", "Diamonds", "Spades", "Clubs"};
String[] value = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
String[] used = new String[52];
boolean bUsed = false;
int usedC = 0;
int N = Integer.parseInt(args[0]);
// int N = 4;
if (N <= 10) {
/////////check for max
for (int i = 0; i < N; i++) {/////////print N amount of decks
System.out.println("Deck " + (i + 1));
for (int j = 0; j < 5; j++) {/////////print 5 cards
int randV = 0;
int randS = 0;
do {///check for dupes
bUsed = false;
randS = (int) (Math.random() * 4);
randV = (int) (Math.random() * 13);
for (int k = 0; k < 52; k++) {
if ((used[k] == (suit[randS] + value[randV])) && (used[k] != null)) {
bUsed = true;
}
}
} while (bUsed);///end check
used[usedC] = suit[randS] + value[randV];
System.out.println(suit[randS] + " " + value[randV]);
usedC++;
}////end print 5 cards
System.out.println();
}///end print amount of decks
} else {
System.out.println("Too many decks requested");
}
}
}
输出示例
java Deal.java 5
Deck 1 Clubs 6 Clubs 10 Clubs J Hearts Q Spades J
Deck 2 Hearts 4 Hearts 7 Hearts A Clubs J Diamonds 3
Deck 3 Spades K Diamonds 3 Diamonds Q Diamonds 4 Clubs 2
Deck 4 Spades 7 Diamonds 7 Diamonds 3 Clubs A Diamonds 9
Deck 5 Clubs 2 Spades 4 Diamonds 4 Diamonds 3 Spades 7
您正在比较字符串 ==
而不是 .equals()
。
这是有问题的行:
if ((used[k] == (suit[randS] + value[randV])) && (used[k] != null))
首先你需要翻转 null-check 和 value-check,以防止 NullPointerException,因为 .equals()
是一个方法调用(对于运算符 ==
这无关紧要)。然后使用方法进行比较,如:
if ((used[k] != null) && used[k].equals(suit[randS] + value[randV]))
除此之外,如果您使用 List<String>
作为 used 而不是数组,那么您的生活会轻松很多,因为在那里您可以简单地使用.contains
方法而不是你自己的循环 - 但我不知道你的作业是否允许这样做。
为了让你的程序快一点,你可以在if-block里面的末尾添加一个break;
语句,这样你就可以在for-loop找到一个副本。
所以对于家庭作业任务,我必须制作一个程序来处理 N(命令行输入)数量的扑克牌(5 张牌)。我有一个 for-loop 检查卡片是否已被使用,但仍然打印了重复的卡片。任何帮助将不胜感激。
检查重复项的代码
do {///check for dupes
bUsed = false;
randS = (int) (Math.random() * 4);
randV = (int) (Math.random() * 13);
for (int k = 0; k < 52; k++) {
value[randV]);
if ((used[k] == (suit[randS] + value[randV])) && (used[k] != null)) {
bUsed = true;
}
}
} while (bUsed);///end check
完整代码
public class Deal {
public static void main(String[] args) {
String[] suit = {"Hearts", "Diamonds", "Spades", "Clubs"};
String[] value = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
String[] used = new String[52];
boolean bUsed = false;
int usedC = 0;
int N = Integer.parseInt(args[0]);
// int N = 4;
if (N <= 10) {
/////////check for max
for (int i = 0; i < N; i++) {/////////print N amount of decks
System.out.println("Deck " + (i + 1));
for (int j = 0; j < 5; j++) {/////////print 5 cards
int randV = 0;
int randS = 0;
do {///check for dupes
bUsed = false;
randS = (int) (Math.random() * 4);
randV = (int) (Math.random() * 13);
for (int k = 0; k < 52; k++) {
if ((used[k] == (suit[randS] + value[randV])) && (used[k] != null)) {
bUsed = true;
}
}
} while (bUsed);///end check
used[usedC] = suit[randS] + value[randV];
System.out.println(suit[randS] + " " + value[randV]);
usedC++;
}////end print 5 cards
System.out.println();
}///end print amount of decks
} else {
System.out.println("Too many decks requested");
}
}
}
输出示例
java Deal.java 5 Deck 1 Clubs 6 Clubs 10 Clubs J Hearts Q Spades J
Deck 2 Hearts 4 Hearts 7 Hearts A Clubs J Diamonds 3
Deck 3 Spades K Diamonds 3 Diamonds Q Diamonds 4 Clubs 2
Deck 4 Spades 7 Diamonds 7 Diamonds 3 Clubs A Diamonds 9
Deck 5 Clubs 2 Spades 4 Diamonds 4 Diamonds 3 Spades 7
您正在比较字符串 ==
而不是 .equals()
。
这是有问题的行:
if ((used[k] == (suit[randS] + value[randV])) && (used[k] != null))
首先你需要翻转 null-check 和 value-check,以防止 NullPointerException,因为 .equals()
是一个方法调用(对于运算符 ==
这无关紧要)。然后使用方法进行比较,如:
if ((used[k] != null) && used[k].equals(suit[randS] + value[randV]))
除此之外,如果您使用 List<String>
作为 used 而不是数组,那么您的生活会轻松很多,因为在那里您可以简单地使用.contains
方法而不是你自己的循环 - 但我不知道你的作业是否允许这样做。
为了让你的程序快一点,你可以在if-block里面的末尾添加一个break;
语句,这样你就可以在for-loop找到一个副本。