#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define DEAD 0
#define ALIVE 1
#define MAX 40
typedef unsigned char unchar;
unchar curr[MAX]={DEAD}; //Keeping current generation
unchar next[MAX]={DEAD}; //Keeping next generation

int initialization       (unchar curr[]);
int countNeighbors       (unchar curr[]  ,int pos);
int countAlives          (unchar curr[]  ,int len);
void nextGeneration      (unchar curr[]  ,unchar next[],int len);
void copyArrays          (unchar curr[]  ,unchar next[],int len);
void display             (unchar arr[], int len);

int main()
{int i,pos;
int Count_Neighbors,numStillAlives;
int numAlives; //A number of alive cells in cur[]
int numLoops; //A number of loops

numAlives = initialization(curr);   //Initializing the first generation

for(i=0;i<MAX;i++)        ///////////////////////////////
  printf("%d",curr[i]);  //Display the first generation//
                         ////////////////////////////////
printf("\n");
printf("Plz Insert Pos = ");scanf("%d",&pos);      //////////////////////////////////////
Count_Neighbors = countNeighbors(curr,pos);        ////                              ////  
printf("Count_Neighbors = %d\n",Count_Neighbors);  //////////////////////////////////////



nextGeneration(curr,next,MAX);
                                                   ////////////////////////////////////// 
numStillAlives =  countAlives(next,MAX);           //// Sent and Recieve CountAlives ////
printf("numStillAlives = %d\n",numStillAlives);    ////      print CountAlives       ////
                                                   //////////////////////////////////////
                                                   
                                                   
copyArrays(curr,next,MAX);
display(curr,MAX);

getchar();                     
getchar();
return 0;
}

///////////////////////////////////////////////////////////////////////////////
int initialization(unchar curr[])
{int i;
 int numAlives=0;
   srand(time(NULL));    ///////////////////////////
 for(i=0;i<MAX;i++)      ////                   ////
  {                      ////Random 0,1 to Curr ////
   curr[i] = rand()%2;   ////                   ////
  }                      ///////////////////////////
for(i=0;i<MAX;i++)       ///////////////////////////
  if(curr[i] ==ALIVE)    ////  Count Numalives  ////
    numAlives++;         ///////////////////////////  
printf("NumAlives = %d\n",numAlives);


return numAlives;
}
///////////////////////////////////////////////////////////////////////////////
int countNeighbors(unchar curr[],int pos)
{
 int i;

 int CountForward[MAX],CountBackward[MAX],SumCount[MAX];

 for(i=0;i<MAX;i++)
 {  
      CountForward[i]= 0;  //////////////////////
      if(curr[i+1]==ALIVE) ////              ////
        CountForward[i]++; //// CountForward ////
      if(curr[i+2]==ALIVE) ////              ////
        CountForward[i]++; //////////////////////
        
      CountBackward[i]=0;  //////////////////////
      if(curr[i-1]==ALIVE) ////              ////
        CountBackward[i]++;//// CountBackward//// 
      if(curr[i-2]==ALIVE) ////              ////     
        CountBackward[i]++;////////////////////// 
                                                     ///////////////////////// 
 SumCount[i] = CountForward[i] + CountBackward[i] ;  //// Count Neighbors ////
                                                     /////////////////////////
 }
/* printf("\n");          
 for(i=0;i<MAX;i++)
  printf("curr[%d]=%d+%d=%d\n",i,CountForward[i],CountBackward[i],SumCount[i]);
 */
   
return SumCount[pos];
}
///////////////////////////////////////////////////////////////////////////////
int countAlives(unchar curr[]  ,int len)
{ int numStillAlives=0;
  int i;  
  for(i=0;i<MAX;i++)          ////////////////////////////////////
     if(curr[i]==ALIVE)       ////   Count Alive in Current   //// 
        numStillAlives++;     ////////////////////////////////////   
  
 return numStillAlives;   
}
//////////////////////////////////////////////////////////////////////////////
void nextGeneration      (unchar curr[]  ,unchar next[],int len)
{ 
 int i;
 int CountForward[MAX],CountBackward[MAX],SumCount[MAX];

 for(i=0;i<len;i++)
   {  
      CountForward[i]= 0;                       /////////////////////////
      if(curr[i+1]==ALIVE)                      ////                 ////  
        CountForward[i]++;                      ////                 ////            
      if(curr[i+2]==ALIVE)                      ////                 ////              
        CountForward[i]++;                      ////                 ////                                   
                                                ////                 //// 
      CountBackward[i]=0;                       ////                 ////
      if(curr[i-1]==ALIVE)                      ////                 ////           
        CountBackward[i]++;                     ////                 ////     
      if(curr[i-2]==ALIVE)                      ////                 ////     
        CountBackward[i]++;                     //// Count Neighbors ////                                                                        
                                                ////                 ////                         
 SumCount[i] = CountForward[i]  +               ////                 ////
               CountBackward[i] ;               /////////////////////////
   }////end for
  
for(i=0;i<len;i++)                              ////////////////////////////////
   {  if (SumCount[i] == 2 || SumCount[i] == 4) ////  if neighbors = 2,4    ////  
         next[i] = ALIVE ;                      ////    Next Generation     ////  
          printf("%d",next[i]);                 ////      will Alive        ////
    }                                           ////////////////////////////////
    printf("\n");
}//end function
//////////////////////////////////////////////////////////////////////////////
void copyArrays(unchar curr[]  ,unchar next[],int len)
{  int i;
     for(i=0;i<len;i++)
       curr[i] = next[i] ;
 }
//////////////////////////////////////////////////////////////////////////////
void display(unchar curr[], int len)
{  int i;
      for(i=0;i<len;i++)
    printf("%d",curr[i]);
 }
//////////////////////////////////////////////////////////////////////////////
