在我正在进行的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]);
}
}
}
}
这里发生了什么?
编辑:原来这是访问电路板的代码中的另一个问题,我解决了。谢谢你所有的帮助。
答案 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;
}
}