生命的游戏算法/if-else语句的结构



我目前正在介绍Java类编程,遇到了一两个问题。

首先,我目前的程序是"康威的生命游戏",除了检查相邻细胞的算法外,我已经完成了所有工作。

我在Stackoverflow上查看了大约7到8个不同的帖子,在其他网站上也查看了一些,到目前为止,我找不到任何人采取了我的方法。

现在,我只需要有人检查我的代码,看看它是否应该工作,如果不工作,为什么不呢?目前,我收到一个运行时错误,上面写着:

"ArrayIndexOutOfBoundsException:5 at Life.checkold(Life.java:151)">.

我已经尽我所能在代码中标记了这个地方。

我对这些方法的输入是一个5乘5的阵列

首先,感谢你至少读到这篇文章。第二,如果我需要包括任何其他内容,请留下评论或回复(新的抱歉)

构建下一代:

public static boolean[][] buildnext(boolean[][] lastgen)
{
boolean[][] nextgen = new boolean[lastgen.length][lastgen[0].length];
for(int r = 0; r < lastgen[0].length; r++)
{
for(int c = 0; c < lastgen.length; c++)
{
nextgen[c][r] = checkold(lastgen, c, r);
}
}
return nextgen;
}

我的检查方法:

public static boolean checkold(boolean[][] lastgen, int col, int row)
{
int acount = 0;
boolean alive = lastgen[col][row];
if(col == 0 && row == 0) //Top Left Corner
{       
if(lastgen[col][row + 1] == true) acount++; //Below
if(lastgen[col + 1][row] == true) acount++; //Right
if(lastgen[col + 1][row + 1] == true) acount++; //Below Right
}
else if(col == lastgen.length && row == 0)//Top Right Corner
{
if(lastgen[col][row + 1] == true) acount++; //Below
if(lastgen[col - 1][row] == true) acount++; //Left
if(lastgen[col - 1][row + 1] == true) acount++; //Below Left
}
else if(col == 0 && row == lastgen[0].length)//Bottom Left Corner
{
if(lastgen[col][row - 1] == true) acount++; //Above
if(lastgen[col + 1][row] == true) acount++; //Right
if(lastgen[col + 1][row - 1] == true) acount++; //Above Right
}
else if(col == lastgen.length && row == lastgen[0].length) //Bottom Right Corner
{
if(lastgen[col][row - 1] == true) acount++; //Above
if(lastgen[col - 1][row] == true) acount++; //Left
if(lastgen[col - 1][row - 1] == true) acount++; //Above Left
}
else if(col == 0 && row > 0 && row < lastgen[0].length) //Left Col
{
if(lastgen[col][row - 1] == true) acount++; //Above
if(lastgen[col][row + 1] == true) acount++; //Below  (This is the code that the runtime error is about)
if(lastgen[col + 1][row] == true) acount++; //Right
if(lastgen[col + 1][row - 1] == true) acount++; //Above Right
if(lastgen[col + 1][row + 1] == true) acount++; //Below Right
}
else if(col == lastgen.length && row > 0 && row < lastgen[0].length) //Right Col
{
if(lastgen[col - 1][row] == true) acount++; //Left
if(lastgen[col][row - 1] == true) acount++; //Above
if(lastgen[col][row + 1] == true) acount++; //Below
if(lastgen[col - 1][row - 1] == true) acount++; //Above Left
if(lastgen[col - 1][row + 1] == true) acount++; //Below Left
}
else if(col < 0 && row == 0) //Top Row
{
if(lastgen[col][row + 1] == true) acount++; //Below
if(lastgen[col - 1][row] == true) acount++; //Left
if(lastgen[col + 1][row] == true) acount++; //Right
if(lastgen[col - 1][row + 1] == true) acount++; //Below Left
if(lastgen[col + 1][row + 1] == true) acount++; //Below Right
}
else if(col < 0 && row == lastgen[0].length) //Bottom Row
{
if(lastgen[col][row - 1] == true) acount++; //Above
if(lastgen[col - 1][row] == true) acount++; //Left
if(lastgen[col + 1][row] == true) acount++; //Right
if(lastgen[col - 1][row - 1] == true) acount++; //Above Left
if(lastgen[col + 1][row - 1] == true) acount++; //Above Right
}
else if(col < 0 && row < 0) //Middle Cells
{ 
if(lastgen[col][row + 1] == true) acount++; //Below
if(lastgen[col][row - 1] == true) acount++; //Above
if(lastgen[col - 1][row] == true) acount++; //Left
if(lastgen[col + 1][row] == true) acount++; //Right
if(lastgen[col - 1][row - 1] == true) acount++; //Above Left
if(lastgen[col + 1][row - 1] == true) acount++; //Above Right
if(lastgen[col - 1][row + 1] == true) acount++; //Below Left
if(lastgen[col + 1][row + 1] == true) acount++; //Below Right
}
if(acount == 3 && alive == false) alive = true;
if(acount == 1) alive = false;
if(acount == 3 && alive == true) alive = false;
return alive;
}

您的异常非常明显,您正试图访问一个越界的数组索引。

else if(col == 0 && row > 0 && row < lastgen[0].length) //Left Col
{
if(lastgen[col][row - 1] == true) acount++; //Above
if(lastgen[col][row + 1] == true) acount++; //Below  (This is the code that the runtime error is about)

您的代码在以下行失败:

if(lastgen[col][row + 1] == true) 

假设lastgen数组是2X3数组,行=2,否则如果part为true,并考虑是否也是true,现在在这里

if(lastgen[col][row + 1] == true) 

您正在尝试访问3索引,记住:数组索引以零开头。如果数组长度为3,则数组索引将为0,1,2。2将是最后一个索引。

这些条件正确吗?

col < 0

在我看来,你应该评估"col>0">

由于同一块中的两行而导致的错误

1. if(lastgen[col][row + 1] == true) acount++;
2. if(lastgen[col + 1][row + 1] == true) acount++;

假设您的上一代元素大小为4,并且您正试图使用[row+1]访问,这显然是5

编辑

放入else if(col == 0 && row > 0 && row < lastgen[0].length-1)

而不是else if(col == 0 && row > 0 && row < lastgen[0].length)

阵列长度-1

最新更新