2

我正在尝试在 Java 中对 2D 对象数组进行洗牌。我认为 Collections.shuffle 可以解决问题,但看起来它只会随机播放每一行中的对象,但不会将行混合在一起,这是我想要的。任何可以为我打乱二维数组的内置方法或易于实现的方法?数组是cards[13][4]

4

4 回答 4

6

看起来你想洗一副牌。

在现实世界的游戏中,我们首先洗牌,然后将牌分发给玩家。您尝试更改序列的顺序:您希望将已排序的牌组分发给玩家并要求他们交换牌,直到所有牌都洗牌;-)

正如斯蒂芬 C建议的那样:从玩家那里收集卡片,洗牌并再次分发。

于 2010-12-22T07:05:38.277 回答
4

IMO,找到一个预先存在的库类/方法来做这种事情的机会(非常接近)为零。它专业了。

但这没关系。这是一个 Java 101 编码问题 :-) 我采用的方法是将 2D 数组元素复制到 1D 数组中,将它们打乱,然后将它们复制回 2D 数组中。

于 2010-12-22T06:50:38.477 回答
4

既然你有一副牌,你应该把牌放在一个列表中(代表一副牌),然后洗牌。

如果我仍然需要解决洗牌二维数组的一般问题,我可能会制作一个二维数组的列表视图并通过它洗牌,如下所示:

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 回答
0

另一种选择是将数据存储在单个数组中,并根据 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 回答