Я действительно не знаю, что вызывает эту проблему, но моя программа, которая должна быть «Игрой жизни» Конвея, вылетает через 2 поколения, по-видимому, независимо от того, что я делаю, и я несколько дней пыталась найтиошибка.
Я сузил причину до нескольких возможных областей - или, по крайней мере, думаю, что у меня есть.
short numNeighbors(int x, int y) {
short numNeighbors;
numNeighbors = 0;
if(x > 0 && y > 0 && matrix[x][y] != null){
if (matrix[x+1][y] == true) numNeighbors++;
if (matrix[x][y+1] == true) numNeighbors++;
if (matrix[x+1][y+1] == true) numNeighbors++;
if (matrix[x][y-1] == true) numNeighbors++;
if (matrix[x-1][y] == true) numNeighbors++;
if (matrix[x+1][y-1] == true) numNeighbors++;
if (matrix[x-1][y+1] == true) numNeighbors++;
if (matrix[x-1][y-1] == true) numNeighbors++;
}
return numNeighbors;
}
//returns the number of neighbours that a coordinate has
Я предполагаю, что этот раздел выше проверяет внеграниц моего 2D-массива, но это не должно быть возможным, потому что я принял меры предосторожности, чтобы этого не произошло.Тем не менее, это одна из возможных причин.
void nextGen(){
Boolean[][] newMatrix = new Boolean[rows()][cols()];
for (int i = 1; i < cols()-1; i++){
for (int j = 1; j < rows()-1; j++){
//avoiding null pointer errors
if (matrix[j][i] == null) matrix[j][i] = false;
//if a cell has 3 neighbours, become or stay true
if (numNeighbors(j, i) == 3) newMatrix[j][i] = true;
//if it doesn't have 3 neighbours, become or stay false
else newMatrix[j][i] = false;
}
}
matrix = newMatrix;
}
//makes matrix represent the next generation
Это мое следующее предположение о причине ошибки, но я не могу точно сказать, что будет неправильно.
for (int j = 0; j < numGenerations; j++){
JOptionPane.showMessageDialog(null,"generation " + (j+1) + ":\n\n" + myGrid.showGrid());
myGrid.nextGen();
}
Я пишу только выше, потому что он вызывает блок над ним, и я не хочу ничего исключать.
Я не знаю, в чем еще проблема, но простона тот случай, если кто-то захочет посмотреть полный исходный код моего проекта, я разместил его на pastebin .