Что делать, если игра «Жизнь Конвея» выходит за пределы допустимого?

В настоящее время работает над классным проектом, пытаясь воссоздать игру Конвея «Жизнь». Вот копия моего кода, моя основная проблема связана с моим методом runRound(). Я должен пройти и проверить, сколько соседей есть у каждой ячейки, которые живы (правда) или мертвы (ложь), и соответствующим образом отредактировать мою новую сетку. Однако я продолжаю выходить за рамки, пытаясь проверить края моей сетки, и пытался реализовать код, чтобы избежать этого, но я должен что-то упустить. Спасибо за любой совет! еще новичок в этом!

package Programs;

public class GameOfLife {
private boolean[][] grid;
private int time;

public GameOfLife() {
    grid = new boolean[10][10];
    time = 0;
}

public GameOfLife(int row, int col) {
    if (row < 1) {
        row = 10;
    }
    if (col < 1) {
        col = 10;
    }
    grid = new boolean[row][col];
    time = 0;
}

public boolean[][] getGrid() {
    boolean[][] newGrid = new boolean[grid.length][grid[1].length];
    for (int i = 0; i < grid.length; i++) {
        for (int j = 0; j < grid[i].length; j++) {
            newGrid[i][j] = grid[i][j];
        }
    }
    return newGrid;
}

public int getTime() {
    return time;
}

public void simpleSetUp(int[][] array) {
    if (getTime() == 0) {
        for (int row = 0; row < array.length; row++) {
            if (array[0].length == 2) {
                if (array[row][0] >= 0 && array[row][1] >= 0 && array[row][0] <= grid[0].length
                        && array[row][1] <= grid[0].length) {

                    grid[array[row][0]][array[row][1]] = true;
                }
            }
        }
    }

}

public void clearGrid() {
    this.time = 0;
    for (int row = 0; row < grid.length; row++) {
        for (int col = 0; row < grid[col].length; col++) {
            grid[row][col] = false;
        }
    }

}

public void runRound() {
    time++;
    int live;
    boolean[][] newGrid = getGrid();

    for (int row = 0; row < grid.length; row++) {
        for (int col = 0; col < grid[col].length; col++) {
            live = 0;
            if (row - 1 >= 0 || col - 1 >= 0) {
                if(grid[row - 1][col - 1] == true){
                    live++;
                }
            }
            if (row + 1 < grid.length || col + 1 < grid[col].length) {
                if(grid[row + 1][col + 1] == true){
                    live++;
                }
            }
            if (row - 1 >= 0 || col + 1 < grid[col].length) {
                if(grid[row - 1][col + 1] == true ){
                    live++;
                }
            }
            if (row + 1 < grid.length || col - 1 >= 0) {
                if(grid[row + 1][col - 1] == true){
                    live++;
                }
            }
            if (row + 1 < grid.length) {
                if(grid[row + 1][col] == true){
                    live++;
                }
            }
            if (row - 1 >= 0) {
                if(grid[row - 1][col] == true){
                    live++;
                }
            }
            if (col + 1 < grid[col].length) {
                if(grid[row][col + 1] == true){
                    live++;
                }
            }
            if (col - 1 >= 0) {
                if(grid[row][col - 1] == true){
                    live++;
                }
            }

            if (grid[row][col] == true && live == 2 || live == 3) {
                newGrid[row][col] = true;
            } else {
                newGrid[row][col] = false;
            }

        }
    }
    for (int row = 0; row < grid.length; row++) {
        for (int col = 0; col < grid[col].length; col++) {
            live = 0;
            if (row - 1 >= 0 || col - 1 >= 0) {
                if(grid[row - 1][col - 1] == false){
                live++;
                }
            }

            if (row + 1 < grid.length || col + 1 < grid[col].length) {
                if(grid[row + 1][col + 1] == false){
                live++;
                }
            }
            if (row - 1 >= 0 || col + 1 < grid[col].length) {
                if(grid[row - 1][col + 1] == false){
                live++;
                }
            }
            if (row + 1 < grid.length || col - 1 >= 0) {
                if(grid[row + 1][col - 1] == false ){
                    live++;
                }
            }
            if (row + 1 < grid.length) {
                if(grid[row + 1][col] == false ){
                    live++;
                }
            }
            if (row - 1 >= 0) {
                if(grid[row - 1][col] == false){
                    live++;
                }
            }
            if (col + 1 < grid[col].length) {
                if(grid[row][col + 1] == false){
                    live++;
                }
            }
            if (col - 1 >= 0) {
                if(grid[row][col - 1] == false){
                    live++;
                }
            }
            if (live == 3) {
                newGrid[row][col] = true;
            } else {
                newGrid[row][col] = false;
            }

        }

    }

}

public void runGame(int foo) {
    for (int poo = 0; poo < foo; poo++) {
        runRound();
    }
}
}

person hgeorge    schedule 06.02.2016    source источник
comment
Глядя на if (row - 1 >= 0 || col - 1 >= 0), что если row это 1, а col это 0? Вы действительно хотите выполнить if(grid[row - 1][col - 1] == false) ?   -  person jas    schedule 06.02.2016


Ответы (1)


Основная проблема, с которой вы столкнулись, заключается в том, что ваши проверки границ выполняются по логике «ИЛИ»: вы продолжаете вычисления, если либо строка или столбец находится в границы. Вы должны иметь их оба в границах; используйте и.

Если вы устали от этого, вы можете получить аналогичный эффект, заполнив всю сетку значениями false, по одному слою с каждой стороны. Ваши фактические ячейки находятся в диапазоне от 1 до grid.length+1; row/col 0 и grid.length+2 имеют значение false.

person Prune    schedule 08.04.2016