Java中的2D数组无法正确更改

时间:2015-09-11 16:19:26

标签: java arrays

在我正在进行的Game of Life项目中,我有一个2D字节数组。该阵列代表一个游戏板。问题是,当我尝试访问数组时,它返回全零。但是,在我设置单元格的功能中,更改保存得很好。

这是班级:

public class Game {
    int boardW;
    int boardH;
    Board board;
    public Game(int bW) {
        boardW = bW;
        boardH = bW;
        this.board = new Board(boardH, boardW);
    }

    private byte updateCell(int x, int y) {
        byte neighbors = 0;
        // Loop through 8 neighbors and count them
        for (byte offset_y = -1; offset_y < 2; offset_y++) {
            for (byte offset_x = -1; offset_x < 2; offset_x++) {
                // Make sure we don't check our current cell
                if (offset_x != 0 || offset_y != 0) {
                    byte newY = (byte) (y + offset_y);
                    byte newX = (byte) (x + offset_x);
                    // Roll over edge of board
                    if (y + offset_y < 0) {
                        newY = (byte) (boardH - 1);
                    }
                    else if (y + offset_y >= boardH) {
                        newY = 0;
                    }
                    if (x + offset_x < 0) {
                        newX = (byte) (boardW - 1);
                    }
                    if (x + offset_x >= boardW) {
                        newX = 0;
                    }
                    neighbors += this.board.getState(newX, newY);
                }
            }
        }
        if (neighbors < 2) {return 0;}
        if (neighbors > 3) {return 0;}
        if (neighbors == 3) {return 1;}
        return this.board.getState(x, y);
    }

    public Board gameTick() {
        Board nextTick = new Board(boardH, boardW);
        // Go through next iteration of cells
        for (int h = 0; h < boardH; h++) {
            for (int w = 0; w < boardW; w++) {
                nextTick.setState(w, h, updateCell(w, h));
            }
        }
        return nextTick;
    }

    public Board getBoard() {

        return this.board;
    }

    public void toggleCell(int x, int y, byte state) {
        this.board.setState(x, y, state);
    }
}

class Board {
    private final byte[][] board;
    final int height;
    final int width;

    public Board(int h, int w) {
        width = w;
        height = h;
        board = new byte[height][width];
    }

    public void setState(int x, int y, byte state) {
        board[y][x] = state;
    }

    public byte getState(int x, int y) {
        return board[y][x];
    }

    public byte[][] getData() {
        return board;
    }

    public void setData(byte[][] newBoard) {
        for (int x = 0; x<newBoard.length; x++) {
            for (int y = 0; y<newBoard.length; y++) {
                setState(x, y, newBoard[y][x]);
            }
        }
    }
}

这里发生了什么?

编辑:原来这是访问电路板的代码中的另一个问题,我解决了。谢谢你所有的帮助。

4 个答案:

答案 0 :(得分:3)

完全更改代码的设计。有一个包装类Board封装(和隐藏)里面的二维数组(如果它必须是一个数组)。

public class Board {
    private final byte[][] board;

    public Board(int height, int width) {
        board = new byte[height][width];
    }

    public void setState(int x, int y, byte state) {
        board[y][x] = state;
    }

    public byte getState(int x, int y) {
        return board[y][x];
    }
}

然后创建Board类的实例,并仅通过该实例访问该状态。

因此,您可以安全地访问您的数据,并且您的设计将来可以进行修改。你是例如可以自由地开始添加有用的方法,例如

boolean isRowEmpty(int x)
boolean isColumnEmpty(int y)
void resetRow(int x)
void resetColumn(int y)
void reset()

所有这些都将在Board类的实例上很好地调用。您不会直接从业务逻辑代码访问该数组,这是一种令人讨厌的做法。

答案 1 :(得分:0)

这似乎是一个范围问题,因此解决方案是确保在您的所有方法都可以访问的范围内定义board。最简洁的方法是将board定义为类字段(即在任何方法之外定义),然后每次要修改或访问board时,都使用{{1} }}

例如,

this.board

答案 2 :(得分:0)

我建议你把两个不同的班级作为一个主要的 和其他用于调用函数,在此从主类 传递你想要的值,然后调用你想要的方法 一定能解决问题。

答案 3 :(得分:0)

试试这个:

public class YourClassName {
    byte[][] board;

    // Setters
    public void setCell(int x, int y, byte state) {
        System.out.println(board[y][x]);
        board[y][x] = state;
    }

    // Getters
    public byte[][] getBoard() {
        return board;
    }
}