我有这个洗牌的牌组,我应该这样做,以便向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])
}
}
我被困在最后一部分。我为四名球员获得了五张类似的牌。 它看起来像这样:
如果我打算向四名玩家交出五张不同的牌,我该怎么做呢?
我在Java编码,做数组,我不能使用任何java utils。
答案 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;