2016-06-16 73 views
2

我有這個家庭作業,我們的老師希望我們在java中創建紙牌遊戲「戰爭」。其中很大一部分是將52張不同的牌洗牌成兩名玩家手牌。對於洗牌時的任何幫助,我將不勝感激。我是一個沒有經驗的編碼員,其他人張貼對我來說沒有任何意義。 我的代碼:如何將一副牌洗牌成兩隻手

package shuffle; 

import java.util.Random; 

public class SHUFFLE { 

    public static void main(String[] args) { 
     shuffle(); 
    } 

    public static void shuffle() { 
     Random r = new Random(); 
     int[] hand1 = new int[26]; 
     int[] hand2 = new int[26]; 
     int i = 1, rand, rand2; 
     int o = 1; 
     do { 
      System.out.println("Top"); 
      rand = r.nextInt(52) + 1; 
      rand2 = r.nextInt(2) + 1; 
      System.out.println("number generated: "+rand); 
      System.out.println("sector: " + rand2); 
      if (rand2 == 1) { 
       if (rand <= 52) { 
        while (hand1[o] > 0) { 
         if (hand1[o] == rand) { 
         } else { 
          hand1[o]--; 
         } 
        } 
        while (hand2[i] > 0) { 
         if (hand2[i] == rand) { 
         } else { 
          hand2[i]--; 
         } 
         hand1[o] = rand; 
         o++; 
        } 
       } 

      } 

      if (rand2 == 2) { 
       if (rand <= 52) { 
        while (hand1[o] > 0) { 
         if (hand1[o] == rand) { 
         } else { 
          hand1[o]--; 
         } 
        } 
        while (hand2[i] > 0) { 
         if (hand2[i] == rand) { 
         } else { 
          hand2[i]--; 
         } 
         hand2[i] = rand; 
         i++; 
        } 
       } 

      } 

     }while(hand1[o] < 26 && hand2[i] < 26); 
    } 

} 
+0

請對你的問題更具體一點,你想回答什麼? –

+1

只需根據http://stackoverflow.com/questions/24520782/java-shuffle-card-deck創建一個洗牌甲板,然後分成兩個小竅門 –

+0

我看了一下,但它超出了我的理解範圍,我無法掌握髮生了什麼 – hydregion

回答

1

不要把時間浪費在洗牌前甲板手,費舍爾耶茨洗牌是隨機從連排序甲板選擇卡片的一個更爲有效的方法。

你可以看到this answer來了解它是如何完成的,那麼它基本上是使用該算法將選定的卡分配到替代手中。

因此,底線(因爲它的功課僞代碼),您可以使用以下方法來創建的26卡的兩隻手各(與基於一個數組):

# Set up deck of cards with initial size, and empty hands. 

cards[] = [acespades, twospades, ..., queenhearts, kinghearts] 
quant = size(cards) 

hand1 = [] 
hand2 = [] 

# Need to distribute entire deck. 

while quant > 0: 
    # Get card for first hand using Fisher Yates shuffle 

    index = random(1..quant) 
    hand1.append(cards[index]) 
    cards[index] = cards[quant] 
    decrement quant 

    # If no cards left, exit the loop. 

    if quant == 0: 
     exit while 

    # Now get card for second hand. 

    index = random(1..quant) 
    hand2.append(cards[index]) 
    cards[index] = cards[quant] 
    decrement quant 

注意額外的請在那裏檢查您的原始套牌是否有奇數卡(if ... exit while位)。如果你知道甲板會是平坦的,這是不需要的 - 我只是把它放在那裏的情況下,甲板大小事先不知道)。

另請注意,有機會重構處理卡的代碼,以免重複該代碼。我會把它作爲一個教育練習。

+0

@hydregion解釋爲什麼你不打算爲你的任務打亂牌可能是有益的 – draksia

+1

偉大的代碼。有一件事我會調整 - 如果定量小於1而不是嵌套第二隻手的代碼 - 使if語句返回或打破循環,這使得它更具可讀性。 –