#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
int size, debug;
int compterVoisin(int current[size][size], int i, int j)
{
	int nb = 0;
	
	if(j-1>=0)
	{
		if(current[i][j-1])
			nb++;
		if(current[i+1][j-1] && i+1<=size-1)
			nb++;
		if(current[i-1][j-1] && i-1>=0)
			nb++;
	}
	if(j+1<=size-1)
	{
		if(current[i][j+1])
			nb++;
		if(current[i+1][j+1] && i+1<=size-1)
			nb++;
		if(current[i-1][j+1] && i-1>=0)
			nb++;
	}

	if(current[i+1][j] && i+1<=size-1)
		nb++;
	if(current[i-1][j] && i-1>=0)
		nb++;

	return nb;
}
int main()
{
	int i, j, k, nbTour, mode, random, speed;
	

	printf("Nombre iteration : ");
	scanf("%d", &nbTour);
	printf("Taille de la grille : ");
	scanf("%d", &size);
	printf("\nMode : \n1. Iter par iter\n2. Evolutif\nChoix : ");	
	scanf("%d", &mode);
	printf("\n1. Aleatoire \n2. Fichier (game.txt) \nChoix : ");
	scanf("%d", &random);
	printf("\nDebug ? (1/0) : ");
	scanf("%d", &debug);
	
	int current[size][size];
	int next[size][size];

	if(mode == 2)
	{
		printf("\nVitesse(ms) : ");
		scanf("%d", &speed); 
	}
	

	

	if(random == 2)
	{
		FILE* in;
		in = fopen("game.txt","r");


		for(j=0;j<size;j++)
			for(k=0;k<size;k++)
				next[j][k] = 0;

		fseek(in,0,SEEK_SET);
		for(i=0;i<size;i++)
		{
			for(j=0;j<size;j++)
				fscanf(in,"%d",&current[i][j]);
			fseek(in,1,SEEK_CUR);
		}
		fclose(in);
	}
	else
	{
		srand(time(NULL));
		for(j=0;j<size;j++)
			for(k=0;k<size;k++)
				current[j][k] = (rand()%2)?rand()%2:0;
	}


	for(i=1;i<=nbTour;i++)
	{	
		if(mode == 2)
			system("clear");
		printf("\n--- Iter numero %d ---\n\n",i);
		printf("\nnbIter: %d taille: %dx%d mode : %s type : %s %s\n",nbTour,size,size,(mode==1)?"Iter par iter":"Evolutif",(random ==1)?"Aleatoire":"Fichier", (debug == 1)?"Debug mode actif":"");

		for(j=0, printf("  ");j<size;j++,printf("\n  "))
			for(k=0;k<size;k++)
				(current[j][k])?printf("X "):printf(". ");
		for(j=0;j<size;j++)
			for(k=0;k<size;k++)
			{
				int v = compterVoisin(current,j,k);
				if(debug)
					printf("current[%d][%d] : val = %d, voisins = %d\n",j,k,current[j][k],v);
				if(current[j][k] == 1)
				{
					if(v==2 || v==3)
						next[j][k] = 1; // vie
					else
						next[j][k] = 0; // seule ou surcharge
				}
				else if(v==3)
					next[j][k] = 1; // naissance
				else
					next[j][k] = 0; // reste	
			}

		for(j=0;j<size;j++)
			for(k=0;k<size;k++)
				current[j][k] = next[j][k];
		if(mode == 2)
			usleep(speed*1000);
	}
	return 0;
}
