当前位置: 首页 > 知识库问答 >
问题:

洗牌牌组。给4名玩家发5张牌

冀冯浩
2023-03-14

我有一副洗牌牌,我应该把它做成这样,它可以把5张牌分给4个玩家。我像个白痴一样坐在这里好几个小时了,我被卡住了。

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 UTIL。

共有3个答案

陆翰学
2023-03-14
for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 5; j++)
    System.out.println(deck[i])
}

在这里,您在同一张卡上循环[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++;
    }
 }
东门修文
2023-03-14

数学。random()*(n-i)是有偏差的,但您可以使用洗牌:

Collections.shuffle(deck, new Random())

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

现在来看看你的问题。阵列并不是一副牌的好代表。堆叠或队列会更好,因为它们都允许你一次从一副牌中拿一张牌。有了阵列,你就可以窥视一副牌的索引,这不是我们在现实生活中应该玩的牌。理想情况下,发牌的行为是将一张牌从甲板转移到玩家手中,留在甲板阵列中会让你很难跟踪。

赵镜
2023-03-14

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

// 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) + ")");
    }
}

(添加Sysouts以演示卡片分发)

示例输出:

**第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)

 类似资料:
  • 我正在尝试使用ArrayList构建一个21点纸牌游戏。我很难理解向所有玩家发一张牌的逻辑——我认为我的问题更多地涉及使用迭代器。。。。 问题出在游戏运行器的 //交易卡部分。我知道我没有正确使用itr为阵列列表中的每个玩家分配一张新卡。 来自玩家类: 来自甲板班

  • 在第13.6节我们编写了一个洗牌算法的伪代码。假设shuffleDeck函数实现洗牌功能,其参数为一个牌堆,我们就可以这样创建牌堆并洗牌: Deck deck; // 创建一个标准的52张牌的牌堆 deck.shuffle (); // 洗牌 然后,使用subdeck函数来分几手牌: Deck hand1 = deck.subdeck (0, 4); Deck hand2 = dec

  • 大多数纸牌游戏都需要洗牌,也就是让纸牌随机排列。在第10.5节,我们看到了怎样生成随机数,但怎样利用随机数实现洗牌功能却并非显然意见的。 一种可行的方案是,模拟人洗牌的方法,将牌分为两堆,然后通过在每个牌堆中轮流选择的方式实现原牌堆的重新组织。因为一般而言,人并不能做到完美地洗牌,而程序经过大约7次迭代之后,牌堆中纸牌的顺序已经相当随机了。但是计算机程序每次在做完美洗牌的时候有一个令人讨厌的属性—

  • 本节用随机数产生器开发一个洗牌与发牌程序。这个程序可以用于实现玩某种牌的游戏程序。 为了解决一些微妙的性能问题,我们故意用次优洗牌与发牌算法。练习中要开发更有效的算法。 利用自上而下逐步完善的方法,我们开发一个程序,洗 52 张牌并发52张牌。自上而下逐步完善的方法在解决大而复杂的问题时特别有用。 我们用 4 x 13 的双下标数组 deck 表示要玩的牌(如图 5.23)。行表示花色,0 表示红

  • 本文向大家介绍C++扑克牌的洗牌发牌游戏设计,包括了C++扑克牌的洗牌发牌游戏设计的使用技巧和注意事项,需要的朋友参考一下 笔者在大学二年级期间,做过的一次C++程序设计:扑克牌的洗牌发牌游戏。具体内容是:除去大王和小王,将52张扑克牌洗牌,并发出5张牌。然后判断这5张牌中有几张相同大小的牌,是否是一条链,有几个同花等。 笔者在学习他人设计的基础上,完成了自己的程序设计。这里将源程序分享给大家。 

  • 本文向大家介绍C语言实现洗牌与发牌游戏,包括了C语言实现洗牌与发牌游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现洗牌与发牌游戏的具体代码,供大家参考,具体内容如下 普通版 高性能版 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。