2

我有一个关于如何洗牌的问题。背景是:编写一个记忆配对游戏
,它使用 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);
    }
....
}    

谢谢大家对我之前的问题!
在同一背景下还有一个问题,作为您的好建议,您知道如何洗牌一维数组吗?

但是如何洗牌一个二维数组?显然,我不能使用

List<Card> newcards = Arrays.asList(cards) 

现在转换为列表。

感谢您的帮助

4

5 回答 5

2

您初始化数组的方法基本上是正确的:遍历数组并在每个点添加一个新实例。

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);
于 2012-12-07T02:38:08.703 回答
1

switch正如我认为您已经意识到的那样,无需在构造函数中使用语句。直接给 int 参数赋值rank即可。

我也不确定你的初始化方法发生了什么。您创建了一个循环两次,以创建一定等级的卡片?

就洗牌而言,您可能想看看Knuth shuffle

于 2012-12-07T02:33:33.163 回答
1

如果您以线性方式考虑卡片位置(即从左到右、从上到下的单个网格位置列表),您可以简单地使用shuffle()Collections 实用程序类的方法:

List<Card> cards = new ArrayList<Card>();
// populate the list with what ever cards you want, how you want
Collections.shuffle(cards);

然后将卡片显示为网格

于 2012-12-07T02:38:35.473 回答
0

我强烈建议实施这个算法。

它是有效的、众所周知的和正确的。您会惊讶于后者的重要性 -看到这个有趣的例子,当赌场实施不正确的洗牌算法时会发生什么。

于 2012-12-07T02:35:57.847 回答
0

我没有得到你的 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 is doing what?

于 2012-12-07T02:49:23.287 回答