2011-12-05 145 views
2

我很无聊,只有30分钟的空闲时间,所以我决定在制作人生游戏时有一个破解。我遵循维基百科的规则,似乎没有正常工作。有人能告诉我我会做错什么吗?生命之死 - 死亡

以下是规则:
任何有两个活的邻居的活细胞都会死亡,好像是由于人口不足造成的。

任何有两个或三个活的邻居的活细胞都活在下一代。

任何超过三个活邻居的活细胞都会死亡,好像过度拥挤一样。

任何具有正好三个活的邻居的死细胞变成活细胞,就像通过繁殖一样。

public void PerformLogic() 
{ 
    if (in_game) 
    { 
     time_elapsed += rate; 

     if (time_elapsed > frame_rate) 
     { 
      time_elapsed = 0; 

      for (int x = 0; x < board_width; x++) 
      { 
       for (int y = 0; y < board_height; y++) 
       { 
        if (board[x, y] == alive) 
        { 
         int surrounding_cells = 0; 

         for (int x2 = -1; x2 <= 1; x2++) 
         { 
          for (int y2 = -1; y2 <= 1; y2++) 
          { 

           if (!(x2 + x <= -1 || y2 + y <= -1 || x + x2 >= board_width || y + y2 >= board_height)) 
           { 
            if (board[x + x2, y + y2] == alive) 
            { 
             surrounding_cells++; 
            } 
           } 
          } 
         } 

         if (surrounding_cells < 2) 
         { 
          board[x, y] = dead; 
         } 
         if (surrounding_cells == 2 || 
          surrounding_cells == 3) 
         { 
          board[x, y] = alive; 
         } 
         if (surrounding_cells > 3) 
         { 
          board[x, y] = dead; 
         } 
        } 
        else if (board[x, y] == dead) 
        { 
         int surrounding_cells = 0; 

         for (int x2 = -1; x2 <= 1; x2++) 
         { 
          for (int y2 = -1; y2 <= ; y2++) 
          { 

           if (!(x2 + x <= -1 || y2 + y <= -1 || x + x2 >= board_width || y + y2 >= board_height)) 
           {           
            if (board[x + x2, y + y2] == alive) 
            { 
             surrounding_cells++; 
            } 
           } 

          } 
         } 

         if (surrounding_cells == 3) 
         { 
          board[x, y] = alive; 
         } 
        } 
       } 
      } 
     } 
    } 
} 

任何想法?

+1

定义“似乎没有正常工作”?行为以何种方式不符合您的期望? –

+1

“它似乎没有正常工作” - 堆栈溢出问题的一个很好的例子;)哪些工作不正常?请明确点。 –

+0

我的天啊,请将代码分成更小的函数吧! – BlackBear

回答

4

我相信你是太早更新板(即我上面张贴的最后一行后IE)的开始。生活的游戏应该在完成扫描整个电路板之后更新电路板,而不是在扫描时进行。

例如为:

if (surrounding_cells > 3) 
{ 
    board[x, y] = dead; 
} 

此之后,旁边的小区,该小区将被视为死。

Marc也是对的。

+0

好点;是的,这会产生巨大的差异 –

+0

这确实是我的第一次尝试。 :)好的赶上! – sarnold

+0

谢谢!这两个答案都非常有帮助!还有什么快速回复:) – Darestium

4
for (int x2 = -1; x2 <= 1; x2++) 
{ 
    for (int y2 = -1; y2 <= 1; y2++) 
    { 

我看来像你包括这个循环中的中央细胞,所以9而不是8

我不知道嵌套for是最好的选择,但如果你正在使用即,添加:

if(x2 == 0 && y2 == 0) continue; 

在内环

+0

这是*另外*更新当前网格,而不是有一个旧网格和一个新网格(每个紫药) –

+0

谢谢!这两个答案都非常有帮助!而且什么是快速回复:) – Darestium