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