initial commit
This commit is contained in:
		
							
								
								
									
										92
									
								
								gol.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								gol.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,92 @@
 | 
				
			|||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LEN_X 60
 | 
				
			||||||
 | 
					#define LEN_Y 20
 | 
				
			||||||
 | 
					#define PRINT_N 0
 | 
				
			||||||
 | 
					#define CELL_CHAR "*"
 | 
				
			||||||
 | 
					#define R_FACT 10
 | 
				
			||||||
 | 
					#define SLEEP 300
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int generation;
 | 
				
			||||||
 | 
					int m[LEN_X][LEN_Y];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void clear() { printf("\e[1;1H\e[2J"); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void put_world() {
 | 
				
			||||||
 | 
					  clear();
 | 
				
			||||||
 | 
					  printf("A GAME OF LIFE: #%i\n", generation);
 | 
				
			||||||
 | 
					  putchar('+');
 | 
				
			||||||
 | 
					  for (int sep = 0; sep < LEN_X; sep++) putchar('-');
 | 
				
			||||||
 | 
					  printf("+\n");
 | 
				
			||||||
 | 
					  for (int y = 0; y < LEN_Y; y++) {
 | 
				
			||||||
 | 
					    putchar('|');
 | 
				
			||||||
 | 
					    for (int x = 0; x < LEN_X; x++)
 | 
				
			||||||
 | 
					      if (m[x][y] > 0)
 | 
				
			||||||
 | 
					        if(PRINT_N) printf("%i", m[x][y]);
 | 
				
			||||||
 | 
					        else printf("%s", CELL_CHAR);
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        putchar(' ');
 | 
				
			||||||
 | 
					    printf("|\n");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  putchar('+');
 | 
				
			||||||
 | 
					  for (int sep = 0; sep < LEN_X; sep++) putchar('-');
 | 
				
			||||||
 | 
					  printf("+\n");
 | 
				
			||||||
 | 
					  usleep(10000 * SLEEP);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void next_gen() {
 | 
				
			||||||
 | 
					  int m_ngen[LEN_X][LEN_Y];
 | 
				
			||||||
 | 
					  for (int x = 0; x < LEN_X; x++) {
 | 
				
			||||||
 | 
					    for (int y = 0; y < LEN_Y; y++) {
 | 
				
			||||||
 | 
					      int n = 0;
 | 
				
			||||||
 | 
					      if (y > 0 && m[x][y - 1] > 0) n++; // n
 | 
				
			||||||
 | 
					      if (x < LEN_X && y > 0 && m[x + 1][y - 1] > 0) n++; // ne
 | 
				
			||||||
 | 
					      if (x < LEN_X && m[x + 1][y] > 0) n++; // e
 | 
				
			||||||
 | 
					      if (x > 0 && y < LEN_Y && m[x - 1][y + 1] > 0) n++; // se
 | 
				
			||||||
 | 
					      if (y < LEN_Y && m[x][y + 1] > 0) n++; // s
 | 
				
			||||||
 | 
					      if (y < LEN_Y && x < LEN_X && m[x + 1][y + 1] > 0) n++; // sw
 | 
				
			||||||
 | 
					      if (x > 0 && m[x - 1][y] > 0) n++; // w
 | 
				
			||||||
 | 
					      if (x > 0 && y > 0 && m[x - 1][y - 1] > 0) n++; // nw
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (m[x][y] > 0) 
 | 
				
			||||||
 | 
					        m_ngen[x][y] = (n < 2 || n > 3) ? 0 : n;
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        m_ngen[x][y] = (n == 3) ? n : 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  memcpy(m, m_ngen, sizeof(m_ngen));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void randomize(int fact) {
 | 
				
			||||||
 | 
					  srand(time(NULL));
 | 
				
			||||||
 | 
					  for (int x = 0; x <= LEN_X; x++) {
 | 
				
			||||||
 | 
					    for (int y = 0; y <= LEN_Y; y++) {
 | 
				
			||||||
 | 
					      int r = rand() % fact;
 | 
				
			||||||
 | 
					      m[x][y] = (r == 1) ? 1 : 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void init_world() {
 | 
				
			||||||
 | 
					  clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  randomize(R_FACT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* int maxgens = 2000; */
 | 
				
			||||||
 | 
					  generation = 1;
 | 
				
			||||||
 | 
					  /* while (generation <= maxgens) { */
 | 
				
			||||||
 | 
					  while (1) {
 | 
				
			||||||
 | 
					    put_world();
 | 
				
			||||||
 | 
					    next_gen();
 | 
				
			||||||
 | 
					    generation++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main() {
 | 
				
			||||||
 | 
					  init_world();
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user