【问题标题】:How to shuffle an array如何打乱数组
【发布时间】:2012-11-25 05:12:35
【问题描述】:

我有一个关于如何洗牌的问题。 背景是:
编写一个记忆配对游戏,它使用 16 张卡片,排列在一个 4*4 的正方形中,并标有从 1 到 8 的数字对。

目前,我需要做的是初始化这些卡片并洗牌。

现在我能想到的是创建一个包含变量 Rank 从 1 到 8 的 Card 类,其次,命名一个新类(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) 

现在转换为列表。

感谢您的帮助

【问题讨论】:

标签: java playing-cards


【解决方案1】:

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

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);

【讨论】:

  • @A. R. S. 你的意思是创建一个数组列表并使用 collections.shuffle 吗?以及如何洗牌?你能帮我吗?
  • @Ivy - 他已经回答了上面的问题:将数组转换为集合,随机播放,然后将其转换回数组。
  • @Ivy Collections.shuffle 采用 List(不是数组)。所以在我发布的代码中,我们首先将数组转换为List,在其上调用Collections.shuffle,然后将这个混洗列表转换回数组并恢复到原始变量中,正如jahroy 指出的那样。
  • 您不需要最后一个 toArray() 调用,因为 asList() 包装器将直写到数组。
【解决方案2】:

我认为您已经意识到,没有必要在您的构造函数中使用switch 语句。直接将int参数的值赋值给rank即可。

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

就洗牌而言,您可能需要查看Knuth shuffle

【讨论】:

  • 你在 Knuth shuffle 上打败了我!
  • 抱歉——我必须感谢 www.codinghorror.com 首次将它放入我的大脑! ;)
【解决方案3】:

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

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

然后将卡片显示为网格

【讨论】:

    【解决方案4】:

    我强烈建议实施this 算法。

    它是有效的、众所周知的和正确的。您会惊讶于后者的重要性 - see this for an interesting example 当赌场实施不正确的洗牌算法时会发生什么。

    【讨论】:

      【解决方案5】:

      我不明白你的 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?

      【讨论】:

        猜你喜欢
        • 2014-04-14
        • 2014-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-18
        相关资源
        最近更新 更多