我试图在 4 名玩家之间平均处理 52 张扑克牌,这意味着他们每人将有 13 张牌。每张只能发牌 4 张

Posted

技术标签:

【中文标题】我试图在 4 名玩家之间平均处理 52 张扑克牌,这意味着他们每人将有 13 张牌。每张只能发牌 4 张【英文标题】:I am trying to deal a deck of 52 playing cards amongst 4 players equally, meaning they will each have 13 cards each. Can only deal cards 4 each 【发布时间】:2021-03-05 16:42:45 【问题描述】:

我试图在 4 位玩家之间平均分配一副 52 张扑克牌,这意味着他们每人将有 13 张牌。我似乎每人只能处理 4 张牌,我不知道为什么。任何帮助都会很棒。我还附上了输出的图像: OUTPUT

 public void deals() 
                for (int i = 0; i < 4; i++) 
                    System.out.println("** Player " + (i + 1) + " has been dealt the following cards: **");
                    for (int j = 0; j <4; j++) 
                        //System.out.println(ranks[i + j * 4] + " of " + suits[j]);
                        System.out.println(ranks[i + j] + " of " + suits[j]);

                    
                
            

当我将System.out.println(ranks[i + j * 4] + " of " + suits[j]);中的 4 更改为更大的数字时,我得到一个错误。

【问题讨论】:

您的第一个循环表示 4 个玩家。您的内部循环似乎查看了已发牌。 4x4 是 16。因此您缺少一些卡片。如何发布完整的代码,以便我们为您提供更详细的帮助。 欢迎来到 SO!请避免使用指向图像的链接来引用您的代码或数据。相反,请直接在您的帖子中添加信息。 【参考方案1】:

您似乎需要先创建(并洗牌)一副牌,然后将牌发给 4 位玩家:

// setup a card deck
List<Card> deck = new ArrayList<>();
for (int i = 0; i < ranks.length; i++) 
    for (int j = 0; j < suits.length; j++) 
        deck.add(new Card(ranks[i], suits[j]));
    

// shuffle
Collections.shuffle(deck);

// deal
int players = 4;
for (int p = 0; p < players; p++) 
    System.out.println("Player " + (p + 1) + " gets these cards:");
    for (int i = 0, n = deck.size() / players; i < n; i++) 
        System.out.println(deck.get(p + players * i));
    


使用 Java 流将卡片呈现为玩家卡片列表的集合可能会很方便:


Collection<List<Card>> playerCards = IntStream
        .range(0, deck.size())  // indexes in range [0..52)
        .boxed()
        // "dealing" cards 1 by 1
        .collect(Collectors.groupingBy(i -> i % players, Collectors.mapping(i -> deck.get(i), Collectors.toList())))
        .values();

// print cards per player        
playerCards
        .stream() // stream of List<Card>
        .map(p ->  p.stream()  // stream of Card of the player
                    .sorted()  // if Card class implements Comparable<Card>
                    .map(Card::toString)
                    .collect(Collectors.joining(" ")) // get player's hand
        )
        .forEach(System.out::println);

样本输出(西装按顺序排序♥ ♦ ♠ ♣):

4♥ J♥ Q♥ K♥ 2♦ 3♦ 6♠ 7♠ 8♠ 10♠ Q♠ A♣ K♣
2♥ 5♦ 6♦ 7♦ 9♦ A♠ 4♠ 9♠ K♠ 2♣ 4♣ 6♣ 10♣
5♥ 6♥ 10♥ 8♦ 2♠ 3♠ J♠ 3♣ 5♣ 7♣ 8♣ 9♣ Q♣
A♥ 3♥ 7♥ 8♥ 9♥ A♦ 4♦ 10♦ J♦ Q♦ K♦ 5♠ J♣

【讨论】:

以上是关于我试图在 4 名玩家之间平均处理 52 张扑克牌,这意味着他们每人将有 13 张牌。每张只能发牌 4 张的主要内容,如果未能解决你的问题,请参考以下文章

理解面向对象编程---C#控制台实现52张扑克牌的分法

C程序 52张扑克牌每个花色4张,每个人随机四张,比较手中最大的牌,如果数字相同比花色,很紧急

如何从 4 位玩家之间的 9 张牌中找出最高的牌?

批处理文件 - 选择一张卡片

hgoi#20191105

一些有意思的智力题和概率题