Как инициализировать массив объектов в Java


Я хочу инициализировать массив объектов игрока для игры в блэкджек. Я много читал о различных способах инициализации примитивных объектов, таких как массив ints или массив строк, но я не могу принять концепцию того, что я пытаюсь сделать здесь (см. ниже). Я хотел бы вернуть массив инициализированных объектов игрока. Количество объектов игрока для создания-это целое число, для которого я запрашиваю пользователя. Я думал, что конструктор может принять целочисленное значение и назвать игрока соответственно при инициализации некоторых переменных-членов объекта игрока. Я думаю, что я близок, но все еще довольно смущен тоже.

static class Player
{
    private String Name;
    private int handValue;
    private boolean BlackJack;
    private TheCard[] Hand;

    public Player(int i)
    {
        if (i == 0)
        {
            this.Name = "Dealer"; 
        }
        else
        {
            this.Name = "Player_" + String.valueOf(i);
        }
        this.handValue = 0;
        this.BlackJack = false;
        this.Hand = new TheCard[2];
    } 
}
private static Player[] InitializePlayers(int PlayerCount)
{ //The line below never completes after applying the suggested change
    Player[PlayerCount] thePlayers;
    for(int i = 0; i < PlayerCount + 1; i++)
    {
        thePlayers[i] = new Player(i);
    }
    return thePlayers;
}

EDIT-UPDATE: Вот что я получаю после изменения этого, как я понял ваше предложение:

Thread [main] (Suspended)   
    ClassNotFoundException(Throwable).<init>(String, Throwable) line: 217   
    ClassNotFoundException(Exception).<init>(String, Throwable) line: not available 
    ClassNotFoundException.<init>(String) line: not available   
    URLClassLoader.run() line: not available  
    AccessController.doPrivileged(PrivilegedExceptionAction<T>, AccessControlContext) line: not available [native method]   
    Launcher$ExtClassLoader(URLClassLoader).findClass(String) line: not available   
    Launcher$ExtClassLoader.findClass(String) line: not available   
    Launcher$ExtClassLoader(ClassLoader).loadClass(String, boolean) line: not available 
    Launcher$AppClassLoader(ClassLoader).loadClass(String, boolean) line: not available 
    Launcher$AppClassLoader.loadClass(String, boolean) line: not available  
    Launcher$AppClassLoader(ClassLoader).loadClass(String) line: not available  
    BlackJackCardGame.InitializePlayers(int) line: 30   
    BlackJackCardGame.main(String[]) line: 249  
5 59

5 ответов:

Это почти нормально. Просто есть:

Player[] thePlayers = new Player[playerCount + 1];

и пусть цикл будет:

for(int i = 0; i < thePlayers.length; i++)

и обратите внимание, что соглашение java диктует, что имена методов и переменных должны начинаться с нижнего регистра.

обновление: поместите свой метод в тело класса.

вместо

Player[PlayerCount] thePlayers;

вы хотите

Player[] thePlayers = new Player[PlayerCount];

и

for(int i = 0; i < PlayerCount ; i++)
{
    thePlayers[i] = new Player(i);
}
return thePlayers;

должен возвращать массив, инициализированный экземплярами игрока.

EDIT:

до эта таблица в Википедии о соглашениях об именах для java, которые широко используются.

Если вы не знаете размер массива или если он может изменить, вы можете сделать это, чтобы иметь статический массив.

ArrayList<Player> thePlayersList = new ArrayList<Player>(); 

thePlayersList.add(new Player(1));
thePlayersList.add(new Player(2));
.
.
//Some code here that changes the number of players e.g

Players[] thePlayers = thePlayersList.toArray();

массивы не могут быть изменены после инициализации. Вы должны придать ему значение, и это значение является то, что длина массива остается. Вы можете создать несколько массивов, содержащих определенные части информации игрока, такие как их рука и т. д., а затем создать arrayList для сортировки этих массивов.

еще один спорный момент, который я вижу, и я могу ошибаться в этом, заключается в том, что ваш частный игрок[] InitializePlayers() статичен, где класс теперь нестатичен. Итак:

private Player[] InitializePlayers(int playerCount)
{
 ...
}

мой последний пункт будет заключаться в том, что вы, вероятно, должны иметь playerCount объявленный вне метода, который собирается изменить его так, чтобы значение, которое установлено для него, стало новым значением, а не просто отброшено в конце области действия метода."

надеюсь, что это помогает

thePlayers[i] = new Player(i); Я только что удалил i внутри Player(i); и это сработало.

поэтому строка кода должна быть:

thePlayers[i] = new Player9();