2

配列をシャッフルする方法について質問があります。背景は次のとおりです
。4*4の正方形に配置され、1から8までの数字のペアでラベル付けされた16枚のカードを使用するメモリマッチングゲームを作成します。

現在、私がする必要があるのは、これらのカードを初期化し、これらのカードをシャッフルすることです。

そして今、私が考えることができるのは、1から8までの変数Rankを含むCardクラスを作成し、次に、新しいクラス(matchingGame)(好きなもの)に名前を付け、新しい静的メソッドshuffle()を作成することです。

しかし、私はこのステップで立ち往生しています。

私の最初の質問は、これらの16枚のカード(8ペア)を初期化する方法ですか?
(私のコードは効率的な方法ではないと思います)。

私の2番目の質問は、初期化後にカードをシャッフルする方法です。

私のコードは次のとおりです。

public class Card 
{
private int rank;

public Card(int iniRank)
{
    switch (iniRank)
    {
    case 1:
        rank =1;
        break;
    case 2:
        rank =2;
        break;
    case 3:
        rank =3;
        break;
    case 4:
        rank =4;
        break;
    case 5:
        rank =5;
        break;
    case 6:
        rank =6;
        break;
    case 7:
        rank =7;
        break;
    case 8:
        rank =8;
        break;
    }
}

public int getRank()
{
    return rank;
}


}


public static void initialize(Card[] cards)
{
    for (int i=0;i<2;i++)
    {
        cards[i] = new Card(1);
    }
    for (int i=2;i<4;i++)
    {
        cards[i] = new Card(2);
    }
....
}    

私の前の質問をみんなに感謝します!
同じ背景でもう1つ質問があります。良いアドバイスとして、1D配列をシャッフルする方法を知っていますか?

しかし、2D配列をシャッフルする方法は?明らかに、私は使用できません

List<Card> newcards = Arrays.asList(cards) 

今すぐリストに変換してください。

助けてくれてありがとう

4

5 に答える 5

2

配列を初期化する方法は基本的に正しいです。配列をループして、各ポイントに新しいインスタンスを追加します。

Card[] cards = ...;
for (int i = 0; i < cards.length; i++)
    cards[i] = ...  // new Card instance

シャッフルのために-車輪の再発明をしないでください:使用Collections.shuffle

Card[] cards = ...;
List<Card> l = Arrays.asList(cards);
Collections.shuffle(l);
于 2012-12-07T02:38:08.703 に答える
1

カードの位置を直線的に(つまり、左から右、上から下へのグリッド位置の単一のリストとして)考える場合shuffle()は、Collectionsユーティリティクラスのメソッドを使用するだけです。

List<Card> cards = new ArrayList<Card>();
// populate the list with what ever cards you want, how you want
Collections.shuffle(cards);

次に、カードをグリッドとして表示します

于 2012-12-07T02:38:35.473 に答える
1

switchご存知のとおり、コンストラクターでステートメントを使用する必要はありません。rankintパラメータの値を直接割り当てるだけです。

また、初期化メソッドで何が起こっているのかもわかりません。特定のランクのカードを作成するために、2回繰り返すループを作成しますか?

シャッフルに関しては、クヌースシャッフルを見たいと思うかもしれません。

于 2012-12-07T02:33:33.163 に答える
0

このアルゴリズムを実装することを強くお勧めします。

それは効率的で、よく知られていて、正しいです。後者がいかに重要であるかに驚かれることでしょう。カジノが誤ったシャッフルアルゴリズムを実装したときに何が起こるかについての興味深い例については、これを参照してください。

于 2012-12-07T02:35:57.847 に答える
0

私はあなたのswitchステートメントを取得しません。次のようなCardクラスを作成できます。

public class Card 
{
   private int rank;

   public Card(int iniRank){
      rank = iniRank;
   }

   public int getRank(){
      return rank;
   }
}

あなたがmatchingGameクラスを作成するより。カードを16枚追加してシャッフルします。

public class matchingGame
{
   private List<Card> cards = null;

   public matchingGame(){
      cards = new ArrayList<Card>(16);
      for (int i=1; i<=8; i++)
      {
         cards.add(new Card(i));
         cards.add(new Card(i));
      }
   }

   public void shuffle()
   {
      //Shuffle algorithm here.
   }
}

アルゴリズムについては、この投稿を参照することをお勧めします。JavaのCollections.shuffleは何をしていますか?

于 2012-12-07T02:49:23.287 に答える