洗牌的卡片组。将5张牌交易给4名玩家

时间:2017-01-02 20:53:18

标签: java arrays

我有这个洗牌的牌组,我应该这样做,以便向4名玩家分发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 of Diamonds
  • 10 of Diamonds
  • 10 of Diamonds
  • 10 of Diamonds
  • 10 of Diamonds
  • 6 of Hearts
  • 6 of Hearts
  • 6 of Hearts
  • 6 of Hearts
  • 6 of Hearts
  • 10个黑桃
  • 10个黑桃
  • 10个黑桃
  • 10个黑桃
  • 10个黑桃

如果我打算向四名玩家交出五张不同的牌,我该怎么做呢?

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

5 个答案:

答案 0 :(得分:1)

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

Collections.shuffle(deck, new Random())

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

现在问你的问题。阵列不是一副牌的好表现。堆叠或队列会更好,因为它们都允许您一次从卡片中取出一张卡片。有了这个阵列,你正在偷看一个指数的牌组,这不是我们应该如何在现实生活中打牌。理想情况下,交易行为是将牌从牌组转移到牌手的手中,保持在牌组阵列中会很难跟踪。

答案 1 :(得分:1)

打印结果时出错。使用

// 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)

答案 2 :(得分:1)

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++;
    }
 }

答案 3 :(得分:0)

将最后一个循环更改为:

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

答案 4 :(得分:-1)

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

@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet UITextField *utr;
@property (weak, nonatomic) IBOutlet UITextField *voskh;
@property (weak, nonatomic) IBOutlet UITextField *obed;
@property (weak, nonatomic) IBOutlet UITextField *predz;
@property (weak, nonatomic) IBOutlet UITextField *vecher;
@property (weak, nonatomic) IBOutlet UITextField *noch;