Как напечатать объекты, вложенные в массивы в Java
Программа для карточных игр, которую я создаю, должна запрашивать у пользователя количество игроков и количество карт в каждой руке, затем перетасовать колоду, затем сдавать карты, а затем отображать карты в каждой руке игрока. Он покажет руки для всех игроков, если в колоде недостаточно карт (мы не можем сдать 10 карт по 7 карт из колоды из 52 карт).
Я создал класс Card, класс Deck, класс Hand и драйвер для запуска программы. Так как это назначение, я должен придерживаться данных правил, и поэтому мне разрешено использовать только массивы, а не списки массивов. Моя проблема в том, что я не могу понять, как печатать объекты Card внутри объекта Hand, внутри массива Hands. Существует также, вероятно, гораздо лучший способ сделать это, но я ограничен тем, что мне разрешено импортировать / использовать. Могу ли я получить некоторую помощь о том, где искать объекты печати во вложенных массивах? Я не могу использовать свой метод, написанный в классе Hand, для добавления карт в Hands в массиве из-за отсутствия имени объекта.
РЕДАКТИРОВАТЬ: у меня есть конструктор в классе Hand создать руку размером с INT, переданной ему. Путаница заключается в том, что когда я узнаю, сколько игроков действительно играют в игру от пользователя, я создаю массив типа Hand в драйвере, который заполняется новыми объектами Hand с использованием цикла. В этот момент я понятия не имею, как ссылаться на каждый отдельный объект руки, чтобы я мог напечатать содержимое, используя toString(). У них, похоже, нет имени.
Код для подражания:
import java.util.Arrays;
import java.util.Scanner;
public class CardsDriver {
public static void main(String[] args)
{
Card c1 = new Card(); //create new card object
Scanner kb = new Scanner(System.in);
int cards;
int players;
System.out.print("How many players are in the game?");
players = Integer.parseInt(kb.nextLine());
System.out.print("\nHow many cards will be dealt to each player?");
cards = Integer.parseInt(kb.nextLine());
while ((cards * players) > 52)
{
System.out.print("There are not enough cards in the deck to deal " +
players + " hands of " + cards + " cards. try again.");
System.out.print("How many players are in the game?");
players = Integer.parseInt(kb.nextLine());
System.out.print("\nHow many cards will be dealt to each player?");
cards = Integer.parseInt(kb.nextLine());
}
Deck readyDeck = new Deck(); //create new deck
readyDeck.shuffleDeck(); //shuffle the newly built deck using Java.Util.Random
Hand[] playerHands= new Hand[players]; //create another array to hold all player hands
for(int index =0; index < playerHands.length; index++)
{
playerHands[index] = new Hand(cards); //create hand object for each player of the size input by the player
/*for (int index2 =0; index2<cards;index2++)
{
//fill each hand with cards using addcard somehow. i have no object name.
Hand.addCard(readyDeck.dealACard());
}*/
}
}
3 ответа
Предполагая, что вы переопределили toString
метод каждого из упомянутых классов, распечатка массивов должна быть так же просто, как вызов Arrays.toString()
метод (а не просто передать ссылку на массив System.out.println()
и его варианты.
Если вам интересно, как это обрабатывает вложенные массивы, toString()
метод класса Deck будет включать в себя вызов Arrays.toString
метод на массиве карт.
Пример:
class Card {
int suit, rank;
@Override
public String toString() {
// outputs something like ACE of SPADE
return suitToName(suit) + " of " + rankToName(rank);
}
}
class Deck {
private Card[] cards;
private String name;
@Override
public String toString() {
// prints : MyDeck -> [ACE of SPADE, ACE of HEART] etc.
return name + " -> " + Arrays.toString(cards);
}
}
Кстати, я думаю, что вы должны перечислять для ранга и мастей, а не возиться с целыми числами. Это было бы намного чище, я должен сказать.
Как Санджай предложил вам добавить это в класс вашей карты:
@Override
public String toString() {
...
}
Тогда просто используйте cardinstance.toString()
всякий раз, когда вы хотите распечатать свой объект карты, независимо от того, где он находится.
Я не знаю, чего вы пытаетесь достичь, но вот хороший пример хорошего программирования на Java(для создания Texas Hold Em).
http://code.google.com/p/texasholdem-java/source/checkout
Оформите заказ, посмотрите, как все сделано правильно, и вы можете использовать любую карточную игру.
Чтобы переопределить его, вы можете использовать новый мастер в новых версиях Eclipse или использовать плагин, такой как JUtils ToString Generator, который я когда-то написал.