2010-10-23 69 views
1

这个编译和运行没问题,但结果与他们应该完全不同。为什么我的C++生命游戏不能正常工作?

我剪断irrelavent代码:

bool grid[1280][1024]; // hardcoded to my screen res for now 

for (int x = 0; x<1280; x++)  //init grid to false 
{ 
    for (int y = 0; y<1024; y++) 
    { 
     grid[x][y] = false; 
    } 
} 

grid[320][120] = true; // add a simple pattern 
grid[320][121] = true; 
grid[320][122] = true; 
grid[320][123] = true; 
grid[320][124] = true; 
grid[320][125] = true; 
grid[320][126] = true; 
grid[320][127] = true; 
grid[320][128] = true; 

// [snipped] 

for (int x = 1; x< (1280 - 1); x++) 
{ 
    for (int y = 1; y< (1024 - 1); y++) 
    { 
     int n = 0; // neighbours 
     if (grid[x-1][y-1]) n++; // top left 
     if (grid[x][y-1]) n++; // top middle 
     if (grid[x+1][y-1]) n++; // top right 

     if (grid[x-1][y]) n++; // left 
     if (grid[x+1][y]) n++; // right 

     if (grid[x-1][y+1]) n++; // bottom left 
     if (grid[x][y+1]) n++; // bottom middle 
     if (grid[x+1][y+1]) n++; // bottom right 


     if (grid[x][y]) // current cell is on 
     { 
      SetPixel(screen, x, y, on); // drawing function 

      if (n < 2) grid[x][y] = false; // die. :(
      if (n > 3) grid[x][y] = false; // die. :(
      // otherwise (2 or 3), survive. :) 

     } 
     else // current cell is off 
     { 
      SetPixel(screen, x, y, off); // drawing function 

      if (n == 3) grid[x][y] = true; // IT'S ALIVE!!! 
     } 



    } 
} 

回答

4

首先,这是行不通的,因为你还没有分开的每个单元的结果,即,如果电网[0] [0]死了,那么这将立刻反映在网格[1] [0]的生与死之中,这不是生命之游的作品。其次,它不起作用,因为你似乎没有多次运行游戏。

+0

oooh该死的。我想我必须在每一回合中创建一个数组的副本,然后将结果写入副本,并在每回合开始时用重复项覆盖原始数据。我对吗?尽管我没有得到你的第二个评论,但我怎么运行它不止一次迭代? – Dataflashsabot 2010-10-23 13:03:16

+0

您不必每次都覆盖原始数组。只需在每次迭代中切换当前数组。 “其他”数组始终是下一个当前数组。 – Dialecticus 2010-10-23 13:12:37

+0

@Dataflashsabot:你还没有运行多次迭代。那就是问题所在。生命的游戏永远在运行,而不仅仅是一次。 – Puppy 2010-10-23 14:00:18