2013-05-11 42 views
0

我有以下的java代碼,應該在卡組中「洗牌」牌。甲板是一個包含卡片對象的陣列列表。混洗甲板算法

private void ShuffleDeck() { 
    //Number of cards in deck 
    int deckSize = deck.size(); 

    //Swapping 100 cards 
    for(int i = 0; i < 15; i++) { 

     //Generating two random card indexes 
     int indexA = (int) ((Math.random() * deckSize-1)); 
     int indexB = (int) (Math.random() * deckSize-1); 
     System.out.println(indexA + " " + indexB); 

     //Getting objects 
     Card cardA = deck.get(indexA); 
     Card cardB = deck.get(indexB); 

     //Temporaily removing these cards from deck 
     deck.remove(cardA); 
     deck.remove(cardB); 

     //Swapping around the two cards 
     deck.add(indexA, cardB); 
     deck.add(indexB, cardA); 

    } 

} 

然而,當我運行這個方法有些卡似乎從甲板上「消失」 ......任何建議,這是爲什麼? :)

+1

你可以使用'Collections.shuffle'嗎? – wchargin 2013-05-11 18:38:04

+0

或者至少['Collections.swap()'](http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#swap%28java.util.List,%20int ,%20int 29%)? – 2013-05-11 18:39:38

+0

您是否需要在不使用其他軟件包/庫的情況下實現所有功能? I.E.這是一個學術演習嗎? – Makoto 2013-05-11 18:40:25

回答

9

假設deckList<Card>(包括ArrayList等):

public void shuffleDeck() { // please use camelCase method names 
    Collections.shuffle(deck); 
} 

不要重新發明輪子。

+0

好的,謝謝! :D不知道關於Collections庫:)另外,我被教會使用camelCase命名變量,使用FULL_UPPERCASE進行總結以及大寫每個字母的方法(即:MyOtherMethod):這是錯誤的嗎? :\ – MrD 2013-05-11 18:46:44

+0

是的,那是錯誤的。方法應該有小寫的開始字母。否則它將是Object.HashCode()和Object.Equals().... – rolfl 2013-05-11 18:48:34

+0

類名是PascalCased,方法和字段名是camelCased,常量是CAPITALIZED_UNDERSCORED。 – skuntsel 2013-05-11 18:54:25