Клеточный автомат жизни - 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;
}

Объяснение кода листинга программы

  1. Объём памяти для двумерного массива (int **M) выделяется в функции main.
  2. В функции firstStep устанавливаются начальные значения для всех клеток (каждая клетка имеет два соседних элемента, поэтому их значения устанавливаются равными 0).
  3. В функции showMatrix выводится на экран содержимое матрицы (каждая ячейка представлена в виде 16х16 символов, окруженных символами ><(().
  4. В функции cellDestiny определяется судьба клетки на следующем шаге (в зависимости от количества живых соседей).
  5. В функции nextStep происходит обновление значений клеток на следующем шаге.
  6. В функции main выполняется цикл, в котором после каждого шага выводится на экран новая конфигурация клеток.
  7. После завершения цикла управление передаётся функции getch, которая ожидает нажатия клавиши для выхода из программы.
  8. Значение 27, которое является кодом нажатия клавиши x или X, является условием для выхода из цикла и завершения программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы