0

В настоящее время работает над проектом класса, пытающимся воссоздать игру жизни Конвея. Вот копия моего кода, моя основная проблема связана с моим методом 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(); 
    } 
} 
} 
+1

Глядя на 'if (row - 1> = 0 || col - 1> = 0)', что, если 'row'' 1', а 'col' -' 0'? Вы действительно хотите выполнить 'if (grid [row - 1] [col - 1] == false)'? – jas

ответ

0

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

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

Смежные вопросы