生命游戏做了奇怪的事情,我不知道出了什么问题
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;
因此,对于一项作业,我必须用 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;