很抱歉,标题措辞不好,但我不知道如何正确地总结这个问题。
我设计了一个棋盘位置的象棋游戏,棋子不知道自己的位置,只有国王例外,只要国王移动,他的位置就会被一个简单的设定器更新--
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
}
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
}
www.example.com中setter内的printlnKing.java按预期输出,但国王的位置未在其他位置更新
我被迷惑了,为什么更新的位置没有被保存,但我仍然能够通过更改一行来修复这个问题-
Gameflow.java
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
}
这是我的代码,它复制棋子,并通过播放器抓取国王
Player.java
private Player(String name, boolean isWhite) {
this.name = name;
this.isWhite = isWhite;
if (isWhite) {
team = createPieces(6);
} else {
team = createPieces(0);
}
}
public static Piece[] createPieces(int start) {
Piece[] team = new Piece[16];
int count = 0;
int end = start + 2;
for (int i = start; i < end; i++) {
for (int j = 0; j < 8; j++) {
team[count] = Board.squares[i][j].getPiece();
count++;
}
}
return team;
}
public King getKing() {
Piece theKing = Arrays.stream(team).filter(x -> x.getType() == Type.KING).findFirst()
.orElse(null);
return (King) theKing;
}
我的问题被修复了,但我还是不知道。为什么那修复了我的代码?为什么它之前不工作?
Piece是一个抽象类,team是玩家棋子的数组。
2条答案
按热度按时间x8diyxa71#
不看
Board
很难说,但我看到了一些警告信号:对Board.boardConstructor()
的调用听起来像是得到了一个新的板卡,而不是现有的板卡。几乎可以肯定,您在代码中使用的是piece
的另一个示例。请尝试用以下代码替换您的代码以得到king:如果打印的两个哈希代码不同,则表明它们是该片段的不同示例,并且是其他地方的逻辑造成的。
gudnpqoy2#
Don Hosek指出了我的问题来自哪里,但我仍需要进一步调查以确定原因,因此我将他的代码插入到我的董事会和每个团队中。我本以为会发现一组32个哈希代码被打印两次,但结果却是64个不同的哈希代码,也就是2组唯一的值。
在进一步使用散列码之后,我发现是棋盘上的棋子发生了变异,它们只在第一步棋之前发生了一次变化,这给了我一个关于问题的有力线索。
就像最令人困惑的错误一样,答案非常简单。最初这是一个Java终端游戏,我将其移到了Spring/React,在这样做的同时,我将创建新游戏所涉及的两行代码(初始化Board和Players)进行了调换。解决方案只是将它们交换回来。
我不知道为什么在棋盘之前创建玩家时,当所有棋子都由棋盘示例化时,我没有得到一个更严重的错误,我非常非常惊讶这个小问题是如此严重的错误的唯一明显影响。