C# 生命的游戏-死亡

C# 生命的游戏-死亡,c#,xna,logic,C#,Xna,Logic,我很无聊,只有30分钟的空闲时间,所以我决定尝试一下制作生活游戏。我在维基百科上遵循了这一规则,但它似乎不能正常工作。有人能告诉我我会做错什么吗 以下是规则: 任何少于两个活邻居的活细胞都会死亡,就好像是由于人口不足造成的一样 任何有两个或三个活邻居的活细胞都会延续到下一代 任何一个有三个以上邻居的活细胞都会死亡,就好像过度拥挤一样 任何有三个活邻居的死细胞都会变成活细胞,就像通过繁殖一样 public void PerformLogic() { if (in_game) {

我很无聊,只有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;
                        }
                    }
                }
            }
        }
    }
}
public void PerformLogic()
{
如果(在游戏中)
{
经过的时间+=速率;
如果(经过的时间>帧速率)
{
经过的时间=0;
用于(int x=0;x在内部循环开始时(即在我上面发布的最后一行之后)

我认为你更新棋盘太早了。生命游戏应该在扫描完整个棋盘后更新棋盘,而不是在扫描时更新

例如:

在此之后,对于它旁边的细胞,这个细胞将被视为死亡


Marc也是对的。

定义“似乎工作不正常”?行为在哪些方面与您的期望不一致?“似乎工作不正常”—一个很好的堆栈溢出问题示例;)什么工作不正常?具体点。我的上帝,请把代码分成更小的函数!呵呵,好主意;)不是很模块化D:这是除了更新当前网格之外的,而不是有一个旧网格和一个新网格(按子耀)谢谢!这两个答案都帮了大忙!而且回答得真快:)这正好扼杀了我的第一次尝试。:)接得好!谢谢!这两个答案都帮了大忙!而且回答得真快:)
for (int x2 = -1; x2 <= 1; x2++)
{
    for (int y2 = -1; y2 <= 1; y2++)
    {
if(x2 == 0 && y2 == 0) continue;
if (surrounding_cells > 3)
{
   board[x, y] = dead;
}