如何改组数组

时间:2012-12-07 02:28:46

标签: java playing-cards

我有一个关于如何改组数组的问题。 背景是:
写一个记忆匹配游戏,它使用16张卡片,这些卡片布置在一个4 * 4的正方形中,并标有1到8的数字对。

目前,我需要做的是初始化这些卡片并随机播放这些卡片。

现在我能想到的是创建一个Card类,包括从1到8的变量Rank,其次,命名一个新类(matchingGame)(无论你喜欢什么)并编写一个新的静态方法:shuffle()。< / p>

但我坚持这一步。

我的第一个问题是如何初始化这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) 

现在转换为List。

感谢您的帮助

5 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

我认为您已经意识到,不需要在构造函数中使用switch语句。只需直接指定rank int参数的值。

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

就改组而言,您可能需要查看Knuth shuffle

答案 2 :(得分:1)

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

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

然后将卡显示为网格

答案 3 :(得分:0)

我强烈建议您实施this算法。

这是有效的,众所周知的,也是正确的。你会惊讶地发现后者是多么重要 - see this for an interesting example当赌场实施不正确的洗牌算法时会发生什么。

答案 4 :(得分:0)

我没有收到你的switch语句。您可以像这样创建一个Card类:

public class Card 
{
   private int rank;

   public Card(int iniRank){
      rank = iniRank;
   }

   public int getRank(){
      return rank;
   }
}

比你创建匹配的游戏类。添加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?