Игра жизни Конвея вне границ при подсчете соседей - java

1

Я пытаюсь создать игру жизни в java, но мне сложно написать часть, которая проверяет количество соседей. Я понимаю, что проблема в том, что программа попадает на края сетки, она не будет работать, потому что индексы больше/меньше границ массива. Так что проблема в моих соседей(). Я не уверен, как это исправить, я попытался расширить операторы if, а также попытался поместить весь набор операторов в цикл while. Программа, похоже, работает, если на краях сетки нет живых ячеек. Любые предложения по этому поводу? Заранее спасибо.

import java.io.*;
import java.util.Scanner;

public class LifeGrid
{
  public int[][] grid;
  public int[][] newgrid;
  public int getX() 
  {
    return grid[0].length;
  }
  public int getY() 
  {
    return grid.length;
  }

  public int getcurrentgen()
  {
    return currentgen;
  }

  public int currentgen=0;


  // modify neighbours out of boundary problem.
  int Neighbours(int x, int y)
  {
    int neighbours = 0;

      if (grid[y][x-1] == 1)
      { neighbours++; }
      if (grid[y][x+1] ==1)
      { neighbours++; }
      if (grid[y+1][x-1] ==1)
      { neighbours++; }
      if (grid[y+1][x+1] ==1)
      { neighbours++; }
      if (grid[y+1][x] ==1)
      { neighbours++; }
      if (grid[y-1][x-1] ==1)
      { neighbours++; }
      if (grid[y-1][x+1] ==1)
      { neighbours++; }
      if (grid[y-1][x] ==1)
      { neighbours++; }


    return neighbours;
  }

  public LifeGrid(int x, int y, String filename)
  {
    grid = new int [y][x];
    newgrid = new int[y][x];
    File input = new File(filename);
    Scanner sc;
    try
    {
      sc = new Scanner(input);
    }
    catch (FileNotFoundException e)
    { 
      System.out.println("File error");
      return;
    }
    for ( y=0; y< getY(); y++)
    {
      String line = sc.nextLine();

      for( x = 0; x < getX(); x++)
      {
    if (line.charAt(x) == '*')
    {
      grid[y][x] = 1;
    }
    else 
    {
      grid[y][x] = 0;
    }
      }
    }
   }

   public void run()
   {
    show();
    while(getcurrentgen() < 3)
    {

      setup();
      grid = newgrid;
      currentgen++;
      show();
    }
   }

   public void setup()
   {
    for (int y = 0; y < getY(); y++)
    {
    for (int x = 0;x < getX();x++)
    {

      if (grid[y][x]== 1)
      {
    if (Neighbours(x,y) < 2)
    {
      newgrid[y][x] = 0;
    }
    if (Neighbours(x,y) > 3)
    {
      newgrid[y][x] = 0;
    }
    if (Neighbours(x,y) == 3 || Neighbours(x,y) == 2)
    {
      newgrid[y][x] = 1;
    }
      }
      if(grid[y][x]==0)
      {
        if(Neighbours(x,y) == 3)
       {
        newgrid[y][x]= 1;
       }

      }


    }

   }
   }

   public void show()
   {
    for(int y =0; y < getY(); y++)
    {
      for(int x = 0; x < getX(); x++)
      {
    System.out.print(grid[y][x]);
      }
      System.out.println();
    }
    System.out.println("Current generation: "+getcurrentgen());
   }


}
Теги:

3 ответа

1
Лучший ответ

int Neighbours(int x, int y) вызывается с x = 0 и y = 0, правильно?

Как вы оцениваете grid[y-1][x-1]?

  • 0
    Спасибо, я получил эту часть на работу. Теперь я получаю странные результаты. Правило "родить" не всегда работает так, как ожидалось. Не могли бы вы также дать мне подсказку?
  • 0
    @Croatoan Я предполагаю, что проблема родов связана с newgrid и grid, указывающими на один и тот же массив в памяти. Необходимо скопировать данные в сетке в новый массив в newgrid для каждого поколения.
1

Где у вас есть

if (grid[y][x-1] == 1)

Вам просто нужно пропустить, если это выйдет за рамки:

if (x > 0 && grid[y][x-1] == 1)

И аналогично для всех остальных.

  • 0
    Я пробовал это раньше, не сработало. Сейчас попробовал еще раз и все заработало ... Спасибо
1

вам нужно добавить чеки для всех своих очков, чтобы убедиться, что они не находятся на границе. Это означает проверку координат x и y:

    if (x > 0 && grid[y][x - 1] == 1) {
        neighbours++;
    }
    if (x < grid[y].length - 1  && grid[y][x + 1] == 1) {
        neighbours++;
    }
    if (x > 0 && y < grid.length - 1 && grid[y + 1][x - 1] == 1) {
        neighbours++;
    }
    if (x < grid[y].length - 1 && y < grid.length - 1 && grid[y + 1][x + 1] == 1) {
        neighbours++;
    }
    if (y < grid.length - 1 && grid[y + 1][x] == 1) {
        neighbours++;
    }
    if (x > 0 && y > 0 && grid[y - 1][x - 1] == 1) {
        neighbours++;
    }
    if (y > 0 && x < grid[y].length - 1 && grid[y - 1][x + 1] == 1) {
        neighbours++;
    }
    if (y > 0 && grid[y - 1][x] == 1) {
        neighbours++;
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню