康威的生命游戏算法不起作用
Conway's game of life algoritm is not working
我正在尝试模拟康威的人生游戏。我做的算法不工作,但我不知道如何。
如果我遇到这样的情况:
|…………|
|....x....|
|....x....|
|....x....|
|…………|
一种 。是死细胞,x是活细胞
垂直条翻转为水平条是预期的,但这并没有发生。
相反,它只删除底部的,运行 它再次只删除底部,所以剩下 1 个。
显然算法有问题,但我不知道是什么。
我一直在网上查找,但其他人遇到的所有问题,解决方案都不适合我。
那么这个算法的错误是什么?
这是我的代码:
void new_generation() {
// Create one new generation
// double for loop -> iterates every cell
for (int i=0; i<worldHeight; i++){
for (int j=0; j<WorldWidth; j++) {
// find the amount of living neighbours, stored in count
// dubbele for loop -> iterates every neighbour of the current cell
count = 0;
for (int y=0; y<2; y++) {
for (int x=0; x<2; x++){
if (i != 0 and j!= 0) { // the cell itself doesnt count
if (world[i+y][j+x]) count++;
}
}
}
if (world[i][j]) { // current cell is alive
if (count<2 or count>3) new_world[i][j] = false;
else new_world[i][j] = true;
}
else { // current cell is dead
if (count==3) new_world[i][j] = true;
else new_world[i][j] = false;
}
}
}
// copy every value from the newly generated world to the current
// double foor loop -> iterates every cell
for (int i=0; i<worldHeight; i++){
for (int j=0; j<WorldWidth; j++) {
world[i][j] = new_world[i][j];
}
}
worldHeight 和 worldWidth 是表示世界有多大的整数。
world 和 new_world 是包含布尔值的二维数组,其中 true 是活细胞,false 是死细胞
你数错了邻居小区
x 和 y 都是从 0 到 2 而不是从 -1 到 2。在
for (int y=0; y<2; y++) {//should be int y=-1; y<2; y++
for (int x=0; x<2; x++){//should be int x=-1; x<2; x++
if (i != 0 and j!= 0) { // shold be x!=0 or y!=0
if (world[i+y][j+x]) count++;
}
}
}
你还必须检查 world[i+y][j+x]
是否有效(坐标在 0,尺寸范围内)
第三个问题是,当您不想计入 word[i][j]
时,您检查 if (i!=0 and j!=0)
而不是 x!=0
或 y!=0
i和j为被检细胞的坐标,x和y为坐标之差
我正在尝试模拟康威的人生游戏。我做的算法不工作,但我不知道如何。
如果我遇到这样的情况:
|…………|
|....x....|
|....x....|
|....x....|
|…………|
一种 。是死细胞,x是活细胞
垂直条翻转为水平条是预期的,但这并没有发生。 相反,它只删除底部的,运行 它再次只删除底部,所以剩下 1 个。
显然算法有问题,但我不知道是什么。 我一直在网上查找,但其他人遇到的所有问题,解决方案都不适合我。
那么这个算法的错误是什么?
这是我的代码:
void new_generation() {
// Create one new generation
// double for loop -> iterates every cell
for (int i=0; i<worldHeight; i++){
for (int j=0; j<WorldWidth; j++) {
// find the amount of living neighbours, stored in count
// dubbele for loop -> iterates every neighbour of the current cell
count = 0;
for (int y=0; y<2; y++) {
for (int x=0; x<2; x++){
if (i != 0 and j!= 0) { // the cell itself doesnt count
if (world[i+y][j+x]) count++;
}
}
}
if (world[i][j]) { // current cell is alive
if (count<2 or count>3) new_world[i][j] = false;
else new_world[i][j] = true;
}
else { // current cell is dead
if (count==3) new_world[i][j] = true;
else new_world[i][j] = false;
}
}
}
// copy every value from the newly generated world to the current
// double foor loop -> iterates every cell
for (int i=0; i<worldHeight; i++){
for (int j=0; j<WorldWidth; j++) {
world[i][j] = new_world[i][j];
}
}
worldHeight 和 worldWidth 是表示世界有多大的整数。
world 和 new_world 是包含布尔值的二维数组,其中 true 是活细胞,false 是死细胞
你数错了邻居小区
x 和 y 都是从 0 到 2 而不是从 -1 到 2。在
for (int y=0; y<2; y++) {//should be int y=-1; y<2; y++
for (int x=0; x<2; x++){//should be int x=-1; x<2; x++
if (i != 0 and j!= 0) { // shold be x!=0 or y!=0
if (world[i+y][j+x]) count++;
}
}
}
你还必须检查 world[i+y][j+x]
是否有效(坐标在 0,尺寸范围内)
第三个问题是,当您不想计入 word[i][j]
时,您检查 if (i!=0 and j!=0)
而不是 x!=0
或 y!=0
i和j为被检细胞的坐标,x和y为坐标之差