Java copy multi-d array, random errors
I have been debugging my implementation of Game of Life, and my main
problem looks like its coming from how I use arrays.
public boolean[][] oldState;
public boolean[][] newState;
private boolean gameState = true;
public LifeBoard(Seed seed) {
oldState = seed.getSeed();
newState = new boolean[oldState.length][oldState[0].length];
run();
}
public void run() {
//debug code to run for x generations
for (int i = 0; i < 5; i++) {
BoardPrinter.print(oldState);
evaluateCells();
oldState = newState;
}
BoardPrinter.print(oldState);
System.out.println("game over");
}
the boolean[][] from Seed is a 5x5 grid, all false (dead) except the 3
horizontal middle cells in the middle row
00000
00000
0+++0
00000
00000
evaluateCells() looks at each cell in the grid, looks at the 8 cells
around it, counts them, and based on the number of neighbors it writes a
new value to newState.
What should happen: use oldState to calculate newState, copy newState to
oldState, then go back through newState, writing each cell again based on
the new oldState.
What really happens: the first generation works correctly, but after that
the results are increasingly weird, it evaluates cells to be false that I
know to be true, etc. The problem seems to be in the way I am copying the
arrays.
If I initialize a 3rd blank array blankState[][] = new boolean[5][5]; and
during the loop in run say:
public void run() {
//debug code to run for x generations
for (int i = 0; i < 5; i++) {
BoardPrinter.print(oldState);
evaluateCells();
oldState = newState;
newState = blankState;
}
BoardPrinter.print(oldState);
System.out.println("game over");
}
...then the game works correctly for an additional 1 generation, then the
weird garbage returns.
I have 2 questions: first, it looks like I have to use System.arraycopy(),
but unless someone tells me about a version for multidimensional arrays, I
will have to write a simple loop.
My real question: why do you have to use this special System method to
copy an array? Why can't you use the = operator?
No comments:
Post a Comment