Метод принимающий матрицу и возрващающий новую (кусочек игры "жизнь") - C (СИ)
Формулировка задачи:
Добрый день, подскажите пожалуйста, где может быть ошибка:
1. если у элемента больше 3х соседей или меньше двух, то он элемент погибает = ' '
2. элемент будет рожден если у него = 3 соседа, т.е = 'x'
3. организм с двумя или тремя соседями будет сохранен.....вот это что-то сложно мне понять((
я передаю матрицу в новую функцию,
копирую ее организмы новую матрицу и делаю пустой
считаю соседей
и делаю условия жизни
в итоге нужно выдать матрицу...
при распечатке сплошные пробелы т.е все умерли, хотя так не должно быть
спасибо! буду рада любому совету
while(1){ print(array, h, w); usleep(200000); next(array, h, w); } return 0; } void print(char array[][10], int h, int w){ //char *ptr = array; int i, j; for (i=0; i<h; ++i) { for (j=0; j<w; ++j) //printf("%c", *(ptr+i*w+j)); printf("%c" , array[i][j]); putchar('\n'); } } char next(char array[][10], int h, int w){ int a, b; int count = 0; char *ptr2 = array; char array2[a][b]; int i, j; for(i=0; i<h; i++){ for(j=0; j<w; j++){ array2[a][b]=array[i][j]; array[i][j] = ' '; } } for(a=0; a<h; a++){ for(b=0; b<w; b++){ if(array2[(a-1+h)%h][b] == 'x') count++; else if(array2[a][(b-1+w)%w] == 'x') count++; else if(array2[(a-1+h)%h][(b-1+w)%w] == 'x') count++; else if(array2[(a+1+h)%h][b] == 'x') count++; else if(array2[a][(b+1+w)%w] == 'x') count++; else if(array2[(a+1+h)%h][(b+1+w)%w] == 'x') count++; else if(array2[(a+1+h)%h][(b-1+w)%w] == 'x') count++; else if (array2[(a-1+h)%h][(b+1+w)%w] == 'x') count++; else if(count < 2 || count > 3) array[a][b] = ' '; else if(count == 3) array[a][b] = 'x'; else if(count == 2 || count == 3) array[a][b] = 'x'; } } return(array[a][b]); }
Решение задачи: «Метод принимающий матрицу и возрващающий новую (кусочек игры "жизнь")»
textual
Листинг программы
#include <stdlib.h> #include <string.h> #include <stdio.h> #include <time.h> #include <unistd.h> #define LIVE 'X' #define DEAD ' ' void print(char *array, int h, int w); int next(char *array, int h, int w); int main(int argc, char *argv[]) { int h; int w; int i, j; int number, posh, posw; if (argc == 3 && atoi(argv[1]) && atoi(argv[2])) { h = atoi(argv[1]); w = atoi(argv[2]); } else if (argc == 1) { h = 10; w = 10; } else return 1; srand( time(NULL)); char array[h][w]; for (i=0; i<h; ++i) for (j=0; j<w; ++j) array[i][j] = DEAD; number = (h * w) / 10; ((h * w) % 10) > 5? ++number: number; while (number) { posh = rand()%(h+1); posw = rand()%(w+1); if ( array[posh][posw] == DEAD) { array[posh][posw] = LIVE; --number; } } i = 1; while (i) { system("clear"); print(&array[0][0], h, w); usleep(400000); i = next(&array[0][0], h, w); } return 0; } void print(char *array, int h, int w) { char *ptr = array; int i, j; for (i=0; i<h; ++i) { for (j=0; j<w; ++j) printf("%c", *(ptr+i*w+j)); putchar('\n'); } } int next(char *array, int h, int w) { char array1[h][w]; char array2[h][w]; int counter; int i, j; int altered = 0; // copy array for (i=0; i<h; ++i) for (j=0; j<w; ++j) array1[i][j] = *(array + i*w +j); // build altered array for (i=0; i<h; ++i) { for (j=0; j<w; ++j) { counter = 0; array2[i][j] = array1[i][j]; if (array1[(i-1+h)%h][(j-1+w)%w] == LIVE && i>0 && j>1) ++counter; if (array1[(i-1+h)%h][j] == LIVE && i>0) ++counter; if (array1[(i-1+h)%h][(j+1+w)%w] == LIVE && i>0 && j<(w-1)) ++counter; if (array1[i][(j-1+w)%w] == LIVE && j>1) ++counter; if (array1[i][(j+1+w)%w] == LIVE && j<(w-1)) ++counter; if (array1[(i+1+h)%h][(j-1+w)%w] == LIVE && i<(h-1) && j>1) ++counter; if (array1[(i+1+h)%h][j] == LIVE && i<(h-1)) ++counter; if (array1[(i+1+h)%h][(j+1+w)%w] == LIVE && i<(h-1) && j<(w-1)) ++counter; if (array1[i][j] == DEAD && counter == 3) { array2[i][j] = LIVE; ++altered; } if (array1[i][j] == LIVE && counter!=2 && counter!=3) { array2[i][j] = DEAD; ++altered; } } } // copy array for (i=0; i<h; ++i) for (j=0; j<w; ++j) *(array + i*w +j) = array2[i][j]; return altered; }
Объяснение кода листинга программы
- Объединение функций
print
иnext
в одном файле. - Объявление переменных
h
,w
,i
,j
,number
,posh
,posw
и их инициализация. - Проверка аргументов командной строки и инициализация значений
h
иw
. - Инициализация матрицы
array
значениемDEAD
. - Генерация случайного числа для определения количества живых клеток, которые нужно добавить в игру.
- Попытка выбрать случайную позицию для живой клетки.
- Увеличение счетчика живых клеток, если выбрана позиция, соответствующая условиям игры
Жизнь
. - Ввод-вывод данных о состоянии игры
Жизнь
с помощью функцииprint
. Сон
в течение 400000 микросекунд (4 секунды) перед переходом к следующей итерации игры.- Уменьшение значения
i
на единицу, чтобы перейти к следующей итерации игры. - Возвращение значения, указывающего, была ли игра
Жизнь
изменена в результате последней итерации. - Функция
next
принимает матрицуarray
,h
иw
в качестве аргументов. - Создание двух копий матрицы
array
для использования в процессе обновления матрицы. - Обход матрицы
array1
для подсчета количества живых клеток в окрестностях каждой клетки матрицыarray2
. - Обновление значений в матрице
array2
в соответствии с правилами игрыЖизнь
. - Обновление значений в матрице
array
с помощью значений из матрицыarray2
. - Возвращение значения, указывающего количество измененных ячеек в матрице
array
.