我一直在尝试用 Java 创建一个 tic-tac-toe 游戏,以帮助我改进从头开始创建面向对象项目的能力。但我遇到了问题,正在寻求一些指导。
目前该项目只完成了一半,因此我将向您快速介绍一下我迄今为止所做的工作。
该项目当前有一个 Game 类作为驱动程序。它有一个 Board 类,用于存储棋盘上的位置(A1、A2、A3...)及其值(“X”、“O”、null)之间的映射。还有一个 Player 类,它保存玩家所在团队的字段(Xs 或 Os)和获胜次数(获胜功能尚未实现)。
我遇到的问题是从 Game 创建 Player 类的两个实例(player1 和player2)。
我将它们定义为游戏中的字段,如下所示:
public static Player player1 = new Player();
public static Player player2 = new Player();
然后要求玩家 1 在 Xs 和 Os 之间进行选择,而玩家 2 则给出相反的选择。
player1.setTeam(Character.toUpperCase(teamChoice));
if(player1.getTeam() == 'X')
player2.setTeam('O');
else
player2.setTeam('X');
在我看来这应该可行。但是,当我打印出玩家选择时,它会打印出player2 的设置。
System.out.println("Player 1 you have selected " + player1.getTeam() + "\n");
System.out.println("Player 2 you will be " + player2.getTeam() + "\n");
Player类的内容如下所示:
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;
}
}
最佳答案
问题出在这里:
public static Character team;
team
是静态的,这意味着变量 team
不属于任何给定实例。它属于该类。
事实上,每当您调用 player1.setTeam
或 player2.setTeam
时,都会更改类范围的 team
变量,而不是特定于 player1
或 player2
的内容。
您需要使团队
特定于实例。所需要做的就是删除 static
关键字。
private char team;
您还会注意到我将其设置为私有(private)
,因为这是推荐的做法(您已经为其定义了 getter 和 setter,因此不需要公开)。
另一个变化是从 Character
到 char
。您在代码中的某处使用 ==
进行比较 (if(player1.getTeam() == 'X')
),使用引用类型可能会导致意外的结果结果,这里使用原始类型是您需要进行的最简单的更改。
你的类最终会看起来像
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;
}
}
关于java - 尝试创建相同对象类型的两个实例,但最终得到两个引用同一对象的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61003665/