在我的生活游戏中,我无法真正看到我的支票邻居功能出现了什么问题。它检查所有8个邻居,然后根据生活计数分配被检查的细胞生存或死亡,然后更新板。
void check_neighbours (int board[][COL])
{
int living = 0, i, j, k, l;
int new_board[ROW][COL];
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if ((board[i + 1 % ROW][j % COL]) == '#')
{
living++;
}
if ((board[i - 1 % ROW ][j % COL]) == '#')
{
living++;
}
if ((board[i % ROW][j + 1 % COL]) == '#')
{
living++;
}
if ((board[i % ROW][j - 1 % COL]) == '#')
{
living++;
}
if ((board[i + 1 % ROW][j + 1 % COL]) == '#')
{
living++;
}
if ((board[i - 1 % ROW ][j + 1 % COL ]) == '#')
{
living++;
}
if ((board[i + 1 % ROW ][j - 1 % COL ]) == '#')
{
living++;
}
if ((board[i - 1 % ROW ][j - 1 % COL ]) == '#')
{
living++;
}
if (living == 3)
{
new_board[i][j] = '#';
}
if (living <= 2)
{
new_board[i][j] = '-';
if (living < 3)
{
new_board[i][j] = '-';
}
}
}
for (k = 0; k < ROW; k++)
{
for (l = 0; l < COL; l++)
{
board[k][l] = new_board[k][l];
}
}
}
}
编辑:添加括号但仍然打印相同的
答案 0 :(得分:2)
尝试在数学中加入一些括号:
board[(i + 1) % ROW]
比
更安全board[i + 1 % ROW]
答案 1 :(得分:1)
不是这样的:
board[i + 1 % ROW]
越界?尝试解决这些问题。
正如Paul R建议的那样,您可以使用括号,以便与%
运算符相比,赶上+
运算符的更高优先级。所以将代码更改为:
board[(i + 1) % ROW]
假设ROW = 5且i = 4,则得到:
(4 + 1)%5 = 0 //是啊!
4 + 1%5 = 5 //哦亲爱的......
答案 2 :(得分:1)
在执行living
计数之前测试边缘条件。
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
int living = 0;
for (int drow = -1; drow <= 1; drow++) {
int row = i+drow;
if (row < 0 || row >= ROW) continue; // over the edge
for (int dcol = -1; dcol <= 1; dcol++) {
int col = j+dcol;
if (col < 0 || col >= COL) continue; // over the edge
if (row==0 && col==0) continue;
if (board[row][col] == '#') {
living++;
}
} // endfor dcol
} // endfor drow
// This section may need review - GOL rules are unclear in post -see below
if (living == 3) {
new_board[i][j] = '#';
}
...
} // endfor j
} // endfor i
如果遵守规则:
任何活着的邻居少于两个的活细胞都会死亡,就像人口不足一样 任何有两三个活邻居的活细胞都会留在下一代 任何有三个以上活着的邻居的活细胞都会死亡,就像人口过多一样 具有正好三个活邻居的任何死细胞变成活细胞,就好像通过繁殖一样。
#define ALIVE ('#')
#define DEAD ('-')
#define POP_MIN 2
#define POP_MAX 3
#define POP_REPRO 3
new_board[i][j] = board[i][j];
if (board[i][j] == ALIVE) {
if (living < POP_MIN) new_board[i][j] = DEAD;
else if (living > POP_MAX) new_board[i][j] = DEAD;
} else {
if (living == POP_REPRO) new_board[i][j] = ALIVE;
}