你的算法实际上并没有洗牌,它只是照原样复制它......这将为你洗牌,然后你可以拿最上面的元素来发牌。
public static Card[] shuffle(Card[] deck){
Card[] tempDeck = new Card[deck.length];
for (int i = 0; i < deck.length; i++) {
tempdeck[i] = deck[i];
}
Random r = new Random();
for (int i = tempDeck.length - 1; i > 0; i--){
int shuffleCard = r.nextInt(i + 1);
swap(tempDeck, i, shuffleCard);
}
return tempDeck;
}
public static void shuffle(Card[] deck, i, j) {
Card temp = deck[i];
deck[i] = deck[j];
deck[j] = temp;
}
如果您的牌组已经洗牌,那么数组不是最适合您的数据结构(因为数组保证具有相同数量的元素。发牌后它仍然有 52 个元素。考虑 a LinkedList
,然后处理一张卡只使用deck.pop()
,因为之后它将只有 51 个元素。
public LinkedList<Card> listDeck(Card[] cards) {
return new LinkedList<Card>(Arrays.asList(cards));
}
如果您必须使用数组,则可以这样做(这会将数组末尾的元素更改null
为发牌时。
// this modifies the original array
public static Card dealCard(Card[] deck) {
for(i = deck.length - 1; i >= 0; i--) {
if(deck[i] != null) {
Card toReturn = deck[i];
deck[i] = null;
return toReturn;
}
}
// Deck is empty!!
return null;
}