2017-03-31 42 views
0

我正在完成康威的人生游戏作业。我创建了一个函数来生成1和0的随机数组; 1代表活细胞,零代表空白空间。我创建了一个单独的函数来检查邻域,并计算确定游戏的进展情况。规则:如果一个细胞有2或3个邻居,它就会生存下来,超过3个或少于2个就会死亡,如果一个空间有3个邻居,它就是“天生的”。我的“星球”是79 x 24个字符,但它不是真正的行星,直到我包裹屏幕。屏幕在C++中包装二维数组

下面是函数:

void life (int master[24][79]) //generates/kills cells based on neighborhood 
{ 
    int temp[24][79]; //temporary array for manipulating data 
    copy (master, temp); //copy array onto temp 
    for(int j = 0; j < h; j++) //height loop 
    { 

     for (int i = 0; i < w; i++) //width loop 
     { 
      int count = 0; //intialize neighbor count variable 
      count = master[j-1][i] + //searches down 
      master[j-1][i-1] + //down left 
      master[j][i-1] + //left 
      master[j+1][i-1] + //up left 
      master[j+1][i] + //up 
      master[j+1][i+1] + //up right 
      master[j][i+1] + //right 
      master[j-1][i+1]; //down right 
      //cell dies if count falls below 2 or rises above 3 
      if(count < 2 || count > 3) 
       temp[j][i] = 0; 
      //cell stays alive if it has two neighbors 
      if(count == 2) 
       temp[j][i] = master[j][i]; 
      //cell either stays alive or gets born if three neighbors 
      if(count == 3) 
       temp[j][i] = 1; 
     } //end width loop 
    }//end height loop 
    copy(temp, master); //copy temp back to main array 
} //end life function 

我敢肯定,我应该使用模量,但什么,我尝试似乎工作。我曾尝试使用while循环将最大值恢复为零,但我可以告诉它具有逐渐向下缠绕的效果,类似于螺纹如何缠绕螺钉。我应该只是mod-ify(对不起)搜索部分代码看起来像这样?

int count = 0; //intialize neighbor count variable 
      count = master[(j-1)%h][i%w] + //searches down 
      master[(j-1)%h][(i-1)%w] + //down left 
      master[j%h][(i-1)%w] + //left 
      master[(j+1)%h][(i-1)%w] + //up left 
      master[(j+1)%h][i%w] + //up 
      master[(j+1)%h][(i+1)%w] + //up right 
      master[j%h][(i+1)%w] + //right 
      master[(j-1)%h][(i+1)%w]; //down right 

我在这里和其他论坛上搜索过,但是我试过的所有东西都看起来很奇怪。感谢您的任何建议。

+0

[OT]:我建议使用'std :: array'而不是C-array来拥有正确的安全语法。 (因为'void life(int master [24] [79])'实际上是'void life(int(* master)[79])')。 – Jarod42

+0

从阅读这些论坛的Lol我知道有人打算与此​​! :D我的教授不是程序员(电气工程师),显然不喜欢教这门课,对任何不使用命名空间标准的人都有热忱的仇恨。我遇到了一些问题,我只能解决他的困惑。 –

+0

创建一个'struct worldMap {int cells [24] [79]; };'将是一个简单的步骤。 (添加访问者将是一个很好的补充)。 – Jarod42

回答

0

要留在范围[0-w[你必须使用模量,并确保比你的数字为正数,所以,像

master[(j - 1 + h) % h][i % w] 
+ master[(j - 1 + h) % h][(i - 1 + w) % w] 
// ... 

等。

我建议增加一个访问功能,像

int& get(int master[24][79], int i, int j) 
{ 
    return master[(j - 1 + 24) % 24][(i - 1 + 79) % 79] 
} 

,然后简单地使用

get(master, i, j - 1) 
+ get(master, i - 1, j - 1) 
// ... 

我建议来包装类数据:

class WorldMap 
{ 
public: 
    int get(int i, int j) const { return cells[(i + 24) % 24][(j + 79) % 79]; } 
    int& get(int i, int j)  { return cells[(i + 24) % 24][(j + 79) % 79]; } 
private: 
    int cells[24][79] = {}; 
}; 

而且那么

void life (WorldMap& worldMap) 
{ 
    WorldMap next; 
    // ... initialize next according to rules of life 
    worldMap = next; 
} 
+0

抱歉编辑。我不熟悉开放区间符号。 – stark

+0

非常感谢!我现在用第一个例子来修复它,它似乎完美地工作。我需要更多地了解其他指标,但是我应该在周二之前找到它。再次感谢! –