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