首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java - 2D数组操作正在影响索引的反向操作。

Java - 2D数组操作正在影响索引的反向操作。
EN

Stack Overflow用户
提问于 2018-05-27 18:14:07
回答 2查看 91关注 0票数 1

我试图通过应用我的知识和制作一个Java象棋游戏来学习Java。就目前而言,这是严格意义上的文字。在我的程序中,我有一个函数,允许我移动一块。所有的片段都存储在一个名为board的2D数组中。然而,问题在于,当我试图移动一块的时候,这个功能。如果出于某种原因,我将一块("Rook")从board[7][0]移动到board[6][0],与之相反的是(board[0][0]board[1][0])也会被移动。

这是没有任何修改的板,用displayBoard()显示:

代码语言:javascript
复制
ROOK, KNIGHT, BISHOP, QUEEN, KING, BISHOP, KNIGHT, ROOK, 
PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, 
null, null, null, null, null, null, null, null, 
null, null, null, null, null, null, null, null, 
null, null, null, null, null, null, null, null, 
null, null, null, null, null, null, null, null, 
PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, 
ROOK, KNIGHT, BISHOP, QUEEN, KING, BISHOP, KNIGHT, ROOK,

一块又一块地被移动:

代码语言:javascript
复制
null, KNIGHT, BISHOP, QUEEN, KING, BISHOP, KNIGHT, ROOK, 
ROOK, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, 
null, null, null, null, null, null, null, null, 
null, null, null, null, null, null, null, null, 
null, null, null, null, null, null, null, null, 
null, null, null, null, null, null, null, null, 
ROOK, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, 
null, KNIGHT, BISHOP, QUEEN, KING, BISHOP, KNIGHT, ROOK, 

只有左下角的车才应该被移走。

Board.Java类:

代码语言:javascript
复制
public class Board {
    public Pieces[][] board = new Pieces[8][8];

    private Pieces[] MainLine = new Pieces[]{Pieces.ROOK, Pieces.KNIGHT, Pieces.BISHOP, Pieces.QUEEN, Pieces.KING, Pieces.BISHOP, Pieces.KNIGHT, Pieces.ROOK};
    private Pieces[] BishopLine = new Pieces[]{Pieces.PAWN, Pieces.PAWN, Pieces.PAWN, Pieces.PAWN, Pieces.PAWN, Pieces.PAWN, Pieces.PAWN, Pieces.PAWN};

    public Board(){
        resetBoard();
    }

    private void resetBoard() {
        board = new Pieces[8][8];
        board[0] = MainLine;
        board[board.length - 1] = MainLine;
        board[1] = BishopLine;
        board[board.length - 2] = BishopLine;
    }

    public void displayBoard() {
        for(int rank = 0; rank < board.length; rank++) {
            System.out.println("");
            for(int file = 0; file < board.length; file ++) {
                System.out.print(board[rank][file] + ", ");
            }
        }
        for(int x = 0; x < 3; x++) {
            System.out.println("");
        }
    }

    public Pieces getPiece(int rank, int file) {
        return board[rank][file];
    }

    public void movePiece(int rank, int file, int newRank, int newFile) {
        Pieces temp = getPiece(rank, file);
        board[rank][file] = null;
        board[newRank][newFile] = temp;
    }
}

在我的主要类中,我创建了一个新的板实例,显示它,移动一个块movePiece(7, 0, 6, 0),然后再次显示该面板。我相信主要的问题是在Board.java类,我不知道什么是错误或为什么其他索引受到影响。有人能向我解释为什么会发生这种情况,或者如何更好地操作2D board数组,以进一步完成我的目标,即在不影响任何其他部分的情况下将一块移动到给定的位置。

编辑:添加额外的代码请求-

Main.Java创建了一个游戏实例,将来还会出现其他条件,但是Game.java保存了对Board.Java的直接引用,因为它继承了Board.Java:

代码语言:javascript
复制
public class Main {
    public static void main(String[] args) {
        Game game = new Game();

        game.displayBoard();
        game.movePiece(7, 0, 6, 0);
        game.displayBoard();

    }
}

Game.java只是简单的调用超级,这创造了董事会。它稍后将拥有额外的功能:

