метод подсчета соседей в игре жизни

Я знаю, что было много вопросов по игре в жизнь, но все равно не могу понять, как правильно написать этот метод в javafx. вот мой код, который не работает, потому что я не понимаю, как реализовать алгоритм подсчета соседей.

public void stepMethod(ActionEvent event){
    for (int x = 0; x < cellSize; x++){
        for (int y = 0; y < cellSize; y++){
            int neighbours = countNeighbors(x, y);
            nextGeneration[x][y] = board [x][y];
            nextGeneration[x][y] = (neighbours == 3) ? true: nextGeneration[x][y];
            nextGeneration[x][y] = ((neighbours < 2) || (neighbours > 3)) ? false : nextGeneration[x][y];
        }
    }
    draw();
}

public int countNeighbors(int x, int y){
    int neighbours = 0;
    if (board [x-1][y-1]){
        neighbours+=1;
    }else{
        neighbours+=0;
    }
    if (board[x][y-1]){
        neighbours+=1;
    }else{
        neighbours+=0;
    }
    if (board[x+1][y-1]){
        neighbours+=1;
    }else{
        neighbours+=0;
    }
    if (board[x-1][y]){
        neighbours+=1;
    }else{
        neighbours+=0;
    }
    if (board[x+1][y]){
        neighbours+=1;
    }else{
        neighbours+=0;
    }
    if (board[x-1][y+1]){
        neighbours+=1;
    }else{
        neighbours+=0;
    }
    if (board[x][y+1]){
        neighbours+=1;
    }else{
        neighbours+=0;
    }
    if (board[x+1][y+1]){
        neighbours+=1;
    }else{
        neighbours+=0;
    }
    if(board[x][y]){
        neighbours--;
    }
    return neighbours;
}

и вот мой метод рисования

public void draw(){
    initGraphics();
    for(int x = 0; x < cellSize; x++){
        for(int y = 0; y < cellSize; y++){
            if(board[x][y] ){
                gc.setFill(Color.CHOCOLATE);
                gc.fillOval(x*cellSize,y*cellSize,cellSize,cellSize);
            }
        }
    }

}

person Ira    schedule 23.03.2017    source источник
comment
Я предполагаю, что x-1 или x+1 могут выйти за край (то же самое для y). Что на самом деле идет не так?   -  person doctorlove    schedule 23.03.2017
comment
не работает, когда я нажимаю этот пошаговый метод, и у меня есть ошибки при компиляции, но я не знаю, что именно не так   -  person Ira    schedule 23.03.2017
comment
Тогда поделитесь сообщениями об ошибках компиляции :-)   -  person doctorlove    schedule 23.03.2017
comment
Вызвано: java.lang.ArrayIndexOutOfBoundsException: -1 в sample.Controller.countNeighbors(Controller.java:54) в sample.Controller.stepMethod(Controller.java:118)   -  person Ira    schedule 23.03.2017
comment
Поделившись сообщениями об ошибках, предполагалось, что вы отредактируете свой вопрос и включите все сообщение об ошибке. Вы читали сообщение об ошибке и пытались его понять? (Кстати, это не ошибка компиляции: если бы у вас были ошибки компиляции, вы бы не смогли запустить приложение.)   -  person James_D    schedule 23.03.2017
comment
извините, это мой первый год обучения, и у меня нет никакого опыта в этом   -  person Ira    schedule 23.03.2017
comment
@Ira Ира Вот почему я предоставил вам ссылку, чтобы узнать, как это сделать.   -  person James_D    schedule 23.03.2017
comment
Кстати: часть кода можно сократить: nextGeneration[x][y] = (neighbors == 3); в теле цикла for в stepMethod. Кроме того, все else{ neighbours+=0; } могут быть удалены, эти операторы не имеют никакого эффекта. Также для подсчета значений вы можете просто использовать цикл и снова вычесть значение для центра: int neighbors = (neighbors[x][y] ? -1 : 0); for(int i = -1; i <= 1; i++) { for (int j=-1; j <= 1; j++) { if (board[x+i][y+j]) { neighbors++;}}}   -  person fabian    schedule 23.03.2017
comment
Извините, часть цикла должна быть nextGeneration[x][y] = (neighbors == 3 || ((neighbors == 2) && board[x][y]));   -  person fabian    schedule 23.03.2017


Ответы (2)


Ваша ошибка

 java.lang.ArrayIndexOutOfBoundsException: -1 at
 sample.Controller.countNeighbors(Controller.java:54) at
 sample.Controller.stepMethod(Controller.java:118) 

это ошибка времени выполнения, а не ошибка компиляции. В нем говорится, что ваш индекс (т. е. материал из [x-1] и т. д.) стал OutOfBounds.

Вам нужно добавить еще больше условий в ifs и elses, например

if (board [x-1][y-1]){

будет проблемой x или y равно 0, поэтому

if (x>0 && y>0 && board [x-1][y-1]){

Вам нужно проверить верхнюю границу слишком далеко вниз.

Решите, что делать по краям доски. Обернуть? Сделать это на краю света? Вам решать.

person doctorlove    schedule 23.03.2017

На первой итерации у вас будет x=0 and y=0. Таким образом, оценка board[x-1][y-1] даст вам доску[-1][-1], которая поднимет ArrayOutOfBoundsException.

person Rafael Costa    schedule 23.03.2017