康威';s计算邻居时,生活的游戏超出了边界-java

康威';s计算邻居时,生活的游戏超出了边界-java,java,Java,我试图用java创建生活游戏,但我很难编写检查邻居数量的部分。我知道问题是,当程序到达网格边缘时,它将无法工作,因为索引大于/小于数组的边界。所以问题出在我的邻居身上。我不确定如何修复它,我尝试扩展if语句,并且我还尝试将整个语句集放在while循环中。除非网格边缘有活细胞,否则该程序似乎正在运行。有什么建议吗?提前谢谢 import java.io.*; import java.util.Scanner; public class LifeGrid { public int[][] gr

我试图用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());
   }


}
import java.io.*;
导入java.util.Scanner;
公共类生命网格
{
公共int[][]网格;
公共int[][]新网格;
公共int getX()
{
返回网格[0]。长度;
}
公共int getY()
{
返回网格长度;
}
public int getcurrentgen()
{
返回电流发生器;
}
公共int currentgen=0;
//修正邻域边界外问题。
整数邻域(整数x,整数y)
{
int=0;
如果(网格[y][x-1]==1)
{neights++;}
如果(网格[y][x+1]==1)
{neights++;}
如果(网格[y+1][x-1]==1)
{neights++;}
如果(栅格[y+1][x+1]==1)
{neights++;}
如果(网格[y+1][x]==1)
{neights++;}
if(网格[y-1][x-1]==1)
{neights++;}
如果(网格[y-1][x+1]==1)
{neights++;}
if(网格[y-1][x]==1)
{neights++;}
返回邻居;
}
公共生命网格(int x,int y,字符串文件名)
{
网格=新整数[y][x];
newgrid=newint[y][x];
文件输入=新文件(文件名);
扫描仪sc;
尝试
{
sc=新扫描仪(输入);
}
catch(filenotfounde异常)
{ 
System.out.println(“文件错误”);
返回;
}
对于(y=0;y3)
{
新网格[y][x]=0;
}
if(邻域(x,y)==3 | |邻域(x,y)==2)
{
新网格[y][x]=1;
}
}
如果(网格[y][x]==0)
{
如果(x,y)==3)
{
新网格[y][x]=1;
}
}
}
}
}
公开展览(
{
对于(int y=0;y
int近邻(intx,inty)
是用x=0和y=0调用的,对吗

然后如何计算网格[y-1][x-1]

int近邻(int x,int y)
是用x=0和y=0调用的,对吗

然后,您如何评估网格[y-1][x-1]?

您所处的位置

if (grid[y][x-1] == 1)
如果超出范围,您只需跳过:

if (x > 0 && grid[y][x-1] == 1)
其他所有的都是一样的。

你有

if (grid[y][x-1] == 1)
如果超出范围,您只需跳过:

if (x > 0 && grid[y][x-1] == 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++;
    }
if(x>0&&grid[y][x-1]==1){
邻居++;
}
如果(x0&&y0&&y>0&&grid[y-1][x-1]==1){
邻居++;
}
如果(y>0&&x0&&grid[y-1][x]==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++;
    }
if(x>0&&grid[y][x-1]==1){
邻居++;
}
如果(x0&&y0&&y>0&&grid[y-1][x-1]==1){
邻居++;
}
如果(y>0&&x0&&grid[y-1][x]==1){
邻居++;
}

看看这篇文章,看看生命是如何在边界上计算的。看看这篇文章,看看生命是如何在边界上计算的。我以前试过,但没有成功。现在再试一次,成功了。。。谢谢,我以前试过,没用。现在再试一次,成功了。。。谢谢你,汉克斯,我要演那个角色。现在我得到了奇怪的结果。“分娩”规则并不总是如预期的那样有效。。你能给我一个提示吗?@Croatoan我猜分娩问题与newgrid和grid都指向内存中的同一个数组有关。每一代都需要将网格中的数据复制到新网格中的一个新数组中。谢谢,我让这部分工作起来了。现在我得到了奇怪的结果。