Как напечатать объекты, вложенные в массивы в 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, который я когда-то написал.

Другие вопросы по тегам