Java 为什么setter不能处理特定的选择?
很抱歉,标题措词不当,但我不知道如何正确总结这个问题 我创建了一个棋局保存位置的国际象棋游戏。除了国王之外,这些碎片不知道它们的位置。每当国王移动时,它的位置都会用一个简单的setter更新- Gameflow.javaJava 为什么setter不能处理特定的选择?,java,spring-boot,Java,Spring Boot,很抱歉,标题措词不当,但我不知道如何正确总结这个问题 我创建了一个棋局保存位置的国际象棋游戏。除了国王之外,这些碎片不知道它们的位置。每当国王移动时,它的位置都会用一个简单的setter更新- Gameflow.java public static void movePiece(Player player, int pieceSelection, int action) { int x = pieceSelection / 10; int y = piec
public static void movePiece(Player player, int pieceSelection, int action) {
int x = pieceSelection / 10;
int y = pieceSelection % 10;
Board board = Board.boardConstructor(); //board is a Singleton
Piece piece = Board.squares[x][y].getPiece();
...
if (piece.getType().equals(Type.KING)) {
King king = (King) piece;
king.setXY(endX, endY);
System.out.println("King moved to " + king.getX() + king.getY()); //prints old location
}
public static void movePiece(Player player, int pieceSelection, int action) {
if (piece.getType().equals(Type.KING)) {
King king = player.getKing(); // <-- changed how I select the King
king.setXY(endX, endY);
System.out.println("King moved to " + king.getX() + king.getY()); //prints correctly
}
King.java
public class King extends Piece {
...
public void setXY(int x, int y) {
this.x = x;
this.y = y;
System.out.println("The King's location is now " + this.x + this.y); //prints new location
}
java中setter中的println按预期输出,但King的位置没有在其他地方更新
我被弄糊涂了,为什么更新的位置没有被保存,但我还是能够通过更改一行来解决这个问题-
Gameflow.java
public static void movePiece(Player player, int pieceSelection, int action) {
int x = pieceSelection / 10;
int y = pieceSelection % 10;
Board board = Board.boardConstructor(); //board is a Singleton
Piece piece = Board.squares[x][y].getPiece();
...
if (piece.getType().equals(Type.KING)) {
King king = (King) piece;
king.setXY(endX, endY);
System.out.println("King moved to " + king.getX() + king.getY()); //prints old location
}
public static void movePiece(Player player, int pieceSelection, int action) {
if (piece.getType().equals(Type.KING)) {
King king = player.getKing(); // <-- changed how I select the King
king.setXY(endX, endY);
System.out.println("King moved to " + king.getX() + king.getY()); //prints correctly
}
publicstaticvoidmovepiece(玩家、整块选择、整块动作){
如果(piece.getType().equals(Type.KING)){
King King=player.getKing();//x.getType()==Type.King.findFirst()
.orElse(空);
返回(国王)国王;
}
我的问题已经解决了,但我一点也不聪明。为什么那会修复我的代码?为什么它不能更早地工作
Piece是一个抽象类,team是一组玩家的棋子。如果不看
Board
,很难说,但我看到了一些警告信号:调用Board.boardConstructor()
听起来像是在获得一个新的棋盘,而不是现有的棋盘。您几乎可以肯定正在使用代码中的棋子的不同实例。尝试用以下代码替换您的代码以获得国王:
King king = player.getKing(); // <-- changed how I select the King
System.out.println(Integer.toHexString(System.identityHashCode(piece) + "\t"
+ Integer.toHexString(System.identityHashCode(king)));
King King=player.getKing();//Don Hosek指出问题不在哪里,因此我将他的代码插入我的董事会和每个团队。我希望找到一组32个哈希代码打印两次,但结果是64个不同的哈希代码,即两组唯一值
在进一步使用散列码之后,我发现不是每个团队中的片段都在变异,而是董事会上的片段。在第一步之前,它们只变异了一次,这给了我一个关于问题的强有力的线索
与大多数令人困惑的错误一样,答案非常简单。最初,这是一个Java终端游戏,我转移到了Spring/React,在这样做时,我搞乱了初始化顺序
我不知道为什么在棋盘前创建玩家时没有出现更严重的错误(因为所有的棋子都是由棋盘实例化的,所以团队应该是空数组)。无论如何,问题是通过交换前两行代码来解决的。getType()==Type.KING
vsgetType().equals(Type.KING)
可能您没有正确实现类型的equals()
方法。我猜piece(在GameFlow中)和player.getKing()不是同一个对象…您如何获得该引用?(piece)这取决于类型的类型……嗯,有趣的是,我没有意识到我在玩家类中使用了地址比较器,但我不认为这是问题,因为它正确地进入了Gameflow中的if块。玩家如何收集他们的碎片?啊,我应该说Board是一个单音是的,它们是不同的。谢谢