web-dev-qa-db-ja.com

Javaでオブジェクトの配列を初期化する方法

BlackJackゲーム用のPlayerオブジェクトの配列を初期化したいのですが。整数の配列や文字列の配列のようなプリミティブオブジェクトを初期化するためのさまざまな方法についてたくさん読んだことがありますが、ここでやろうとしていることに概念をとらえることはできません(下記参照)。初期化された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  
68
John Adams

ほぼ大丈夫です。ただ持っている:

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

そしてループを次のようにします。

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

また、Java規約では、メソッドと変数の名前は小文字で始めるように定められています。

更新:あなたのメソッドをクラス本体の中に入れてください。

89
Bozho

の代わりに

Player[PlayerCount] thePlayers;

欲しい

Player[] thePlayers = new Player[PlayerCount];

そして

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

playerインスタンスで初期化された配列を返します。

編集:

チェックアウトしてください ウィキペディアでこの表 広く使われているJavaの命名規則について==。

20
Bala R

配列のサイズがわからない場合や、サイズが変更される可能性がある場合は、静的配列を使用するようにしてください。

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

初期化後に配列を変更することはできません。あなたはそれに値を与えなければなりません、そしてその値はその配列の長さが維持するものです。あなたは彼らの手などのようなプレイヤー情報の特定の部分を含むために複数の配列を作成することができますそしてそれらの配列を分類するためにarrayListを作成することができます。

私が見ている、そして私がこれについて間違っているかもしれないもう一つの論点は、あなたのプライベートPlayer [] InitializePlayers()はクラスが現在静的でないところで静的であるという事実です。そう:

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

最後のポイントは、おそらくそれを変更しようとしているメソッドの外側でplayerCountを宣言して、それに設定されている値が新しい値になり、メソッドの最後で破棄されないようにすることです。 "範囲。"

お役に立てれば

1
Dragoons299

thePlayers[i] = new Player(i);Player(i)内のiを削除しました。そしてそれはうまくいった。

そのため、コード行は次のようになります。

thePlayers[i] = new Player9();
0