我有一个关于如何洗牌数组的问题。背景是:
编写一个记忆匹配游戏,使用16张卡片,这些卡片排列在4*4的正方形中,并标有从1到8的成对数字。
目前,我需要做的是初始化这些卡并洗牌
现在我能想到的是创建一个Card类,包括从1到8的变量Rank,其次,命名一个新的类(matchingGame)(无论你喜欢什么),并编写一个新静态方法:shuffle()。
但我被这一步卡住了。
我的第一个问题是如何初始化这16张卡(8对)
(我认为我的代码不是有效的方法)。
我的第二个问题是初始化后如何洗牌?
我的代码是:
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);
}
....
}
感谢大家回答我之前的问题
同样背景下还有一个问题,作为你的好建议,你知道如何洗牌1D数组吗?
但是如何打乱2D阵列显然,我不能使用
List<Card> newcards = Arrays.asList(cards)
用于立即转换为列表。
感谢您的帮助
初始化数组的方法基本上是正确的:遍历数组并在每个点添加一个新实例。
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);
正如我认为您已经意识到的那样,没有必要在构造函数中使用switch
语句。只需将int参数的值直接分配给rank
即可。
我也不确定您的初始化方法中发生了什么。你创建了一个迭代两次的循环,以创建某个等级的卡?
至于洗牌,你可能想看看Knuth洗牌。
如果您线性地考虑卡片位置(即从左到右、从上到下的网格位置的单个列表),您可以简单地使用Collections实用程序类的shuffle()
方法:
List<Card> cards = new ArrayList<Card>();
// populate the list with what ever cards you want, how you want
Collections.shuffle(cards);
然后将卡片显示为网格
我强烈建议实现此算法。
它是有效的、众所周知的和正确的。你会惊讶于后者的重要性——看看这个有趣的例子,当赌场实现错误的洗牌算法时会发生什么。
我不明白你的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';s Collections.shuffle在做什么?