web-dev-qa-db-fra.com

Comment initialiser un tableau d'objets dans Java

Je souhaite initialiser un tableau d'objets Player pour un jeu de BlackJack. J'ai beaucoup lu sur les différentes manières d'initialiser des objets primitifs, comme un tableau d'ints ou un tableau de chaînes, mais je ne peux pas prendre le concept de ce que j'essaie de faire ici (voir ci-dessous). Je voudrais renvoyer un tableau d'objets Player initialisés. Le nombre d'objets de joueur à créer est un entier pour lequel je l'invite. Je pensais que le constructeur pourrait accepter une valeur entière et nommer le lecteur en conséquence lors de l'initialisation de certaines variables membres de l'objet Player. Je pense que je suis proche mais toujours assez confus.

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: Voici ce que je reçois après avoir changé ceci car j'ai compris votre suggestion:

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  
69
John Adams

C'est presque bien. Avoir juste:

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

Et que la boucle soit:

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

Et notez que la convention Java dicte que les noms de méthodes et de variables doivent commencer par des minuscules.

Mise à jour: mettez votre méthode dans le corps de la classe.

91
Bozho

Au lieu de

Player[PlayerCount] thePlayers;

tu veux

Player[] thePlayers = new Player[PlayerCount];

et

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

devrait renvoyer le tableau initialisé avec les instances de Player.

MODIFIER:

Vérifiez ce tableau sur wikipedia sur les conventions de dénomination pour Java qui est largement utilisé.

21
Bala R

Si vous n'êtes pas sûr de la taille du tableau ou s'il peut changer, vous pouvez le faire pour avoir un tableau statique.

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();
14
Ugur Kumru

Les tableaux ne sont pas modifiables après l'initialisation. Vous devez lui donner une valeur, et cette valeur est la longueur de ce tableau. Vous pouvez créer plusieurs tableaux pour contenir certaines parties des informations du joueur, comme leur main, etc., puis créer un tableauListe pour trier ces tableaux.

Un autre point de discorde que je vois, et je me trompe peut-être à ce sujet, est le fait que votre lecteur privé [] InitializePlayers () est statique alors que la classe est maintenant non statique. Alors:

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

Mon dernier point serait que vous devriez probablement déclarer playerCount en dehors de la méthode qui va la changer, de sorte que la valeur qui lui est affectée devienne également la nouvelle valeur et qu'elle ne soit pas simplement jetée à la fin de la méthode. "portée."

J'espère que cela t'aides

1
Dragoons299

thePlayers[i] = new Player(i); Je viens de supprimer le i à l'intérieur de Player(i); et cela a fonctionné.

la ligne de code devrait donc être:

thePlayers[i] = new Player9();
0
Ali yasar Erdogan