我正在尝试向玩家交付x张牌,具体取决于他们手中已有多少牌(最多5张)。但是为了确保你没有两次获得相同的卡,或者发了一张已经玩过的卡,我使用了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++;
}
}
}
}
它似乎最初工作,但每隔一段时间,最后一张卡,它总是最后一张卡,是空的。有人告诉我,使用while循环可能会更好,但仅仅是为了学习我在这里做错了什么。
答案 0 :(得分:0)
无论您在循环体内遇到for
的频率如何,您的null
循环始终执行五次。您可以通过将deck
的大小设置为< 5
来验证这一点。如果你的方法工作正确,它应该陷入无限循环。相反,您将获得至少5 - deck.size
多个null
s。快速和快速如果遇到l
:
null
if (deck[index] != null) {
// ...
} else /* if (deck[index] == null) */ {
--l;
}
我会推荐一个完全不同的策略。您可以预先确定所有卡片的顺序,而不是每次想要绘制卡片时生成随机索引。使用Fisher-Yates-Shuffle。这样,您只需要记住绘制了多少张牌并从阵列/列表/队列中提取下一张牌。