代码语言:javascript
复制
public class Game extends Board {
    public Game() {
        super();
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-27 18:35:44

问题在于Board的构造函数(更确切地说是resetBoard()方法),您正在将第一行初始化为与最后一行相同的数组,同样,第二行引用的数组与第二行到最后一行相同:

代码语言:javascript
复制
private void resetBoard() {
    board = new Pieces[8][8];

    // board[0] is a reference to MainLine so if we change move
    // into or out of board[0] MainLine will be affected and 
    // we won't be able to start with a fresh board by calling boardReset()
    // board[0] = MainLine;

    // Initialize the first row to a fresh array every time we call
    // reset.
    board[0] = new Pieces[] { 
        Pieces.ROOK, Pieces.KNIGHT, Pieces.BISHOP, Pieces.QUEEN, 
        Pieces.KING, Pieces.BISHOP, Pieces.KNIGHT, Pieces.ROOK
    };

    // This makes the last line and
    // the first line point to the same array
    // You need to create a new array that is a deep copy
    // of the array.
    // board[board.length - 1] = MainLine; 

    // Create new array by copying the original array
    board[board.length - 1] = Arrays.copyOf(board[0], board[0].length);

    // Similarly
    //board[1] = BishopLine;
    Arrays.fill(board[1], Pieces.PAWN);
    board[board.length - 2] = Arrays.copyOf(board[1], board[1].length);

    // You don't need member variables MainLine and BishopLine
    // and you can remove them if you want.
}

现在,两行都指向不同的数组。当您调用movePiece(7, 0, 6, 0)时,您应该看到

代码语言:javascript
复制
ROOK, KNIGHT, BISHOP, QUEEN, KING, BISHOP, KNIGHT, ROOK, 
PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, 
null, null, null, null, null, null, null, null, 
null, null, null, null, null, null, null, null, 
null, null, null, null, null, null, null, null, 
null, null, null, null, null, null, null, null, 
PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, 
ROOK, KNIGHT, BISHOP, QUEEN, KING, BISHOP, KNIGHT, ROOK, 



ROOK, KNIGHT, BISHOP, QUEEN, KING, BISHOP, KNIGHT, ROOK, 
PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, 
null, null, null, null, null, null, null, null, 
null, null, null, null, null, null, null, null, 
null, null, null, null, null, null, null, null, 
null, null, null, null, null, null, null, null, 
ROOK, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, 
null, KNIGHT, BISHOP, QUEEN, KING, BISHOP, KNIGHT, ROOK, 
票数 1
EN

Stack Overflow用户

发布于 2018-05-27 18:36:11

问题在于resetBoard()函数。在这里,您将对两个棋手使用相同的对象引用。因此,由于java是通过值传递的,所以board7和board都是指同一个对象,当其中一个更改时,另一个也是。

为了简单起见,您可以尝试如下所示

或者在pieces类中创建一个复制构造函数并从resetBoard方法调用。

或者重写point类中的克隆()方法,以执行对象的深度复制,这样两个引用就不会指向一个公共对象。

或者使用Arrays.copyOf(arrayToCopy,length)创建一个新副本。

代码语言:javascript
复制
 private void resetBoard() {
    board = new Pieces[8][8];
    board[0] = new Pieces[]{Pieces.ROOK, Pieces.KNIGHT, Pieces.BISHOP, Pieces.QUEEN, Pieces.KING, Pieces.BISHOP, Pieces.KNIGHT, Pieces.ROOK};
    board[board.length - 1] = new Pieces[]{Pieces.ROOK, Pieces.KNIGHT, Pieces.BISHOP, Pieces.QUEEN, Pieces.KING, Pieces.BISHOP, Pieces.KNIGHT, Pieces.ROOK};
    board[1] = new Pieces[]{Pieces.PAWN, Pieces.PAWN, Pieces.PAWN, Pieces.PAWN, Pieces.PAWN, Pieces.PAWN, Pieces.PAWN, Pieces.PAWN};;
    board[board.length - 2] = new Pieces[]{Pieces.PAWN, Pieces.PAWN, Pieces.PAWN, Pieces.PAWN, Pieces.PAWN, Pieces.PAWN, Pieces.PAWN, Pieces.PAWN};;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50555124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档