【问题标题】:How to shuffle a deck of cards into 2 hands如何将一副纸牌洗入两只手
【发布时间】:2016-06-17 09:09:16
【问题描述】:

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

}

【问题讨论】:

  • 请详细说明您的问题,您想回答什么?
  • 按照stackoverflow.com/questions/24520782/java-shuffle-card-deck创建一个shuffled Deck,然后分成两个havles
  • 我看了一下,但它超出了我的理解范围,我无法理解发生了什么
  • @hydregion 你要做的不仅仅是看看它。运行代码,研究它,调试它等等。
  • 使用 Arraylist 而不是数组。使用Collections.shuffle。分布到两个子列表中。问题解决了吗?

标签: java


【解决方案1】:

不要浪费时间事先洗牌,Fisher Yates 洗牌是一种更有效的方法,可以从已排序的牌组中随机选择卡片。

您可以查看this answer 了解它是如何完成的,然后它基本上使用该算法将选定的牌分配给备用手。

所以,最重要的是(伪代码,因为它是课堂作业),您可以使用以下内容创建两只手,每手有 26 张牌(从 1 开始的数组):

# 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 位),请在此处进行额外检查。如果你知道牌组是平的,那就不需要了——我只是把它放在那里,以防牌组的大小事先不知道)。

还要注意,有机会重构发牌的代码,以免重复。我将把它作为一个教育练习。

【讨论】:

  • @hydregion 解释一下你为什么不为你的作业洗牌可能会有所帮助
  • 很棒的代码。不过我要调整的一件事——如果 quant 小于 1 则让 if 语句返回或中断循环,而不是嵌套二手代码——让它更具可读性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 2012-06-07
  • 2011-06-28
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多