生活游戏中的邻居计数方法
counting neighbors method in game of life
我知道有很多关于生活游戏的问题,但我仍然不明白如何在 javafx 中正确编写此方法。
这是我的代码,它不起作用,因为我不明白如何实现计算邻居的算法。
public void stepMethod(ActionEvent event){
for (int x = 0; x < cellSize; x++){
for (int y = 0; y < cellSize; y++){
int neighbours = countNeighbors(x, y);
nextGeneration[x][y] = board [x][y];
nextGeneration[x][y] = (neighbours == 3) ? true: nextGeneration[x][y];
nextGeneration[x][y] = ((neighbours < 2) || (neighbours > 3)) ? false : nextGeneration[x][y];
}
}
draw();
}
public int countNeighbors(int x, int y){
int neighbours = 0;
if (board [x-1][y-1]){
neighbours+=1;
}else{
neighbours+=0;
}
if (board[x][y-1]){
neighbours+=1;
}else{
neighbours+=0;
}
if (board[x+1][y-1]){
neighbours+=1;
}else{
neighbours+=0;
}
if (board[x-1][y]){
neighbours+=1;
}else{
neighbours+=0;
}
if (board[x+1][y]){
neighbours+=1;
}else{
neighbours+=0;
}
if (board[x-1][y+1]){
neighbours+=1;
}else{
neighbours+=0;
}
if (board[x][y+1]){
neighbours+=1;
}else{
neighbours+=0;
}
if (board[x+1][y+1]){
neighbours+=1;
}else{
neighbours+=0;
}
if(board[x][y]){
neighbours--;
}
return neighbours;
}
这是我的绘制方法
public void draw(){
initGraphics();
for(int x = 0; x < cellSize; x++){
for(int y = 0; y < cellSize; y++){
if(board[x][y] ){
gc.setFill(Color.CHOCOLATE);
gc.fillOval(x*cellSize,y*cellSize,cellSize,cellSize);
}
}
}
}
你的错误
java.lang.ArrayIndexOutOfBoundsException: -1 at
sample.Controller.countNeighbors(Controller.java:54) at
sample.Controller.stepMethod(Controller.java:118)
是运行时错误 - 不是编译错误。它说你的索引(即来自 [x-1]
等的东西)已经消失 OutOfBounds
。
您需要在 ifs 和 elses 中添加更多条件,例如
if (board [x-1][y-1]){
会出问题是x
或者y
是0,所以
if (x>0 && y>0 && board [x-1][y-1]){
您需要检查上限太低。
决定在棋盘的边缘做什么。绕圈?让它成为世界的边缘?由你决定。
在您的第一次迭代中,您将拥有 x=0 and y=0
。所以评估 board[x-1][y-1]
会给你一个棋盘[-1][-1],它会提高 ArrayOutOfBoundsException
.
我知道有很多关于生活游戏的问题,但我仍然不明白如何在 javafx 中正确编写此方法。 这是我的代码,它不起作用,因为我不明白如何实现计算邻居的算法。
public void stepMethod(ActionEvent event){
for (int x = 0; x < cellSize; x++){
for (int y = 0; y < cellSize; y++){
int neighbours = countNeighbors(x, y);
nextGeneration[x][y] = board [x][y];
nextGeneration[x][y] = (neighbours == 3) ? true: nextGeneration[x][y];
nextGeneration[x][y] = ((neighbours < 2) || (neighbours > 3)) ? false : nextGeneration[x][y];
}
}
draw();
}
public int countNeighbors(int x, int y){
int neighbours = 0;
if (board [x-1][y-1]){
neighbours+=1;
}else{
neighbours+=0;
}
if (board[x][y-1]){
neighbours+=1;
}else{
neighbours+=0;
}
if (board[x+1][y-1]){
neighbours+=1;
}else{
neighbours+=0;
}
if (board[x-1][y]){
neighbours+=1;
}else{
neighbours+=0;
}
if (board[x+1][y]){
neighbours+=1;
}else{
neighbours+=0;
}
if (board[x-1][y+1]){
neighbours+=1;
}else{
neighbours+=0;
}
if (board[x][y+1]){
neighbours+=1;
}else{
neighbours+=0;
}
if (board[x+1][y+1]){
neighbours+=1;
}else{
neighbours+=0;
}
if(board[x][y]){
neighbours--;
}
return neighbours;
}
这是我的绘制方法
public void draw(){
initGraphics();
for(int x = 0; x < cellSize; x++){
for(int y = 0; y < cellSize; y++){
if(board[x][y] ){
gc.setFill(Color.CHOCOLATE);
gc.fillOval(x*cellSize,y*cellSize,cellSize,cellSize);
}
}
}
}
你的错误
java.lang.ArrayIndexOutOfBoundsException: -1 at
sample.Controller.countNeighbors(Controller.java:54) at
sample.Controller.stepMethod(Controller.java:118)
是运行时错误 - 不是编译错误。它说你的索引(即来自 [x-1]
等的东西)已经消失 OutOfBounds
。
您需要在 ifs 和 elses 中添加更多条件,例如
if (board [x-1][y-1]){
会出问题是x
或者y
是0,所以
if (x>0 && y>0 && board [x-1][y-1]){
您需要检查上限太低。
决定在棋盘的边缘做什么。绕圈?让它成为世界的边缘?由你决定。
在您的第一次迭代中,您将拥有 x=0 and y=0
。所以评估 board[x-1][y-1]
会给你一个棋盘[-1][-1],它会提高 ArrayOutOfBoundsException
.