Java - 如何创建一副纸牌(重点是静态数组)? - AP计算机科学项目

Java - How to create a deck of cards (with a focus on static arrays)? - AP Computer Science Project

这是我的第一个问题。澄清一下,在问这个问题之前,我确实检查过是否有任何问题可以帮助我。如果我做错了什么,请提前道歉,我是新人。

无论如何,为了我的 AP CS class,我必须制作一副卡片并在文本中打印出来 window。我相信我已经非常接近完成了。正如标题所说,通常如何创建一副专注于静态数组的纸牌?但此外(在我下面询问的错误解决后),当查看我到目前为止生成的代码时,这是正确的方法吗?

这是给定的代码(这意味着不能更改):

public class Card
{
   private String suit;
   private String rank;
   private int value;

   public Card(String s, String r, int v)
   {
      suit = s;
      rank = r;
      value = v;
   }

   public String getSuit()       { return suit; }
   public String getRank()       { return rank; }
   public int getValue()         { return value; }

   public void setSuit(String s) { suit = s; }
   public void setRank(String r) { rank = r; }
   public void setValue(int v)   { value = v; } 

   public String toString()
   {
      return "[" + suit + ", " + rank + ", " + value + "]";
   }
}

这是我目前编写的代码:

public class Lab11bst
{
    public static void main(String[] args)
    {
      Deck deck = new Deck();
      System.out.println(deck);
    }
}


class Deck
{
   private int numberOfCards;
   private Card [] cards;
   private String [] suits = {"Clubs","Diamonds","Hearts","Spades"};
   private String rank;
   private int value;


   public Deck() // This creates a deck of 52 playing cards.
   {
      numberOfCards = 52;
      cards = new Card[52];
      for ( int suit = 0; suit <= 3; suit++ )
      {
         String [] ranks = {"Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten"};
         for ( int rank = 1; rank <= 13; rank++ )
         {
            if (rank == 1)
            {
               this.rank = "Ace";
            }
            else if (rank == 11)
            {
               this.rank = "Jack";
            }
            else if (rank == 12)
            {
               this.rank = "Queen";
            }
            else if (rank == 13)
            {
               this.rank = "King";
            }
            else
            {
               this.rank = "" + ranks[rank];
            }
            for ( int value = 1; value <= 10; value++ )
            {
               if (this.rank == "Ace")
               {
                  value = 1;
               }
               else if (this.rank == "Jack")
               {
                  value = 10;
               }
               else if (this.rank == "Queen")
               {
                  value = 10;
               }
               else if (this.rank == "King")
               {
                  value = 10;
               }
               else
               {
                  this.value = value;
               }
               cards [numberOfCards] = new Card(suits[suit],this.rank,value);
               numberOfCards ++;
            }
         }
      }
   }
}

看看我的代码,我很确定有更好的方法可以摆脱所有这些 if 语句并使其更加简短。我的sort-of第三个问题(可能是necessary/might在回答主要两个问题之前帮助解决)是我运行程序时如何修复这个错误?:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 52
    at Deck.<init>(Lab11bst.java:89)
    at Lab11bst.main(Lab11bst.java:5)

非常感谢您。

很简单。你有一个变量 numberOfCards ,它在开始时是 52。 如果您通过 for 循环,您将尝试从 cards 数组中获取 52 索引。这样就会抛出你的 ArrayIndexOutOfBoundsException

数组中的第一个元素是 0 索引而不是 1 索引。

您应该从 51 开始,而不是 52,这样您就不会收到此错误。还有一件事,如果你增加 numberOfCards 变量,它仍然会抛出该异常。

要在创建后打印每张卡片,我想做一些更改:

...
Card createdCard  = new Card(suits[suit], this.rank, value);
System.out.println(createdCard); //you can also do System.out.println(createdCard.toString());
cards[numberOfCards] = createdCard;
...

要在创建卡片后打印所有卡片,您可以这样做:

for(Card card : cards) {
    System.out.println(card);
}

System.out.println() 将在您的 Card class

中调用覆盖的 toString() 方法

第一个问题正如 CodeMatrix 指出的那样 - 起点错误,你应该从 0 开始数组索引。另一方面 - 你将 52 项数组的索引递增 4*13*10(3 次循环)次- 那是 520 个增量。这就是为什么你总是会跳出范围。

遗憾的是,我几乎没有发现逻辑错误,尤其是您用作 cards 数组索引的 numberOfCards 整数。因此,我优化并修复了你的 class Deck,它与你创建的 main 方法和 class Card 一起工作:

class Deck {
    private int numberOfCards = 52;
    private Card[] cards;

    private String[] suits = { "Clubs", "Diamonds", "Hearts", "Spades" };
    String[] ranks = { "Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen",
            "King" };
    int[] values = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 };

    private String rank;
    private int value;

    public Deck() // This creates a deck of 52 playing cards.
    {
        cards = new Card[numberOfCards];
        int currentCardId = 0;
        for (int suit = 0; suit <= 3; suit++) {
            for (int rank = 0; rank <= 12; rank++) {
                this.rank = "" + ranks[rank];
                this.value = values[rank];

                cards[currentCardId] = new Card(suits[suit], this.rank, value);
                System.out.println(cards[currentCardId].toString()); //print out the cards .toString() as it was added to the array
                currentCardId++;
            }
        }
    }
}

它填满了 Card[] cards,请随时使用 getter 和 systemout 对其进行测试。它非常适合卡片命名和值设置,因为您可以用您想要的任何信息填充相应的数组。如果您需要进一步的解释,请告诉我。

您已在初始 Deck 时设置 'numberOfCards = 52;'。 之后,当你需要新建Card时,调用numberOfCards++作为数组的索引。 但是数组只是以 52 开头。所以你遇到了这个问题。

谢谢大家提供的答案,他们确实帮助我强化了一些概念。我希望我能接受不止一个问题的答案。这是我最终得到的完整程序(添加了 "shuffle" 方法,为简单起见,我之前省略了该方法)。

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

class Deck {
   private String[] suits = { "Clubs", "Diamonds", "Hearts", "Spades" };
   String[] ranks = { "Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King" };
   int[] values = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 };

   private int numberOfCards = 52; // Variable name "size" was changed to "numberOfCards" to clarify self identifier further for programmer
   private Card[] cards;
   private String rank;
   private int value;

   public Deck()
   {
      cards = new Card[numberOfCards];
      for (int suit = 0; suit <= 3; suit++) 
      {
         for (int rank = 0; rank <= 12; rank++) 
         {
            for (int values = 0; values <=12; values++)
            this.rank = ranks[rank];
            this.value = values[rank];
            numberOfCards--;
            cards[numberOfCards] = new Card(suits[suit], this.rank, value);
         }
      }

      shuffle(); // Shuffle method call. Comment out to obtain an unshuffled, ordered deck of cards.

      for(Card card : cards) 
      {
         System.out.println(card);
      }
   }

   private void shuffle()
   { 
      for (int k = 1; k < 1000; k++)
      {
         int random1 = (int) (Math.random() * 52);
         int random2 = (int) (Math.random() * 52);
         Card temp = cards[random1];
         cards[random1] = cards[random2];
         cards[random2] = temp;
      }
   }
}