He estado tratando de crear un juego de tres en raya en Java para ayudar a mejorar a la creación de proyectos orientados a objetos a partir de cero. Pero tengo encontramos con un problema y estoy buscando alguna orientación.
Estoy a mitad de camino a través del proyecto en el momento, así que sólo voy a dar una rápida actualización de lo que he hecho hasta ahora.
El proyecto cuenta actualmente con una clase de juegos como el conductor. Tiene una clase Junta que almacena un mapa entre las ubicaciones en el tablero (A1, A2, A3 ...) y sus valores ( 'X', 'S', null). Y una clase de jugador que tiene campos para el equipo del jugador está en (X o S) y el número de victorias (funcionalidad para ganar no se ha aplicado todavía).
El problema que estoy teniendo es con la creación de dos instancias de la clase Player (player1 y Player2) de juego.
Yo los he definido como campos en juego, así:
public static Player player1 = new Player();
public static Player player2 = new Player();
Entonces se le pide jugador1 que elegir entre Xs y Os y jugador2 se da lo contrario.
player1.setTeam(Character.toUpperCase(teamChoice));
if(player1.getTeam() == 'X')
player2.setTeam('O');
else
player2.setTeam('X');
En mi cabeza esto debería funcionar. Sin embargo, al imprimir a cabo las elecciones del jugador imprime lo jugador2 se ha establecido para ser.
System.out.println("Player 1 you have selected " + player1.getTeam() + "\n");
System.out.println("Player 2 you will be " + player2.getTeam() + "\n");
El contenido de la clase Player se ven a continuación:
public class Player {
public static int wins = 0;
public static Character team;
public Player(){
}
public int getWins(){return wins;}
public Character getTeam(){return team;}
public void setTeam(Character team){
Player.team = team;
}
}
El problema está aquí:
public static Character team;
team
es estática, y eso significa que la variable team
no es de un caso dado. Pertenece a la clase.
Como están las cosas, cada vez que llame player1.setTeam
o player2.setTeam
, es el de toda la clase de team
la variable que se está cambiando, no es algo específico de player1
o para player2
.
Es necesario hacer team
instancia específica. Sólo se necesita para eliminar la static
palabra clave.
private char team;
También se dará cuenta de que lo hice private
, ya que es la práctica recomendada (ya has definido un getter y setter para ello, por lo que no tiene que ser público).
El otro cambio no es de Character
a char
. Estás haciendo comparaciones utilizando ==
algún lugar de su código ( if(player1.getTeam() == 'X')
), utilizando un tipo de referencia puede conducir a resultados inesperados, utilizando el tipo primitivo aquí es el cambio más simple que necesita para hacer.
Su clase terminará pareciéndose
public class Player {
private int wins = 0;
private char team;
public Player() {
}
public int getWins() {
return wins;
}
public char getTeam() {
return team;
}
public void setTeam(char team) {
this.team = team;
}
}