Java - Как создать колоду карт (с упором на статические массивы)? - AP Computer Science Project
Это мой первый вопрос. Просто чтобы уточнить, я проверил, есть ли какие-нибудь вопросы, которые могли бы мне помочь, прежде чем задавать этот вопрос. Заранее извиняюсь, если я что-то делаю неправильно, я новичок.
В любом случае, для моего класса AP CS я должен сделать колоду карт и распечатать ее в текстовом окне. Я считаю, что я очень близок к тому, чтобы закончить. Как следует из названия, в общем, как мне создать колоду карт с упором на статические массивы? Но более того (после того, как ошибка, о которой я спрашиваю ниже, будет решена), при взгляде на код, который я произвел до сих пор, это правильный способ сделать это?
Вот данный код (то есть это нельзя изменить):
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 и сделать его все более кратким и лаконичным. Мой третий вопрос (который может понадобиться / может помочь решить, прежде чем ответить на два основных вопроса), как мне исправить эту ошибку при запуске программы?:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 52
at Deck.<init>(Lab11bst.java:89)
at Lab11bst.main(Lab11bst.java:5)
Заранее большое спасибо.
5 ответов
Я, к сожалению, нашел несколько логических ошибок, особенно с numberOfCards
Int, который вы использовали в качестве индекса для cards
массив. В результате я оптимизировал и исправил ваши class Deck
работает с основным методом и 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. Он очень адаптивен к именованию карт и настройке значений, так как вы можете заполнять соответствующие массивы любой информацией, которую хотите. Если вам нужны дальнейшие объяснения, дайте мне знать.
Вы установили 'numberOfCards = 52;' когда начальная колода. После этого, когда вам понадобится новая карта, вы вызываете numberOfCards++ в качестве индекса массива. Но массив только начальный с 52. Так что вы столкнулись с этой проблемой.
Это довольно просто. Вы получили переменную numberOfCards
который 52 в начале. Если вы проходите цикл for, вы пытаетесь получить индекс 52 из cards
массив. Так что брось ArrayIndexOutOfBoundsException
,
Первый элемент в массиве 0
Индекс не 1
индекс.
Вместо 52 вы должны начать с 51, чтобы вы не получили эту ошибку. Есть еще одна вещь, если вы увеличиваете 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()
вызовет переопределение toString()
метод в вашем Card
учебный класс
Первая проблема, как указал CodeMatrix - неправильная начальная точка, вы должны начать индекс массива с 0. С другой стороны - вы увеличиваете индекс массива из 52 элементов 4*13*10 (3 цикла) раз - это 520 приращений. Вот почему вы всегда будете выпрыгивать из диапазона.
Спасибо всем за ответы, они действительно помогли реализовать некоторые концепции для меня. Я хотел бы принять больше, чем один ответ на мой вопрос. Вот полная программа, с которой я закончил (с добавленным методом "случайного выбора", который я упустил ранее для простоты).
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;
}
}
}