среда, 20 января 2016 г.

Игра "Жизнь" на Си. Из массивов.



Когда я начал изучать программирование, мой преподаватель предложил выполнить достаточно интересное задание. Написать игру «Жизнь» Правила игры описаны в вики
Тогда я еще не знал, что есть целый мир «клеточных автоматов» и насколько серьезными могут быть интересными исследования в этих областях.
На момент формулировки задания мы знали только условия, циклы, массивы и функции на СИ. Сейчас даже с таким ограниченным инструментарием я такой не красивый код не написал бы. Однако, как выполнение задания для начинающего изучение программирование мне это зачлось.
Далее комментарии будут в коде.

#include <stdio.h>
#include <stdlib.h>

//Задаем размеры поля и количество поколений
#define W 35
#define H 75
#define G 200

//три функции ниже, ищут соседей у каждой клетки. Игровое поле представляет из себя некий тор. Т.е. Сосед крайнего элемента справа, будет элемент с индексом 0, а для нулевого с индексов (W-1), тоже самое для верхних и нижних. Идет подсчет живых клеток и выполняются правила игры. В main реализован обход каждой клетки поля и вызов функции для вычисления ее состояния в следующем игровом поколении.

int roundx (int i, int k)
{
    i+=k;
    if (i>=W) i-=W;
    if (i<0) i+=W;
    return i;
}
int roundy (int j, int l)
{
    j+=l;
    if (j>=H) j-=H;
    if (j<0) j+=H;
    return j;
}
int findnb (int M[W][H], int i, int j)
{
int k,l,counter=0;
   for (k=-1;k<=1;k++)
            {
            for (l=-1;l<=1;l++)
            if (k || l)
              if(M[roundx(i,k)][roundy(j,l)]!=0) counter++;
            }
    return counter;
}



int main()

{
int M[W][H],N[W][H],i,j,k,q;
//First generation
for (i=0;i<W;i++)
    {
    for (j=0;j<H;j++)
        {
         M[i][j]=0;
        }
    }


//calculation
// Перед началом расчетов нужно было инициализировать исходный массив. Изначально он заполняется нулями, что показывает "мертвые" клетки. Нужно добавить несколько живых, чтобы игра начала работать. Это могут быть случайные клетки, либо известные науке конфигурация, планер, мигалка или планерное ружье. Ниже приведена ручная инициализация планерного ружья.
M[6][1]=1;
M[6][2]=1;
M[7][1]=1;
M[7][2]=1;
M[5][12]=1;
M[6][12]=1;
M[7][12]=1;
M[4][13]=1;
M[8][13]=1;
M[3][14]=1;
M[9][14]=1;
M[4][15]=1;
M[8][15]=1;
M[5][16]=1;
M[6][16]=1;
M[7][16]=1;
M[5][17]=1;
M[6][17]=1;
M[7][17]=1;
M[3][22]=1;
M[4][22]=1;
M[5][22]=1;
M[2][23]=1;
M[3][23]=1;
M[5][23]=1;
M[6][23]=1;
M[2][24]=1;
M[3][24]=1;
M[5][24]=1;
M[6][24]=1;
M[2][25]=1;
M[3][25]=1;
M[4][25]=1;
M[5][25]=1;
M[6][25]=1;
M[1][26]=1;
M[2][26]=1;
M[6][26]=1;
M[7][26]=1;
M[5][31]=1;
M[6][31]=1;
M[3][35]=1;
M[4][35]=1;
M[3][36]=1;
M[4][36]=1;

for (k=0;k<G;k++)
{
for (i=0;i<W;i++)
    {
    for (j=0;j<H;j++)
        {
        q=findnb(M,i,j);
        if (q!=3&&M[i][j]==0)N[i][j]=0;
        else if (q<2&&M[i][j]!=0)N[i][j]=0;
        else if (q>3&&M[i][j]!=0)N[i][j]=0;
        else N[i][j]=1;
        if (M[i][j]==1) printf("*");
            else printf(" ");
        }
           printf("\n");
    }
    system("cls");
    for (i=0;i<W;i++)
    {
    for (j=0;j<H;j++)
        {
         M[i][j]=N[i][j];
        }
    }
}
    return 0;
}
               

Комментариев нет:

Отправить комментарий