所以对于家庭作业任务,我必须制作一个程序,处理N(命令行输入(数量的扑克组(5张牌(。我有一个for循环,可以检查是否使用了一张卡,但仍然会打印出重复的卡。如有任何帮助,我们将不胜感激。
检查重复的代码
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甲板1俱乐部6俱乐部10俱乐部J红心Q黑桃J
甲板2红心大战4红心大战7红心大战A俱乐部J钻石3
甲板3黑桃K钻石3钻石Q钻石4球杆2
甲板4黑桃7钻石7钻石3俱乐部A钻石9
甲板5球杆2黑桃4钻石4钻石3黑桃7
您将字符串与==
而不是.equals()
进行比较。
这是一条有问题的线路:
if ((used[k] == (suit[randS] + value[randV])) && (used[k] != null))
首先,您需要翻转null检查和value检查,以防止NullPointerException,因为.equals()
是一个方法调用(对于运算符==
,这无关紧要(。然后使用该方法进行比较,如:
if ((used[k] != null) && used[k].equals(suit[randS] + value[randV]))
除此之外,如果你用List<String>
代替数组来表示,你的生活会轻松很多,因为在那里你可以简单地使用.contains
方法而不是你自己的循环,但我不知道你的家庭作业是否允许这样做。
为了让你的程序更快一点,你可以在if块的末尾添加一个break;
语句,因为你可以在发现重复的语句后立即中断for循环。