2012-01-22 3 views
1

Я сделал весь код правильно и застрял в этой глупой вещи: я не могу остановить печать, когда предыдущее поколение такое же, как новое ... поэтому, когда шаблон печати как и предыдущий шаблон, он должен остановиться.создание новой переменной и создание вложенного цикла

Мне нужно скопировать плату перед вызовом «шаг», а затем сравнить новые и скопированные доски и только распечатать, если она изменилась. Мне нужно создать новую переменную, как я сделал плату [], затем сделайте вложенную петлю, как в печатном виде, а внутри сделайте новую панель [y] [x] = панель [y] [x]

Пожалуйста, помогите мне с этим, я не могу остановить печать, которую она всегда печатает. пожалуйста, покажите мне ваш синтаксис

void step(int board[][WIDTH], int rows) { 
    int x, y; 
    int neighbors[HEIGHT][WIDTH]; 
    for (y = 0; y < rows; y++) 
     for (x = 0; x < WIDTH; x++) 
      neighbors[y][x] = count_neighbors(board, rows, y, x); 
    for (y = 0; y < rows; y++) 
     for (x = 0; x < WIDTH; x++) 
      if (board[y][x] == 1) { /* Currently alive */ 
       if (neighbors[y][x] < 2) 
        board[y][x] = 0; /* Death by boredom */ 
       else if (neighbors[y][x] > 3) 
        board[y][x] = 0; /* Death by overcrowding */ 
      } 
      else { /* Currently empty */ 
       if (neighbors[y][x] == 3) 
        board[y][x] = 1; 
      } 
} 
+0

Возможно, сделайте 'step' искать что-то изменяющееся и вернуть логическое значение, которое вы можете использовать в качестве условия в своем цикле. – sje397

ответ

1

Вы просто должны отслеживать изменения. Скорее тривиальный делать и гораздо меньше работы (выполнение/память мудрую), чем копирование и сравнивая весь массив:

int step(int board[][WIDTH], int rows) { // now returns a bool 
    int x, y; 
    int neighbors[HEIGHT][WIDTH]; 
    int changed = 0; // save changes 
    for (y = 0; y < rows; y++) 
     for (x = 0; x < WIDTH; x++) 
      neighbors[y][x] = count_neighbors(board, rows, y, x); 
    for (y = 0; y < rows; y++) 
     for (x = 0; x < WIDTH; x++) 
      if (board[y][x] == 1) { /* Currently alive */ 
       if (neighbors[y][x] < 2) 
       { 
        board[y][x] = 0; /* Death by boredom */ 
        changed = 1; // change happened 
       } 
       else if (neighbors[y][x] > 3) 
       { 
        board[y][x] = 0; /* Death by overcrowding */ 
        changed = 1; // change happened 
       } 
      } 
      else { /* Currently empty */ 
       if (neighbors[y][x] == 3) 
       { 
        board[y][x] = 1; 
        changed = 1; // change happened 
       } 
      } 
    return changed; // return the status (changed yes/no?) 
} 

int main(void) { 
    int board[HEIGHT][WIDTH]; 
    init(board, HEIGHT); 
    while (1) { 
     print(board, HEIGHT, WIDTH); 
     if(step(board, HEIGHT) == 0) // no change 
      break; // leave the loop 
    } 
    return 0; 
} 

Edit: При желании, вы можете так же рассчитывать фактические изменения (вместо того, чтобы просто сказать да/нет) и вернуть количество изменений. Могло бы остаться почти таким же.

+0

ошибки на этапе BOOL (INT доска [] [WIDTH], Int строк) {: Ошибка ошибка C2061: ошибка синтаксиса: Идентификатор 'шаг' \t Ошибки ошибки C2059: ошибка синтаксиса: 'типа' \t Ошибки ошибка C2059: синтаксическая ошибка: ';' – Blondy21

+0

А, моя ошибка. Используйте тип 'int' как возвращаемый тип. C не знает 'bool' в конце концов. – Mario

+0

@Mario, уверен, что C имеет 'bool' (или' _Bool') с C99. –

Смежные вопросы