卡片程序的甲板返回空卡

时间:2014-06-06 21:02:19

标签: java

我试图建立一副牌并打印出每张牌。我有一个单独的卡类和一个持有甲板的类。我尝试使用Card类中的toString()方法打印所有卡片级别和套装。出于某种原因,它只打印13张卡(2-A所有CLUBS),其余为空。这是代码:

Card.java

public class Card
{
    private enum Suit {HEARTS, DIAMONDS, SPADES, CLUBS};
    private Suit suit;
    private String rank;

    public Card(String r, int index)
    {
            rank = r;
            setSuit(index);
    }

    public void setSuit(int index)
    {
            switch(index)
            {
                  case 0:
                     suit = suit.HEARTS;
                     break;
                  case 1:
                     suit = suit.DIAMONDS;
                     break;
                  case 2:
                     suit = suit.SPADES;
                     break;
                  case 3:
                     suit = suit.CLUBS;
                     break;
            }
    }

    public String toString()
    {
            return (rank + " of " + suit);
    }
}

Deck.java

public class Deck
{
    private Card [] card = new Card[52];

    public Deck()
    {
            for(int i = 0; i < 13; i++)
            {
                  for(int j = 0; j < 4; j++)
                  {
                     if(i < 9)
                         card[i] = new Card(Integer.toString(2+i), j);
                     else if(i == 9)
                         card[i] = new Card("J", j);
                     else if(i == 10)
                         card[i] = new Card("Q", j);
                     else if(i == 11)
                         card[i] = new Card("K", j);
                     else
                         card[i] = new Card("A", j);
                  }
            }
    }

    public Card getInfo(int index)
    {
            return card[index];
    }
}

Test.java

public class Test
{
    public static void main(String [] args)
    {
            Deck deck = new Deck();

            for(int i = 0; i < 52; i++)
                     System.out.println(deck.getInfo(i));
    }
}

任何帮助将不胜感激!

编辑:我不能使用你在这里看不到的任何东西。

5 个答案:

答案 0 :(得分:1)

在你的Deck构造函数中,你永远不会为索引大于12分配卡(因为我永远不会超过12)

您应该使用card[i]

,而不是使用card[(i+1)*j]

其他选项是使用另一个变量(比如index)来跟踪卡数。

 public Deck()
{
        int index = 0;
        for(int i = 0; i < 13; i++)
        {
              for(int j = 0; j < 4; j++)
              {
                 if(i < 9)
                     card[index] = new Card(Integer.toString(2+i), j);
                 else if(i == 9)
                     card[index] = new Card("J", j);
                 else if(i == 10)
                     card[index] = new Card("Q", j);
                 else if(i == 11)
                     card[index] = new Card("K", j);
                 else
                     card[index] = new Card("A", j);

               // Now increment the index
               index++;
              }
        }
}

答案 1 :(得分:1)

Deck()中有两个循环 - i循环覆盖面值,j循环遍历套件。但是,您总是分配给card[i],有效地覆盖它四次,每个套件一次。 相反,您应该考虑i,并将值分配给card[i * 4 + j]

public Deck()
{
        for(int i = 0; i < 13; i++)
        {
              for(int j = 0; j < 4; j++)
              {
                 index = (i * 4) + j;
                 if(i < 9)
                     card[index] = new Card(Integer.toString(2+i), j);
                 else if(i == 9)
                     card[index] = new Card("J", j);
                 else if(i == 10)
                     card[index] = new Card("Q", j);
                 else if(i == 11)
                     card[index] = new Card("K", j);
                 else
                     card[index] = new Card("A", j);
              }
        }
}

答案 2 :(得分:0)

你只是将你的数组的相同元素设置为4个卡,每次循环你需要我在某个时刻等于51来设置所有卡或使用某种计数器。

答案 3 :(得分:0)

这里的问题是你要覆盖卡[i] 3次。当你循环浏览j时,你会写入同一张牌[i],所以由于俱乐部是最后一个值,所以它们是套牌中唯一的牌(所有其他牌都被覆盖)

答案 4 :(得分:0)

一项建议: 在switch语句中有一个默认大小写

您的错误就是这里,您的卡片索引仅设置为0到12,因此您的所有卡片只会从卡片0到卡片12初始化。

改变这个:     卡[i] = .... 对此:     卡[i + 13 * j] = ....