生命游戏做了奇怪的事情,我不知道出了什么问题

Game Of Life does weird things and I don't know whats wrong

因此,对于一项作业,我必须用 C 编写生活游戏代码。 我的问题是,它计算下一代错误,但我不知道为什么。

我定义了我的游戏结构

typedef struct gameStruct {
    int width;
    int height;
    char* field;
} Game;

为了更新,我创建了一个临时数组来存储单元格状态,然后遍历实际字段中的每个单元格。我检查当前单元格旁边的 8 个单元格,检查它是否是实际有效的邻居,然后获取邻居单元格的状态。检查完所有 8 个单元格后,我在临时数组中设置单元格的状态。在计算完所有单元格后,我将 field[i] 设置为 temp[i].

void update() {
    char* newTemp;  
    newTemp = malloc(sizeof(char) * game.width * game.height);

    for (int y = 0; y < game.height; y++) {
        for (int x = 0; x < game.width; x++) {

            int Index = y * game.width + x;
            int alive_n = 0;
            int dead_n = 0;
            int invalid_n = 0;

            for (int yOff = -1; yOff <= 1; yOff++) {
                for (int xOff = -1; xOff <= 1; xOff++) {
                    if ((xOff == 0 && yOff == 0) || xOff + x < 0 || yOff + y < 0 || x + xOff >= game.width || y + yOff >= game.height) {
                        continue;
                    }
                    else {
                        int newIndex = (y + yOff) * game.width + (x + xOff);
                        switch (game.field[newIndex]) {
                            case '*': alive_n++; break;
                            case ' ': dead_n++; break;
                        default: invalid_n++; break;
                        }
                        
                    }
                }
            }

            char next_state = ' ';
            if (alive_n == 2 || alive_n == 3) {
                next_state = '*';
            }
            else if (alive_n == 0 && dead_n == 3) {
                next_state = '*';
            }
            newTemp[Index] = next_state;        
        }
    }
    for(int i = 0; i < game.width * game.height; i++){
            game.field[i] = newTemp[i];
    }
    free(newTemp);
}

所以基本上它只是做一些看起来完全随机的奇怪事情。 与使用相同配置的在线生活游戏相比,我的结果如下:

我用来比较的人生游戏:https://www.dcode.fr/game-of-life

我不知道问题出在哪里。也许这里的任何人都可以帮助我发现错误?谢谢!

您的问题是如何更新单元格。规则是:

  • 一个活细胞如果没有 2 或 3 个活的邻居就会死亡;
  • 如果有 3 个活邻居,死细胞就会复活。

这意味着您必须考虑单元格的当前状态以确定其下一个状态,但您的代码不会这样做。 (这也意味着算上住的邻居就够了。)

根据上述规则,您的更新代码应如下所示:

        char next_state = field[Index];
        
        if (next_state == '*') {
            if (alive_n != 2 && alive_n != 3) next_state = ' ';
        } else {
            if (alive_n == 3) next_state = '*';
        }
        
        newTemp[Index] = next_state;