Java 使用if语句处理卡
我正试图根据玩家手中的牌数(最多5张),给玩家发x张牌。但是为了确保你不会两次发同一张牌,或者发一张已经玩过的牌,我使用了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
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
manynull
s。如果遇到null
,一个快速而肮脏的解决方法是减少l
:
if (deck[index] != null) {
// ...
} else /* if (deck[index] == null) */ {
--l;
}
我会一起推荐一种不同的策略。您可以预先确定所有卡片的顺序,而不是每次绘制卡片时生成随机索引,例如,使用。这样,您只需记住抽取了多少张卡,然后从数组/列表/队列中提取下一张卡。您的
for
循环始终精确执行五次,无论您在循环体中遇到null
的频率有多高。您可以通过将deck
的大小调整为<5
来验证这一点。如果你的方法是正确的,它会陷入一个无休止的循环。相反,您将得到至少5-deck.size
manynull
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开始,并从中移除卡片进行交易可能更有意义。然后您不必考虑其中的大部分内容。