Ich möchte ein Array von Player-Objekten für ein BlackJack-Spiel initialisieren. Ich habe viel über verschiedene Möglichkeiten gelesen, primitive Objekte wie ein Array von Ints oder ein Array von Strings zu initialisieren, aber ich kann das Konzept nicht auf das übertragen, was ich hier versuche (siehe unten). Ich möchte ein Array initialisierter Player-Objekte zurückgeben. Die Anzahl der zu erstellenden Player-Objekte ist eine Ganzzahl, für die ich den Benutzer auffordere. Ich dachte, der Konstruktor könnte einen ganzzahligen Wert akzeptieren und den Player entsprechend benennen, während einige Mitgliedsvariablen des Player-Objekts initialisiert werden. Ich denke, ich bin nah dran, aber immer noch ziemlich verwirrt.
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: Folgendes erhalte ich, nachdem ich dies geändert habe, da ich Ihren Vorschlag verstanden habe:
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
quelle
Player
statisch ist? Können Sie vielleicht versuchen, dasstatic
Schlüsselwort daraus zu entfernen ?Antworten:
Es ist fast in Ordnung. Nur haben:
Player[] thePlayers = new Player[playerCount + 1];
Und lassen Sie die Schleife sein:
for(int i = 0; i < thePlayers.length; i++)
Beachten Sie, dass die Java-Konvention vorschreibt, dass Namen von Methoden und Variablen mit Kleinbuchstaben beginnen sollen.
Update: Fügen Sie Ihre Methode in den Klassenkörper ein.
quelle
Anstatt
Sie wollen
Player[] thePlayers = new Player[PlayerCount];
und
for(int i = 0; i < PlayerCount ; i++) { thePlayers[i] = new Player(i); } return thePlayers;
sollte das mit Player-Instanzen initialisierte Array zurückgeben.
BEARBEITEN:
Schauen Sie sich diese Tabelle auf Wikipedia zu Namenskonventionen für Java an, die weit verbreitet sind.
quelle
Wenn Sie sich über die Größe des Arrays nicht sicher sind oder sich ändern können, können Sie dies tun, um ein statisches Array zu erhalten.
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();
quelle
List<Player> thePlayersList = new ArrayList<Player>();
Object thePlayersList = new ArrayList<Player>();
.Wenn Sie die Anzahl der Spieler fest codieren können
Player[] thePlayers = { new Player(0), new Player(1), new Player(2), new Player(3) };
quelle
Arrays können nach der Initialisierung nicht mehr geändert werden. Sie müssen ihm einen Wert geben, und dieser Wert ist die Länge des Arrays. Sie können mehrere Arrays erstellen, um bestimmte Teile der Spielerinformationen wie ihre Hand und dergleichen zu enthalten, und dann eine Array-Liste erstellen, um diese Arrays zu sortieren.
Ein weiterer Streitpunkt, den ich sehe und bei dem ich mich möglicherweise irre, ist die Tatsache, dass Ihr privater Player [] InitializePlayers () statisch ist, wobei die Klasse jetzt nicht statisch ist. Damit:
private Player[] InitializePlayers(int playerCount) { ... }
Mein letzter Punkt wäre, dass Sie playerCount wahrscheinlich außerhalb der Methode deklarieren sollten, die es ändern wird, damit der darauf festgelegte Wert auch zum neuen Wert wird und nicht nur am Ende der Methode weggeworfen wird "Umfang."
Hoffe das hilft
quelle
Player[] players = Stream.iterate(0, x-> x+1 ).limit(PlayerCount).map(i -> new Player(i)).toArray(Player[]::new);
quelle
thePlayers[i] = new Player(i);
Ich habe gerade dasi
Innere gelöschtPlayer(i)
; und es hat funktioniert.Die Codezeile sollte also sein:
thePlayers[i] = new Player9();
quelle
public Player(int i)
Daher sollte zunächst eine ganzzahlige Eingabe erforderlich sein.