我有这个家庭作业,我们的老师要我们在java中创建纸牌游戏“战争”。其中很大一部分是将52张不同的卡片分成两个牌手。我非常感谢任何有关洗牌的帮助。我是一个没有经验的编码员,而其他发布的对我来说没有任何意义。 我的代码:
package shuffle;
import java.util.Random;
public class SHUFFLE {
public static void main(String[] args) {
shuffle();
}
public static void shuffle() {
Random r = new Random();
int[] hand1 = new int[26];
int[] hand2 = new int[26];
int i = 1, rand, rand2;
int o = 1;
do {
System.out.println("Top");
rand = r.nextInt(52) + 1;
rand2 = r.nextInt(2) + 1;
System.out.println("number generated: "+rand);
System.out.println("sector: " + rand2);
if (rand2 == 1) {
if (rand <= 52) {
while (hand1[o] > 0) {
if (hand1[o] == rand) {
} else {
hand1[o]--;
}
}
while (hand2[i] > 0) {
if (hand2[i] == rand) {
} else {
hand2[i]--;
}
hand1[o] = rand;
o++;
}
}
}
if (rand2 == 2) {
if (rand <= 52) {
while (hand1[o] > 0) {
if (hand1[o] == rand) {
} else {
hand1[o]--;
}
}
while (hand2[i] > 0) {
if (hand2[i] == rand) {
} else {
hand2[i]--;
}
hand2[i] = rand;
i++;
}
}
}
}while(hand1[o] < 26 && hand2[i] < 26);
}
}
答案 0 :(得分:1)
不要浪费时间在甲板上洗牌,Fisher Yates shuffle是一种更有效的方式,即使是从排序的牌组中随机选择牌。
您可以看到this answer了解它是如何完成的,然后基本上使用该算法将选定的卡片分发给候补手。
所以,底线(伪代码,因为它是课堂作业),您可以使用以下内容创建两手牌,每张二十六张牌(使用基于一个阵列):
# Set up deck of cards with initial size, and empty hands.
cards[] = [acespades, twospades, ..., queenhearts, kinghearts]
quant = size(cards)
hand1 = []
hand2 = []
# Need to distribute entire deck.
while quant > 0:
# Get card for first hand using Fisher Yates shuffle
index = random(1..quant)
hand1.append(cards[index])
cards[index] = cards[quant]
decrement quant
# If no cards left, exit the loop.
if quant == 0:
exit while
# Now get card for second hand.
index = random(1..quant)
hand2.append(cards[index])
cards[index] = cards[quant]
decrement quant
如果您的原始套牌有奇数卡(if ... exit while
位),请注意额外检查。如果你知道甲板将是均匀的,这是不需要的 - 我只是把它放在那里,因为前面的甲板尺寸是未知的。)
另请注意,有机会重构处理卡片的代码,以便您不会重复。我将把它作为一种教育活动。