Quiero inicializar una serie de objetos Player para un juego de BlackJack. He leído mucho sobre varias formas de inicializar objetos primitivos como una matriz de entradas o una matriz de cadenas, pero no puedo llevar el concepto a lo que estoy tratando de hacer aquí (ver más abajo). Me gustaría devolver una matriz de objetos Player inicializados. El número de objetos de jugador para crear es un número entero que le pregunto al usuario. Estaba pensando que el constructor podría aceptar un valor entero y nombrar al jugador en consecuencia mientras inicializaba algunas variables miembro del objeto Player. Creo que estoy cerca, pero todavía estoy bastante confundido.
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;
}
EDITAR - ACTUALIZAR: Esto es lo que obtengo después de cambiar esto, ya que entendí su sugerencia:
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
fuente
Player
clase de suero sea estática? ¿Puede intentar quitarle lastatic
palabra clave?Respuestas:
Está casi bien. Solo tienes:
Player[] thePlayers = new Player[playerCount + 1];
Y deja que el bucle sea:
for(int i = 0; i < thePlayers.length; i++)
Y tenga en cuenta que la convención de Java dicta que los nombres de métodos y variables deben comenzar con minúsculas.
Actualización: coloque su método dentro del cuerpo de la clase.
fuente
En vez de
usted quiere
Player[] thePlayers = new Player[PlayerCount];
y
for(int i = 0; i < PlayerCount ; i++) { thePlayers[i] = new Player(i); } return thePlayers;
debería devolver la matriz inicializada con instancias de Player.
EDITAR:
Consulte esta tabla en wikipedia sobre convenciones de nomenclatura para Java que se usa ampliamente.
fuente
Si no está seguro del tamaño de la matriz o si puede cambiar, puede hacer esto para tener una matriz estática.
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();
fuente
List<Player> thePlayersList = new ArrayList<Player>();
Object thePlayersList = new ArrayList<Player>();
.Si puede codificar el número de jugadores
Player[] thePlayers = { new Player(0), new Player(1), new Player(2), new Player(3) };
fuente
Las matrices no se pueden cambiar después de la inicialización. Tienes que darle un valor, y ese valor es lo que permanece la longitud de la matriz. Puede crear múltiples matrices para contener ciertas partes de la información del jugador como su mano y tal, y luego crear una lista de matrices para guiar esas matrices.
Otro punto de discordia que veo, y puedo estar equivocado sobre esto, es el hecho de que su Player privado [] InitializePlayers () es estático donde la clase ahora es no estática. Entonces:
private Player[] InitializePlayers(int playerCount) { ... }
Mi último punto sería que probablemente debería haber declarado playerCount fuera del método que lo va a cambiar para que el valor que se le asigna se convierta en el nuevo valor también y no se descarte al final del método "alcance."
Espero que esto ayude
fuente
Player[] players = Stream.iterate(0, x-> x+1 ).limit(PlayerCount).map(i -> new Player(i)).toArray(Player[]::new);
fuente
thePlayers[i] = new Player(i);
Acabo de borrar eli
interiorPlayer(i)
; Y funcionó.por lo que la línea de código debería ser:
thePlayers[i] = new Player9();
fuente
public Player(int i)
lo que inicialmente debería tomar una entrada entera.