2017-11-09 38 views
1

私はArrayListカード(Object)を持っているカードゲームをコーディングしています。 それぞれのIDがあります。ランダムな順序で並べ替えを並べ替え

マルチプレイヤーモードをサポートするためにこのゲームを作成したいので、 2人のプレーヤーの間でゲームの進行を何らかの方法で送受信する必要があります。

ここで、カードを片手にシャッフルすると、他のカードで同じことをする必要がありますが、すべてのカードに画像があるので、送信する大きなパケットになります。

私が考えたのは、シャッフルされたリストの整数配列を送信することで、反対側で受信され、整数配列に続いて並べ替えられます。

シャッフルされた注文を送信して相手側に適用するにはどうすればよいですか?

+0

コレクション。shuffle()は片方の配列をシャッフルします。反対側のリストを元のようにシャッフルする方法はありますか? –

+0

反対側を1と同じにしたい場合は、ランダムシャッフルではありません。 –

答えて

1

この場合、Randomクラスを使用できます。ランダムの2つのインスタンスが同じシードで作成、および方法の 同じシーケンスを呼び出すごとに行われている場合は

、彼らが生成し、 番号の同一の配列を返します。この プロパティを保証するために、特定のアルゴリズムがクラスRandomに指定されています。 Java実装では、Javaコードの絶対的な移植性のために、 クラスのランダムについてここに示すすべてのアルゴリズムを使用する必要があります。

これは、クライアントにのみシード値を送信し、それを使用して新しいRandomインスタンスをインスタンス化し、他のプレイヤーのマシン上のように同じ乱数列を受け取ることを期待できることを意味します。

Collections.shuffleは、Randomソースで呼び出すことができます。

0

はい、ちょうど初期化と両側の開始時に52個のカードオブジェクトの読み取り専用の配列にカードを格納します。

final Card[] allCards = new Card[52] {...}; 

はを参照するために両側にアプリケーション全体で独占的にこの配列を使用します各カードはCardインスタンスの代わりにintインデックスのみを使用します。

deckのオブジェクトはint[52]です。最初は、0から51までのすべての数字が含まれます。次に、配列をシャッフルします。次にintの配列をもう一方の側に送り、もう一方の側に同じシャッフルされたデッキがあります。

+0

良いアイデアだが、プログラムのアーキテクチャの多くは変更する必要があります。私は、カードオブジェクトのインスタンスを渡す全体のプログラムで配列リストを使用しているインデックスを扱う変更をたくさん必要になります..一般的に、仲間ありがとう:) –

1

同じシードを持つ2つのjava.util.Randomインスタンスを初期化することはできますが、これらのインスタンスはHenrikが述べたようにCollections.shuffle()で使用できます。唯一の問題は、これらのインスタンスでCollections.shuffle()呼び出しを同じシーケンス(つまり同期)で呼び出す必要があることです。これは保証することができないかもしれません。たとえば、1人のプレイヤーが複数のカードシャッフルを非常に速く連続して要求し、もう1人が(ネットワークの問題のために)同期しなくなった場合です。

代替方法の1つは、両端で手動で並べ替えを行うことです。以下にイラストを示します。

public class Card { 
    private final int id; 
    private final String imageURL; 

    public Card(int id, String imageURL) { 
     this.id = id; 
     this.imageURL = imageURL; 
    } 

    public int getId() { 
     return id; 
    } 

    public String getImageURL() { 
     return imageURL; 
    } 

    /** 
    * Getters and setters below 
    */ 
} 


public class Example { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     final int NUMBER_OF_CARDS = 6; 
     // 
     final List<Card> originalList = new ArrayList<>(); 
     // 
     for (int i = 1; i <= NUMBER_OF_CARDS; i++) { 
      originalList.add(new Card(i, "image_url")); 
     } 
     //Create player card list 
     final List<Card> firstPlayerCardsList = new ArrayList<>(originalList); 
     final List<Card> secondPlayerCardsList = new ArrayList<>(originalList); 
     // 
     //1. Shuffle list on one side 
     Collections.shuffle(firstPlayerCardsList); 
     // 
     //2. Iterate over the list and add indices to array 
     final int[] indices = new int[NUMBER_OF_CARDS]; 
     //note indices are zero based to allign with arrays 
     for (int i = 0; i < NUMBER_OF_CARDS; i++) { 
      indices[i] = firstPlayerCardsList.get(i).getId(); 
     } 
     // 
     // 3. Send the shuffle indices array across to second player 
     // ********* omitted ****** 
     // 
     // 4. Recreate the shuffle order at the second players end, based on the shuffle indices array 
     final List<Card> tempCardsList = new ArrayList<>(secondPlayerCardsList); 
     secondPlayerCardsList.clear(); 
     IntStream.range(0, NUMBER_OF_CARDS).forEach((int index) -> { 
      final int id = indices[index]; 
      for (final Card c : tempCardsList) { 
       if (c.getId() == id) { 
        secondPlayerCardsList.add(c); 
       } 
      } 
      // can also use in place of the above 
      //tempCardsList.stream().filter((c) -> (c.getId() == id)).forEachOrdered((c) -> { 
      // secondPlayerCardsList.add(c); 
      //}); 
     }); 
     // Show the results for this illustration 
     System.out.println(" Original" + " First" + " Second"); 
     IntStream.range(0, NUMBER_OF_CARDS).forEach((int index) -> { 
      System.out.println("\t" + originalList.get(index).getId() +"\t" + firstPlayerCardsList.get(index).getId() + "\t" + secondPlayerCardsList.get(index).getId()); 
     }); 
    } 

} 
関連する問題