Я пытаюсь закодировать игру жизни в C. Я сидел в течение 7 часов, размышляя о том, как ее решить. Я зашел далеко, но есть что-то, что делает код не работает так, как должно. Я считаю, что я сделал что-то неправильно между следующей и текущей переменными в структуре. Может быть, ошибаться в подсчете, если сосед жив или мертв. Во всяком случае, я был бы признателен за любую помощь!C Игра жизни вопросы
void checkField(const int rows, const int cols, cell field[rows][cols]) {
int neighborCount;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
neighborCount = getNeighborCount(rows, cols, r, c, field);
nextGeneration(rows, cols, r, c, neighborCount, field);
}
}
}
int getNeighborCount(const int rows, const int cols,
int r, int c, cell field[rows][cols]) {
int neighborCount = 0;
neighborCount += checkNeighbors(rows, cols, r - 1, c - 1, field);
neighborCount += checkNeighbors(rows, cols, r - 1, c, field);
neighborCount += checkNeighbors(rows, cols, r - 1, c + 1, field);
neighborCount += checkNeighbors(rows, cols, r, c - 1, field);
neighborCount += checkNeighbors(rows, cols, r, c + 1, field);
neighborCount += checkNeighbors(rows, cols, r + 1, c - 1, field);
neighborCount += checkNeighbors(rows, cols, r + 1, c, field);
neighborCount += checkNeighbors(rows, cols, r + 1, c + 1, field);
return neighborCount;
}
int checkNeighbors(const int rows, const int cols,
int r, int c, cell field[rows][cols]) {
int neighborAlive;
if (r < 0 || r > rows || c < 0 || c > cols || field[r][c].current != ALIVE){
return neighborAlive = 0;
}
else {
return neighborAlive = 1;
}
}
void nextGeneration(const int rows, const int cols,
int r, int c, int neighborCount, cell field[rows][cols]) {
for (int r = 0 ; r < rows ; r++) {
for (int c = 0 ; c < cols ; c++) {
field[r][c].current = DEAD;
field[r][c].next = DEAD;
}
}
if (neighborCount < 2){
field[r][c].current = DEAD;
field[r][c].next = DEAD;
}
if (neighborCount == 2 || neighborCount == 3) {
field[r][c].current = ALIVE;
field[r][c].next = ALIVE;
}
if ((field[r][c].current == DEAD) && neighborCount == 3) {
field[r][c].current = ALIVE;
field[r][c].next = ALIVE;
}
if (neighborCount >= 4) {
field[r][c].current = DEAD;
field[r][c].next = DEAD;
}
}
hey @ Cows42 не снимает вопрос, потому что будущие пользователи не смогут связать ответы на вопрос :) – Cherubim
как «отлаживать мой код» вопрос с большой дампом кода и без четкой формулировки проблемы получает так много upvotes? – bolov
@bolov Я четко заявил, где я думал, что проблемы были. Очевидно, я был прав на обоих. «Я считаю, что я сделал что-то не так между следующей и текущей переменными в структуре. Может быть, ошибается в подсчете, если сосед жив или мертв». – Cows42