2016-05-04 8 views
1

私は以下を達成しようとしていますが、シャッフルする前にデッキを印刷しようとしています。カードのデッキを印刷し、シャッフルして再印刷します。

Cardクラスの52個のオブジェクトを格納するDeckOfCardsというクラスを作成します。デッキをシャッフルしたり、カードを処理したり、デッキに残っているカードの数を報告する方法を含めます。シャッフル方法はフルデッキを想定する必要があります。シャッフルされたデッキから各カードを処理し、処理された各カードを印刷するメインメソッドでドライバクラスを作成します。

シャッフル前にデッキを処理する方法を理解できず、1枚のカードを扱い、いくつのカードがデッキにあるかを報告します。助けてください。

import java.util.Random; 

public class DeckofCard { 
    private Cards[] cards; 
    int i; 



    DeckofCard() 
    { 
     i=52; 
     cards = new Cards[52]; 
     int x=0; 
     for (int a=0; a<=3; a++) 
     { 
      for (int b=0; b<=12; b++) 
      { 
       cards[x] = new Cards(a,b); 
       x++; 
      } 
     } 
    } 

    public Cards drawFromDeck() 
    { 


     Random generator = new Random(); 
     int index=0; 

     do { 
      index = generator.nextInt(52); 
     } while (cards[index] == null); 

     i--; 
     Cards temp = cards[index]; 
     cards[index]= null; 
     return temp; 
    } 


    public int getTotalCards() 
    { 
     return i; 
    } 
} 

は、ここに私のカードクラス

public class Cards 
{ 
    private int rank, suit; 

    private static String[] suits = { "hearts", "spades", "diamonds", "clubs" }; 
    private static String[] ranks = { "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King" }; 


    Cards(int suit, int rank) 
    { 
     this.rank=rank; 
     this.suit=suit; 
    } 

    public @Override String toString() 
    { 
      return ranks[rank] + " of " + suits[suit]; 
    } 

    public int getRank() { 
     return rank; 
    } 

    public int getSuit() { 
     return suit; 
    } 

} 

と私の販売店です。

public class Dealers { 


    public static void main(String[] args) 
    { 


     DeckofCard deck = new DeckofCard(); 
     Cards C; 

     System.out.println(deck.getTotalCards()); 

     while (deck.getTotalCards()!= 0) 
     { 
      C = deck.drawFromDeck(); 
      System.out.println(C.toString()); 
     } 


    } 

} 
+0

これは宿題とよく似ていますが、これまでシャッフルの方法で試したことはありますか? – user1875195

+0

それは宿題であり、私が試みたことは間違っていると思います。 – Savage99

+0

ランダムジェネレーター=新しいランダム(); int index = 0; do { index = generator.nextInt(52); } while(cards [index] == null); i--; カードtemp = cards [index]; cards [index] = null; 戻り値。 – Savage99

答えて

2

シャッフル方法を実装する方法はいくつかあります。あなたのための宿題をしないと私は、次の2つの戦略を助言することができます。

  1. は、各インデックス・スワップで51

  2. へのカードのインデックス0からカードのリストトラバース

    • の順序をシャッフル別のランダムなインデックスを持つカード(それ自体でも、シャッフル時に同じ場所にカードが来る可能性があります)
    • 警告:このメソッドは学校目的では機能しますが、アルゴリズムlfは、ナイーブと見なされます。詳細については、thisの記事を参照してください。
  3. 余分なスタイルのためにFisher-Yates shuffleを見てください!

  4. 独自のメソッドを作成せず、代わりにJavaのCollections:shuffleメソッドを利用しないでください。

+0

Fisher-Yatesをしてください。最初の戦略は偏っています:http://blog.codinghorror.com/the-danger-of-naivete/ – gdejohn

+0

本当にフィッシャー・イェイツを知ることは、素晴らしいアイデアです。しかし、この質問の内容を判断して、私はそれが必要であると疑う。彼らは最適化を開始する前に、問題について快適に考えなければなりません。 –

+0

フィッシャー・イェーツは、初心者でさえも、(もしあれば)ほんのわずかしか複雑ではありません。それは最適化の問題ではありません。素朴なアプローチは単に間違っていると言うのは公正だと思います。偏ったシャッフルはあなたが望むものではありません。あなたは、元のポスターだけでなく、誰もがこの答えを見ることができると考える必要があります。素朴なアプローチが議論に値すると思うならば、偏見についての免責事項を少なくとも含むべきです。 – gdejohn

関連する問題