2011-04-19 107 views
1

牌必須依次按照上半部分和下半部分的順序進行交替,直到它通過52張牌組。每層甲板一半有26卡,他們按以下順序去:如何在java中構建一種卡片洗牌方法以便按特定順序進行卡片轉出?

top1, bottom1, top2, bottom2, top3, bottom3, top4, bottom 4, ..., top n, bottom n 

我想這樣做的:在使用中,他們的順序Card[] topHalf= new Card[cards.length/2];

public void shuffle() { 
    int index = 0; 

    for (int suit = 0; suit <= 1; suit++) { 
     for (int value = 1; value <= 13; value++) { 
      cards[index] = new Card(value, suit); 
      index++; 
     } 
    } 
    Card[] botHalf= new Card[(cards.length+26)/2]; 

    int index2 = 0; 

    for (int suit = 2; suit <= 3; suit++) { 
     for (int value = 1; value <= 13; value++) { 
      cards[index] = new Card(value, suit); 
      index2++; 

     } 
     for (int row = 0; row < cards.length; row++){ 

      row++; 

      Card [] temp = new Card[(topHalf.length)+botHalf.length]; 
     //cards[row]= cards[index]; 
    } 
+2

請澄清;它不是洗牌,如果你把這張牌放在特定的順序 – ninjagecko 2011-04-19 01:55:23

+1

@ninja我認爲我們正在尋找的短語是「淺灘洗牌」。 – 2011-04-19 02:09:13

+0

如果他正在尋找步槍洗牌或「猴子洗牌」作爲java開發人員把它放在集合API中已經有一個方法。 – Woot4Moo 2011-04-19 02:14:27

回答

0

存儲卡的有序映射顯示爲關鍵。 Sorted Map將爲您排序。然後,您可以通過他們所有的迭代順序:

SortedMap map = new SortedMap(); 

map.put(1, "top1"); 
map.put(2, "bottom1"); 
map.put(3, "top2"); 
... 
... 
... 
Iterator iterator = map.keySet().iterator(); 
while (iterator.hasNext()) { 
    Object key = iterator.next(); 
    System.out.println(" card :" + map.get(key)); 
} 
+0

...除了你的排序不起作用,因爲你使用的是字符串而不是整數。因此10會出現在1和2之間。常見的錯誤。此外,這不能回答這個問題。 – BoffinbraiN 2011-04-19 16:16:00

+0

@BoffinbraiN:將字符串中的密鑰更改爲整數,從不在嘴裏看禮物。它適合他對問題的描述,我沒有看到其他人在實際代碼中輸入內容。 – Marc 2011-04-19 18:15:55

+0

我從未學習過地圖。我仍然試圖弄清楚這一點。我覺得很愚蠢 – Cferrel 2011-04-19 19:27:36

0

只是爲了澄清,這聽起來像你想將安排數

1 2 3 4 5 6 7 8

1 8 2 7 3 6 4 5洗牌。

執行此操作的最有效方法是創建一個新數組,因爲就地交換元素並不容易,速度也不快。在這種模式中的關鍵觀察是,每個偶數元素(從索引0開始,因此第一個元素是偶數)從甲板開始向上計數,而奇數元素從甲板結束向後計數。

使用這些信息,我們可以遍歷新數組,根據當前索引是奇數還是偶數,從特定索引值複製原始數組。如果在我們的新陣列的當前索引稱爲i,然後

  • 如果i是偶數,那麼我們需要的元素的索引爲i/2
  • 如果i是奇數,則該元素的索引爲array.length - (i+1)/2(中+1是四捨五入到最接近的偶數)

下面是代碼:

public static Card[] rifleShuffle(Card[] deck) { 
    Card[] newDeck = new Card[deck.length]; 

    for (int i = 0; i < newDeck.length; i++) { 
     // Check whether current index is odd or even by using mod 2 
     if (i % 2 == 0) { 
      newDeck[i] = deck[i/2]; 
     } else { 
      newDeck[i] = deck[deck.length - ((i + 1)/2)]; 
     } 
    } 

    return newDeck; 
} 

public static void main(String[] args) { 
    Card[] deck1 = new Card[52]; 

    int i = 0; 
    for (int suite = 0; suite < 4; suite++) { 
     for (int value = 1; value <= 13; value++) { 
      deck1[i++] = new Card(value, suite); 
     } 
    } 

    System.out.println("Before shuffling: " + Arrays.toString(deck1)); 

    Card[] deck2 = rifleShuffle(deck1); 

    System.out.println("After shuffling: " + Arrays.toString(deck2)); 
}