2

Java で 2D オブジェクト配列をシャッフルしようとしています。Collections.shuffle でうまくいくと思いましたが、各行のオブジェクトをシャッフルするだけで、行を混ぜ合わせないように見えます。私のために2D配列をシャッフルできる組み込みメソッドまたは実装が簡単なメソッドはありますか? 配列はcards[13][4].

4

4 に答える 4

6

カードのデッキをシャッフルしたいようです。

実際のゲームでは、最初にデッキをシャッフルしてから、カードをプレーヤーに配布します。あなたはシーケンスの順序を変えようとします:あなたはソートされたデッキをプレイヤーに配布し、すべてのカードがシャッフルされるまでカードを交換するようにプレイヤーに依頼したいです;-)

スティーブンCが提案したように、プレイヤーからカードを集め、デッキをシャッフルして、もう一度配布します。

于 2010-12-22T07:05:38.277 に答える
4

カードのデッキがあるので、カードをリスト(デッキを表す)に保持し、そのリストをシャッフルする必要があります。

2D配列をシャッフルするという一般的な問題を解決する必要がある場合は、おそらく2D配列のリストビューを作成し、次のようにシャッフルします。

import java.util.AbstractList;

public class TwoDimensionalArrayViewList extends AbstractList implements RandomAccess {
    private Object[][] array;

    public TwoDimensionalArrayViewList(Object[][] array) {
        this.array = array;
    }

    @Override
    public Object get(int index) {
        int row = rowForIndex(index);
        int column = columnForIndex(index);
        return array[row][column];
    }

    private int columnForIndex(int index) {
        return index % array[0].length;
    }

    private int rowForIndex(int index) {
        return index / array[0].length;
    }

    @Override
    public Object set(int index, Object element) {
        Object previous = get(index);
        int row = rowForIndex(index);
        int column = columnForIndex(index);
        array[row][column] = element;
        return previous;
    }

    @Override
    public int size() {
        return array.length*array[0].length;
    }
}

import org.junit.Test;

import java.util.Collections;
import java.util.List;

import static org.junit.Assert.assertEquals;

public class TwoDimensionalArrayViewListTest {
    @Test
    public void test() {
        Integer[][] array = { {1, 2, 3}, {4, 5, 6} } ;
        List list = new TwoDimensionalArrayViewList(array);
        assertEquals(1, list.get(0));
        assertEquals(2, list.get(1));
        assertEquals(3, list.get(2));
        assertEquals(4, list.get(3));
        assertEquals(5, list.get(4));
        assertEquals(6, list.get(5));
        Collections.shuffle(list);
    }
}
于 2010-12-22T07:11:49.213 に答える
4

IMO、この種のことを行う既存のライブラリ クラス/メソッドを見つける可能性は (非常に近い) ゼロです。専門的すぎます。

しかし、それは問題ありません。これは Java 101 コーディングの問題です :-) 私が取るアプローチは、2D 配列要素を 1D 配列にコピーし、それらをシャッフルして、2D 配列にコピーして戻すことです。

于 2010-12-22T06:50:38.477 に答える
0

もう1つのオプションは、データを単一の配列に格納し、i、jの値に基づいてこの配列のインデックスを計算することです。カード配列のシャッフルは教科書の問題になりました。

これは、個々の色(配列)をどのように渡すかによって、機能する場合と機能しない場合があります。

Card[] cards = new Card[52];
...

getCard(int i, int j){
   // Perhaps check ranges for i,j first.
   return cards[j+i*13]
}

もちろん、これらすべてを独自のクラスに入れる必要がありますDeck

于 2010-12-22T10:58:46.373 に答える