Spring Boot 为什么setter不能处理特定的选择?

eblbsuwk  于 2022-12-04  发布在  Spring
关注(0)|答案(2)|浏览(114)

很抱歉,标题措辞不好,但我不知道如何正确地总结这个问题。
我设计了一个棋盘位置的象棋游戏,棋子不知道自己的位置,只有国王例外,只要国王移动,他的位置就会被一个简单的设定器更新--
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是玩家棋子的数组。

x8diyxa7

x8diyxa71#

不看Board很难说,但我看到了一些警告信号:对Board.boardConstructor()的调用听起来像是得到了一个新的板卡,而不是现有的板卡。几乎可以肯定,您在代码中使用的是piece的另一个示例。请尝试用以下代码替换您的代码以得到king:

King king = player.getKing(); // <-- changed how I select the King
System.out.println(Integer.toHexString(System.identityHashCode(piece) + "\t" 
    + Integer.toHexString(System.identityHashCode(king)));

如果打印的两个哈希代码不同,则表明它们是该片段的不同示例,并且是其他地方的逻辑造成的。

gudnpqoy

gudnpqoy2#

Don Hosek指出了我的问题来自哪里,但我仍需要进一步调查以确定原因,因此我将他的代码插入到我的董事会和每个团队中。我本以为会发现一组32个哈希代码被打印两次,但结果却是64个不同的哈希代码,也就是2组唯一的值。
在进一步使用散列码之后,我发现是棋盘上的棋子发生了变异,它们只在第一步棋之前发生了一次变化,这给了我一个关于问题的有力线索。
就像最令人困惑的错误一样,答案非常简单。最初这是一个Java终端游戏,我将其移到了Spring/React,在这样做的同时,我将创建新游戏所涉及的两行代码(初始化Board和Players)进行了调换。解决方案只是将它们交换回来。
我不知道为什么在棋盘之前创建玩家时,当所有棋子都由棋盘示例化时,我没有得到一个更严重的错误,我非常非常惊讶这个小问题是如此严重的错误的唯一明显影响。

相关问题