2013-02-28 125 views
-1

所以,代码编译和运行完美。然而,通常,康威的生命游戏会在一段时间后稳定下来,而这段代码无限期地运行而没有死亡分支,如果有人能够帮助我找出原因,我很乐意。康威的加工生命游戏

int[][] world; 
int SCALE_FACTOR = 4; 
float DENSITY = 0.1; 

void setup() { 
    size(500,500); 
    world = new int[width/SCALE_FACTOR][height/SCALE_FACTOR]; 
    for(int i = 0; i < width/SCALE_FACTOR; i++) { 
    for (int j = 0; j < height/SCALE_FACTOR; j++) { 
     int r = (int)random(100); 
     world[i][j] = r % (int)(1/DENSITY) == 0 ? 1 : 0; 
    } 
    } 
    frameRate(1); 
    stroke(0, 255, 0); 
} 

void draw() { 
    scale(SCALE_FACTOR); 
    background(0); 
    for(int i = 0; i < width/SCALE_FACTOR; i++) { 
    for (int j = 0; j < height/SCALE_FACTOR; j++) { 
     if (world[i][j] == 1) point(i, j); 
    } 
    } 
    lifeCycle();  
} 

void lifeCycle() { 
    int[][] newworld = new int[width/SCALE_FACTOR][height/SCALE_FACTOR]; 
    for(int i = 0; i < width/SCALE_FACTOR; i++) { 
    for (int j = 0; j < width/SCALE_FACTOR; j++) { 
     if (world[i][j] == 1) { 
     if (neighbours(i, j) == 3) { 
      newworld[i][j] = 1; 
     } else { 
      newworld[i][j] = 0; 
     } 
     } else { 
     if (neighbours(i, j) == 2 || neighbours(i, j) == 3) { 
      newworld[i][j] = 1; 
     } else { 
      newworld[i][j] = 0; 
     } 
     } 
    } 
    } 
    for (int i = 0; i < width/SCALE_FACTOR; i++) { 
    for (int j = 0; j < height/SCALE_FACTOR; j++) { 
     world[i][j] = newworld[i][j]; 
    } 
    } 
} 

int neighbours(int x, int y) { 
    int px = (x == width/SCALE_FACTOR - 1) ? 0 : (x+1); 
    int py = (y == height/SCALE_FACTOR - 1) ? 0 : (y+1); 
    int mx = (x == 0) ? (width/SCALE_FACTOR - 1) : (x-1); 
    int my = (y == 0) ? (height/SCALE_FACTOR - 1) : (y-1); 
    return world[mx][my] + world[mx][y] + world[mx][py] 
    + world[x][my] + world[x][py] 
    + world[px][my] + world[px][y] + world[px][py]; 
} 
+0

我想说这更适合http://codereview.stackexchange.com/ – 2013-02-28 19:20:24

+1

一般策略:单元测试它的每一块。它看起来像if语句的分支在查看当前单元格是否存在或不存在时是落后的。也就是说,一个死细胞应该与三个邻居一起活着,一个活细胞应该与2/3个邻居共存。 – bchurchill 2013-02-28 19:21:21

+0

请记住,第一次来这里,谢谢安德鲁 – 2013-02-28 19:28:38

回答

1

嗯,这看起来错误的开始:

for (int j = 0; j < width/SCALE_FACTOR; j++) { 

当然这应该是height

接下来是:目前你的逻辑说:“如果广场之前还活着,如果它有三个邻居,它只在下一轮活着;如果它以前死过,它在下一轮活着,如果它有两个或三个邻居“。这是错误的方式。这需要三个活的邻居创建生活,但只有两个或三个邻居维持生活。

这就是我马上就可以看到这是不对的,但对诊断问题的提示:

  • 我强烈建议保留widthheight游戏而方面比像素大小,我以为SCALE_FACTOR是什么意思。在绘制时将单位向上缩放,但要根据实际网格元素保留所有逻辑。
  • 如果您将UI与“业务逻辑”隔离,您可以轻松地对其进行单元测试。
  • 当您使用UI来显示电路板时,您可能想要给它一个“手动前进”模式,以便您可以更轻松地查看到底发生了什么。
+0

哦,那绝对是,我从实际的游戏中弄错了逻辑。感谢有用的建议,但会牢记它们! – 2013-02-28 19:25:46