如何将一副扑克牌变成两手牌

时间:2016-06-16 01:28:43

标签: java

我有这个家庭作业,我们的老师要我们在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);
    }

}

1 个答案:

答案 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位),请注意额外检查。如果你知道甲板将是均匀的,这是不需要的 - 我只是把它放在那里,因为前面的甲板尺寸是未知的。)

另请注意,有机会重构处理卡片的代码,以便您不会重复。我将把它作为一种教育活动。