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
ほぼ大丈夫です。ただ持っている:
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;
playerインスタンスで初期化された配列を返します。
編集:
チェックアウトしてください ウィキペディアでこの表 広く使われている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を作成することができます。
私が見ている、そして私がこれについて間違っているかもしれないもう一つの論点は、あなたのプライベートPlayer [] InitializePlayers()はクラスが現在静的でないところで静的であるという事実です。そう:
private Player[] InitializePlayers(int playerCount)
{
...
}
最後のポイントは、おそらくそれを変更しようとしているメソッドの外側でplayerCountを宣言して、それに設定されている値が新しい値になり、メソッドの最後で破棄されないようにすることです。 "範囲。"
お役に立てれば
thePlayers[i] = new Player(i);
Player(i)
内のi
を削除しました。そしてそれはうまくいった。
そのため、コード行は次のようになります。
thePlayers[i] = new Player9();