Подтвердить что ты не робот

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

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

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;
}

РЕДАКТИРОВАТЬ - ОБНОВЛЕНИЕ: Вот что я получаю после изменения этого, поскольку я понял ваше предложение:

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$1.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  
4b9b3361

Ответ 1

Это почти прекрасно. Просто выполните:

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

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

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

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

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

Ответ 2

Вместо

Player[PlayerCount] thePlayers;

вы хотите

Player[] thePlayers = new Player[PlayerCount];

и

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

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

EDIT:

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

Ответ 3

Если вы не уверены в размере массива или можете его изменить, вы можете сделать это с помощью статического массива.

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();

Ответ 4

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

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

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

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

Надеюсь, что это поможет

Ответ 5

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

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

thePlayers[i] = new Player9();