Advertisement
ViniciusArruda

Two-Dimensional cellular automaton

Dec 18th, 2014
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.01 KB | None | 0 0
  1. /*
  2.  * Made by: Vinicius Arruda
  3.  * E-mail: vinicius_farruda@hotmail.com
  4.  * Blog: csvacation.wordpress.com
  5.  */
  6.  
  7. #include<stdio.h>
  8. #include<stdlib.h>
  9.  
  10. #ifdef _WIN32
  11.     #define CLEAR "cls"
  12. #else
  13.     #define CLEAR "clear"
  14. #endif
  15.  
  16. int TAM;
  17.  
  18. /* Prints the grid */
  19. void imprime(char** board)
  20. {
  21.     int i, j;
  22.     for(i=0;i<TAM;i++)
  23.     {
  24.         printf("\n");
  25.         for(j=0;j<TAM;j++)
  26.         {
  27.             printf(" %c", board[i][j]);
  28.         }
  29.     }
  30.     printf("\n\n");
  31. }
  32.  
  33.  
  34. int limite(int x, int b)
  35. {
  36.     if(b)
  37.         if(x==(TAM-1))
  38.             return 0;
  39.         else
  40.             return x+1;
  41.     else
  42.         if(x==0)
  43.             return (TAM-1);
  44.         else
  45.             return x-1;
  46. }
  47.  
  48.  
  49. int conta_vivo(char** board, int i, int j)
  50. {
  51.     int vivo = 0;
  52.  
  53.     if(board[limite(i,0)][limite(j,0)] == '0' || board[limite(i,0)][limite(j,0)] == '2')
  54.         vivo++;
  55.     if(board[limite(i,0)][j] == '0' || board[limite(i,0)][j] == '2')
  56.         vivo++;
  57.     if(board[limite(i,0)][limite(j,1)] == '0' || board[limite(i,0)][limite(j,1)] == '2')
  58.         vivo++;
  59.     if(board[i][limite(j,0)] == '0' || board[i][limite(j,0)] == '2')
  60.         vivo++;
  61.     if(board[i][limite(j,1)] == '0' || board[i][limite(j,1)] == '2')
  62.         vivo++;
  63.     if(board[limite(i,1)][limite(j,0)] == '0' || board[limite(i,1)][limite(j,0)] == '2')
  64.         vivo++;
  65.     if(board[limite(i,1)][j] == '0' || board[limite(i,1)][j] == '2')
  66.         vivo++;
  67.     if(board[limite(i,1)][limite(j,1)] == '0' || board[limite(i,1)][limite(j,1)] == '2')
  68.         vivo++;
  69.    
  70.     return vivo;
  71. }
  72.  
  73.  
  74. void nasce(char** board, int i, int j, int *f)
  75. {
  76.     if(conta_vivo(board, i, j) == 3)
  77.     {
  78.         board[i][j] = '3';
  79.         *f = 1;
  80.     }
  81. }
  82.  
  83.  
  84. void morre(char** board, int i, int j, int *f)
  85. {
  86.     if(conta_vivo(board, i, j)<2 || conta_vivo(board, i, j)>3)
  87.     {
  88.         board[i][j] = '2';
  89.         *f = 1;
  90.     }
  91. }
  92.  
  93.  
  94. void atualiza(char** board)
  95. {
  96.     int i, j;
  97.     for(i=0; i<TAM; i++)
  98.         for(j=0;j<TAM;j++)
  99.         {
  100.             if(board[i][j] == '2')
  101.                 board[i][j] = '-';      
  102.             if(board[i][j] == '3')
  103.                 board[i][j] = '0';
  104.         }
  105. }
  106.  
  107.  
  108. void pausa(void)
  109. {
  110.     int i;
  111.     for(i=0;i<100000000;i++);
  112.  
  113. }
  114.  
  115.  
  116. int arquivo(char** board, char *file)
  117. {
  118.     int i, j;
  119.     FILE *arquiv;
  120.            
  121.     if( (arquiv = fopen(file, "r") ) == NULL)
  122.     {
  123.         printf("Error opening the file !\n");
  124.         return(1);
  125.     }
  126.    
  127.    
  128.     for(i=0; i<TAM; i++)                
  129.     {
  130.         for(j=0; j<TAM; j++)
  131.             board[i][j] = (char) getc(arquiv);
  132.         getc(arquiv);
  133.     }
  134.    
  135.     fclose(arquiv);
  136.     return 0;
  137. }
  138.  
  139.  
  140.  
  141. int main(int argc, char **argv)
  142. {
  143.     int i, j, flag;
  144.     char** board;
  145.    
  146.     if(argc < 3)
  147.     {
  148.         printf("Usage: ./%s NameOfFileStartGrid.txt GridDimension.\n", argv[0]);
  149.         return(1);
  150.     }
  151.    
  152.     TAM = atoi(argv[2]);
  153.    
  154.     board = malloc((unsigned int) TAM * sizeof(char*));
  155.     for(i = 0; i < TAM; i++)
  156.         board[i] = malloc((unsigned int) TAM * sizeof(char));
  157.    
  158.     arquivo(board, argv[1]);
  159.  
  160.     flag = 1;
  161.  
  162.     while(flag==1)
  163.     {
  164.         pausa();       
  165.        
  166.         system(CLEAR);
  167.            
  168.         imprime(board);
  169.  
  170.         flag = 0;
  171.    
  172.         for(i=0; i<TAM; i++)
  173.             for(j=0;j<TAM;j++)
  174.             {
  175.                 if(board[i][j] == '-')
  176.                     nasce(board, i, j, &flag);     
  177.                 else if(board[i][j] == '0')
  178.                     morre(board, i, j, &flag);
  179.             }
  180.         atualiza(board);
  181.     }
  182.     free(board);
  183.    
  184.     return 0;
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement