Java 使用if语句处理卡

Java 使用if语句处理卡,java,if-statement,while-loop,Java,If Statement,While Loop,我正试图根据玩家手中的牌数(最多5张),给玩家发x张牌。但是为了确保你不会两次发同一张牌,或者发一张已经玩过的牌,我使用了if语句 Card[] hand = new Card[5]; public void dealCard() { int cardCount = 0; Random ran = new Random(); if (cardCount < 5) { int times = 5 - cardCount; for (int l = 0; l &l

我正试图根据玩家手中的牌数(最多5张),给玩家发x张牌。但是为了确保你不会两次发同一张牌,或者发一张已经玩过的牌,我使用了if语句

Card[] hand = new Card[5];
public void dealCard() {
  int cardCount = 0;
  Random ran = new Random();

  if (cardCount < 5) {
    int times = 5 - cardCount;
    for (int l = 0; l < times; l++) {
      int index = ran.nextInt(deck.length);
      if (deck[index] != null) {
        hand[cardCount] = deck[index];
        deck[index] = null;
        cardCount++;
      }
    }
  }
}
Card[]hand=新卡[5];
公共信用卡(){
int cardCount=0;
Random ran=新的Random();
如果(卡数<5){
整数倍=5-卡片计数;
for(int l=0;l

一开始它似乎是有效的,但有时最后一张牌,也总是最后一张牌,是空的。有人告诉我,使用while循环可能更好,但只是为了了解我在这里做错了什么。

你的
for
循环总是精确执行五次,不管你在循环体中遇到
null
。您可以通过将
deck
的大小调整为
<5
来验证这一点。如果你的方法是正确的,它会陷入一个无休止的循环。相反,您将得到至少
5-deck.size
many
null
s。如果遇到
null
,一个快速而肮脏的解决方法是减少
l

if (deck[index] != null) {
    // ...
} else /* if (deck[index] == null) */ {
    --l;
}

我会一起推荐一种不同的策略。您可以预先确定所有卡片的顺序,而不是每次绘制卡片时生成随机索引,例如,使用。这样,您只需记住抽取了多少张卡,然后从数组/列表/队列中提取下一张卡。

您的
for
循环始终精确执行五次,无论您在循环体中遇到
null
的频率有多高。您可以通过将
deck
的大小调整为
<5
来验证这一点。如果你的方法是正确的,它会陷入一个无休止的循环。相反,您将得到至少
5-deck.size
many
null
s。如果遇到
null
,一个快速而肮脏的解决方法是减少
l

if (deck[index] != null) {
    // ...
} else /* if (deck[index] == null) */ {
    --l;
}

我会一起推荐一种不同的策略。您可以预先确定所有卡片的顺序,而不是每次绘制卡片时生成随机索引,例如,使用。这样,您只需记住已绘制了多少张卡,然后从阵列/列表/队列中提取下一张卡。

您可以使用
集合
来防止重复
nextInt(x)
返回
[0,x]中的整数[
这可能是您的问题如果
cardCount
初始化为
0
,则不需要最外层的
,如果
卡片[索引]==null
,因为无论您多么频繁地输入一个
null
值,您的
牌组
声明在哪里,您的
for
循环将始终执行5次。从牌组开始,从牌组中取出牌进行交易可能更有意义。然后,您不必考虑其中的大部分内容。您可以使用
设置
以防止重复
nextInt(x)
返回一个介于
[0,x]之间的整数[
这可能是您的问题如果
cardCount
初始化为
0
,则不需要最外层的
if
。此外,如果
deck[索引]==null
,因为无论您多么频繁地输入一个
null
值,您的
for
循环将始终执行5次。您的
deck
声明在哪里?从一个deck开始,并从中移除卡片进行交易可能更有意义。然后您不必考虑其中的大部分内容。