Game Of Life Java — подсчет соседей с помощью двумерных массивов и циклов for

В настоящее время я работаю над программой Conway's Game of life в Eclipse с @Test case. Все мои методы проходят проверку, кроме метода NeighborCount. Я видел сообщения об этом методе, работающем с циклами for, и по какой-то причине он не работает в моем коде.

Я пытаюсь обернуть 2D-массив, находя соседние ячейки только с циклами for. У меня также возникают проблемы с обновлением нового общества после подсчета соседей. Если бы кто-нибудь мог взглянуть на мой код и найти ошибку в моих методах, это было бы очень признательно. Заранее спасибо. Я приложил весь свой код на случай, если у меня возникнет ошибка в другом методе, влияющем на NeighborCount().

    public class GameOfLife {

    private int theRows;
    private int theCols;
    private char[][] society;


    public GameOfLife(int rows, int cols) {
        // Complete this method.
        society = new char[rows][cols];
        for (int r = 0; r < rows; r++) {
            for (int c = 0; c < cols; c++) {
                society[r][c] = ' ';
            }
        }
        theRows = rows;
        theCols = cols;
    }

    public int numberOfRows() {

        return theRows;
    }


    public int numberOfColumns() {

        return theCols;
    }

    public void growCellAt(int row, int col) {
        // Complete this method
        for (int r = 0; r < society.length; r++) {
            for (int c = 0; c < society[r].length; c++) {
                society[r][c] = 'o';
            }
        }

    }

    public boolean cellAt(int row, int col) {
                if (society[row][col] == 'o') {
                    return true;
                } else { 
                    return false;
                }

        }

    @Override
    public String toString() {
        String res = "";
        for (int r = 0; r < society.length; r++) {
            for (int c = 0; c < society[r].length; c++) 
                res = res + society[r][c];

        }
        return res;
    }

    public int neighborCount(int row, int col) {

        int count = 0;
        for(int i = row - 1; i <= row + 1; i++) {
            if (i >= 0 && i >= society.length)
                for(int j = col - 1; j <= col + 1; j++) 
                    if (j >= 0 && j >= society[i].length) 
                        if (i != row || j != col) 
                            if (society[i][j] == 'o') 
                                count++;
        }

        return count;
    }

    public void update() {
        // Complete this method
        char[][] newSociety = new char[society.length][society[0].length];

        for (int r = 0; r < society.length; r++) {
            for (int c = 0; c < society[r].length; c++) 
                newSociety[r][c] = society[r][c];
        }
    }
}

person user4590197    schedule 19.06.2015    source источник
comment
Примечание по коду: метод toString() слишком медленный, потому что он увеличивает строку символ за символом, перераспределяя строку с каждым символом. Рассмотрите возможность использования StringBuilder.   -  person Serge Rogatch    schedule 19.06.2015
comment
О, ладно, это имеет смысл! Спасибо, что добавили, что @SergeRogatch   -  person user4590197    schedule 19.06.2015


Ответы (1)


Похоже, у вас есть >= вместо ‹ в двух местах:

public int neighborCount(int row, int col) {

    int count = 0;
    for(int i = row - 1; i <= row + 1; i++) {
        if (i >= 0 && i < society.length) // fixed here
            for(int j = col - 1; j <= col + 1; j++) 
                if (j >= 0 && j < society[i].length) // fixed here
                    if (i != row || j != col) 
                        if (society[i][j] == 'o') 
                            count++;
    }

    return count;
}

Если вы собираетесь получить доступ к society[i][j], убедитесь, что 0 <= i < society.length и 0 <= j < society[i].length.

person Eran    schedule 19.06.2015
comment
Спасибо за ответ и помощь ... Но хорошо, я только что изменил это в своей программе, но по какой-то причине она говорит, что насчитала 8 всего, когда ожидается, что будет подсчитано только 0. Я думаю, что у меня есть ошибка где-то еще в моей программе, которая влияет на метод NeighborCount. - person user4590197; 19.06.2015
comment
@ user4590197 Возможно, вы неправильно обновляете массив society. Если вы получили 8, это означает, что все соседи society[row][col] содержат 'o'. - person Eran; 19.06.2015
comment
МОЙ БОГ! Вы абсолютно правы! Я использовал циклы без всякой причины в своем методе GrowCellAt. Большое спасибо! Самая простая ошибка вызвала у меня столько времени, лол. Благодарю вас! - person user4590197; 19.06.2015