Клеточный автомат жизни - C (СИ)
Формулировка задачи:
Нужна ваша помощь.
Необходимо заполнить матрицу 25 на 25 0 и 1. По краям матрицы 0.
0 - мертвая клетка
1 - живая клетка
Если у клеточки 3 живых соседа а сама она в данный момент 0,то в следующей матрице эта клетка уже 1.
Если сама клетка 1 и число соседей 2 и меньше или больше 3,то она становится 0.
все это должно происходить в цикле и пересчитываться при нажатии любой клавиши, кроме Esc.
Вот мой вариант решения.
У меня выводит новую матрицу забитую непонятными значениями. Скажите,пожалуйста, в чем ошибка?
#include<conio.h> #include<stdio.h> #include<stdlib.h> #include<time.h> int main() { int m[25][25],n[25][25]; int i,j,kil=0,s=0;; char ch; while((ch=getch())!=27) { for(int k=0;k<25;k++)//заполнение матрици 25х25 { for(int l=0;l<25;l++) { if(k==0 || l==0 || k==24 || l==24) m[k][l]=0; else m[k][l]=rand()%2; printf("%d ",m[k][l]); } printf("\n"); } printf("\n \n"); for(i=1;i<24;i++) { for(j=1;j<24;j++) { if(m[i-1][j-1]==1) kil++; // ищем живых соседей if(m[i-1][j]==1) kil++; if(m[i-1][j+1]==1) kil++; if(m[i][j+1]==1) kil++; if(m[i][j-1]==1) kil++; if(m[i+1][j-1]==1) kil++; if(m[i+1][j]==1) kil++; if(m[i+1][j+1]==1) kil++; if(i-1==0 || j-1==0 || i+1==24 || j+1==24)// края новой матрици нулями n[i][j]=0; if(m[i][j]==0 && kil==3)//сравнение условий n[i][j]=1; if(m[i][j]==1 && (kil<=2 || kil>3)) n[i][j]=0; kil=0; } } for(i=0;i<25;i++)//вывод новой матрици { for(j=0;j<25;j++) { printf("%d ",n[i][j]); } printf("\n"); } } //_getch(); return 0; }
Решение задачи: «Клеточный автомат жизни»
textual
Листинг программы
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <time.h> #include <Windows.h> #define N 25 void firstStep(int **M) { int i,j; for(i = 0; i<N; i++) M[i][0] = M[i][N-1] = 0; for(j = 1; j<N-1; j++) M[0][j] = M[N-1][j] = 0; for(i = 1; i<N-1; i++) for(j = 1; j<N-1; j++) M[i][j] = rand()%2; } void showMatrix(int **M) { int i,j; for(i = 0; i<N; i++) { for(j = 0; j<N; j++) if(M[i][j]) printf("%c%c", 219, 219); else printf("%c%c", 176, 176); printf("\n"); } printf("\n"); } int cellDestiny(int **M, int i, int j) { int neighbors = -M[i][j], k, m; for(k = i-1; k<=i+1; k++) for(m = j-1; m <= j+1; m++) neighbors += M[k][m]; if(neighbors == 3 || (neighbors == 2 && M[i][j])) return 1; return 0; } void nextStep(int **M) { int i,j; for(i = 1; i<N-1; i++) for(j = 1; j<N-1; j++) M[i][j] = cellDestiny(M, i, j); } int main() { int count = 1, i; char c; srand((unsigned int) time(NULL)); int **M = (int**) malloc(N*sizeof(int*)); for(i = 0; i<N; i++) M[i] = (int*) malloc(N*sizeof(int)); ShowWindow(GetConsoleWindow(), SW_MAXIMIZE); printf("Step %d\n", count++); firstStep(M); showMatrix(M); while((c=getch())!=27) { printf("Step %d\n", count++); nextStep(M); showMatrix(M); } return 0; }
Объяснение кода листинга программы
- Объём памяти для двумерного массива (int **M) выделяется в функции main.
- В функции firstStep устанавливаются начальные значения для всех клеток (каждая клетка имеет два соседних элемента, поэтому их значения устанавливаются равными 0).
- В функции showMatrix выводится на экран содержимое матрицы (каждая ячейка представлена в виде 16х16 символов, окруженных символами
><((
). - В функции cellDestiny определяется судьба клетки на следующем шаге (в зависимости от количества живых соседей).
- В функции nextStep происходит обновление значений клеток на следующем шаге.
- В функции main выполняется цикл, в котором после каждого шага выводится на экран новая конфигурация клеток.
- После завершения цикла управление передаётся функции getch, которая ожидает нажатия клавиши для выхода из программы.
- Значение 27, которое является кодом нажатия клавиши
x
илиX
, является условием для выхода из цикла и завершения программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д