【问题标题】:Shuffled card deck. Dealing 5 cards to 4 players洗牌的牌组。向 4 名玩家发 5 张牌
【发布时间】:2017-05-16 22:24:18
【问题描述】:

我有这个洗牌套牌,我应该把它做成 5 张牌给四名玩家。我已经像白痴一样坐在这里几个小时了,我被困住了。

public class Deck {
public static void main(String[] args) 
{
    String[] SUITS = {
        "Clubs", "Diamonds", "Hearts", "Spades"
    };

    String[] RANKS = {
        "2", "3", "4", "5", "6", "7", "8", "9", "10",
        "Jack", "Queen", "King", "Ace"
    };

    // initialize deck
    int n = SUITS.length * RANKS.length;
    String[] deck = new String[n];
    for (int i = 0; i < RANKS.length; i++) {
        for (int j = 0; j < SUITS.length; j++) {
            deck[SUITS.length*i + j] = RANKS[i] + " of " + SUITS[j];
        }
    }

    // shuffle
    for (int i = 0; i < n; i++) {
        int r = i + (int) (Math.random() * (n-i));
        String temp = deck[r];
        deck[r] = deck[i];
        deck[i] = temp;
    }
  // print shuffled deck
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 5; j++)
        System.out.println(deck[i])
    }
}

我被困在最后一部分。我正在为四名玩家获得五张类似的牌。 它看起来像这样:

  • 红桃皇后
  • 红桃皇后
  • 红桃皇后
  • 红桃皇后
  • 红桃皇后
  • 10 颗钻石
  • 10 颗钻石
  • 10 颗钻石
  • 10 颗钻石
  • 10 颗钻石
  • 红心6
  • 红心6
  • 红心6
  • 红心6
  • 红心6
  • 黑桃10
  • 黑桃10
  • 黑桃10
  • 黑桃10
  • 黑桃10

如果我的意图是向四个玩家发五张不同的牌,我应该怎么做?

我正在用 Java 编码,做数组,但我不能使用任何 java utils。

【问题讨论】:

  • "I can't use any java utils" 这到底是什么意思?
  • 看起来你在这里打印了五次同一张卡片System.out.println(deck[i])
  • 抱歉,对 utils 一词不清楚。我的意思是我不能导入任何东西,例如“import java.utils”。等

标签: java arrays


【解决方案1】:

Math.random() * (n-i)biased,但你可以使用shuffle

Collections.shuffle(deck, new Random())

我不知道这是否算作“java utils”,因为我不确定您是否指的是包 java.utils

现在谈谈你的问题。数组不能很好地表示一副纸牌。堆叠或队列会更好,因为它们都允许您一次从牌堆中取出一张牌。使用数组,您可以在索引处窥视牌组,这不是我们在现实生活中应该如何打牌的方式。理想情况下,发牌的行为是将牌从牌组转移到玩家手中,保持牌组排列将很难追踪。

【讨论】:

  • 显然不允许他使用Collections。而且这也解决不了他的问题。这可能是一个任务......
  • @JawadLeWywadi 抱歉,我不清楚,因为他们已经在使用java.utils.Random,所以我不得不假设他们不是指包裹,那么我不知道他们是什么意思。跨度>
  • 我很确定他的意思是收藏,但你的代码仍然不能解决他的问题。这不是洗牌的问题,只是代码错误。
  • @David 是的,我错了。但是,该链接与我的问题中“有偏见”一词下的链接相同。
【解决方案2】:

把最后一个循环改成这样:

for (int i = 0; i < n; i++) {
    System.out.println(deck[i]);
}

【讨论】:

    【解决方案3】:

    您的 for 循环设置为向每位玩家发同一张牌 5 次(i 永远不会像 j 那样改变)。试试这个:

    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 5; j++)
        System.out.println(deck[j * 5 + i])
    

    【讨论】:

    • i*4+j 可能就是你要找的东西
    • @JawadLeWywadi 那会发牌两次。这是i+j*4
    • 不,不会。索引将是 0 + [0-4] , 4 +[0-4], 8+[0-4] 等等一个
    • i*5 + j 给四名玩家各发 5 张牌。假设每个玩家一次收到他们的 5 张牌(不理想),但我展示的是 OP 的循环为每个玩家打印了 5 次相同的牌。
    • @JawadLeWywadi 试试看。看第五张牌。玩家 1 的第五张牌:0*4+4 = 4。玩家 2 的第一张牌:1*4+0 = 4。同一张卡。
    【解决方案4】:

    这只是打印结果的错误。使用

    // print shuffled deck
    for (int i = 0; i < 4; i++) {
        System.out.println("** Person " + (i + 1) + " **");
        for (int j = 0; j < 5; j++) {
            System.out.println(deck[i + j * 4] + " (Card " + (i + j * 4) + ")");
        }
    }
    

    (添加系统输出以演示卡片分发)

    示例输出:

    ** 人 1 **
    俱乐部 2(卡 0)
    4 钻石(卡 4)
    钻石 9(卡 8)
    红心 10(卡 12)
    9 俱乐部(卡 16)
    ** 人 2 **
    红心 6(卡 1)
    8 颗钻石(卡 5)
    黑桃 9(卡 9)
    红心杰克(卡 13)
    钻石杰克(卡 17)
    ** 第 3 人 **
    梅花皇后(卡 2)
    钻石王牌(卡 6)
    红心王(卡 10)
    8 俱乐部(卡 14)
    黑桃 5(卡 18)
    ** 第 4 人 **
    黑桃 10(卡 3)
    10 个梅花(卡 7)
    黑桃杰克(卡 11)
    10 颗钻石(卡 15)
    梅花王牌(卡 19)

    【讨论】:

    • 哦,去-..就这么简单吗?他妈的。谢谢!谢谢大家的帮助,很有帮助!
    【解决方案5】:
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 5; j++)
        System.out.println(deck[i])
    }
    

    在这里你循环在同一张卡deck[i] 因为j 不被考虑。 此外,即使您考虑了j,它也无法解决您的问题,因为您的嵌入式循环总是以索引j=0 开始,作为外部循环迭代时的初始化。
    您应该从最后一张牌的索引开始第二个循环。

    您的循环应该首先考虑玩家的数量,然后是每个玩家要发牌的数量。
    所以我建议你两个循环:一个和另一个嵌入。

    我建议您在常量中声明玩家数量和卡片数量,而不是硬编码它们,以便获得更易读的代码。
    如果以后这些数据可能会有所不同,您可以用方法参数中的变量替换常量。

    public class Deck {
          ...
        private static final int NB_PLAYER = 4;
        private static final int NB_CARD_BY_PLAYER = 5;
          ...
        int playerNumber = 1;
        // you loop as much as the number of players
        // your increment step is the number of cards to deal by player
        // your end condition is the number of cards you have to
        // deal for all players
        for (int i = 0; i < NB_PLAYER * NB_CARD_BY_PLAYER; i = i + NB_CARD_BY_PLAYER) {
    
            System.out.println("player " + playerNumber + ", cards =");
            // you loop as much as the number of cards to deal by player
            // your start from the last dealed card 
            // your increment step is 1 as you want to deal card by card from the deck
            // your end condition is the number of cards to deal by player
            for (int j = i; j < i+NB_CARD_BY_PLAYER; j++) {
                System.out.println(deck[j]);
            }
            playerNumber++;
        }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-18
      • 2023-04-02
      • 2021-02-07
      • 2020-02-02
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 2019-04-27
      相关资源
      最近更新 更多