	Autor: Imydes
	Descripció: Joc de la vida
	Data: 21/02/2008
*/	

#include <stdio.h>


/*****************************
 *	      Definicions        *
 ****************************/
#define MAX_COOR 7

/*****************************
 *	        Tipus            *
 *****************************/

typedef int Tterreny[MAX_COOR][MAX_COOR];


/*****************************
 * Capcelera de les funcions *
******************************/

void preparar_terreny(Tterreny &original, Tterreny &temporal);
void inserir_habitants(Tterreny &original);
void mostrar_terreny(Tterreny &original);
int obtenir_generacions(void);
void resoldre_terreny(int generacions, Tterreny &original, Tterreny &temporal);
void copiar_terreny(Tterreny &original,Tterreny &temporal);


int main() {

	int generacions;
	Tterreny original, temporal;

	printf("Introduce los habitantes mediante coordenadas, la tabla es de 5x5\n");

	preparar_terreny(original, temporal);

	inserir_habitants(original);

	mostrar_terreny(original);

	generacions = obtenir_generacions();

	resoldre_terreny(generacions, original, temporal);

	return 0;
}

/* Copiar Terreny */
void copiar_terreny(Tterreny &original,Tterreny &temporal) {
	int fila, col;
	for (fila = 1; fila < MAX_COOR-1;fila++) 
		for (col = 1; col < MAX_COOR-1; col++)
			original[fila][col] = temporal[fila][col];
}

/* Gestió d'habitants del terreny */
void resoldre_terreny(int generacions, Tterreny &original, Tterreny &temporal) {
	int g, fila, col;
	int contador;	
	for(g=0;g<generacions;g++) {
		printf("GENERACION %i\n",g+1);
		for (fila=1;fila<MAX_COOR-1;fila++) {
			for (col=1;col<MAX_COOR-1;col++) {
				contador = 0;
				contador = original[fila-1][col-1]+original[fila-1][col]+original[fila-1][col+1];
				contador = contador+original[fila][col-1]+original[fila][col+1];
				contador = contador+original[fila+1][col-1]+original[fila+1][col]+original[fila+1][col+1];

				/* Decidim si creem o eliminem un habitant */
				
				if (original[fila][col] == 1) {
					if (contador == 2 || contador == 2 ) {
						temporal[fila][col] = 1;
					}
					else {
						temporal[fila][col] = 0;
					}
				}
				else {
					if (contador == 3) temporal[fila][col] = 1;
					else temporal[fila][col] = 0;
				}
				printf("%i",temporal[fila][col]);
			}
			printf("\n");
		}
		copiar_terreny(original,temporal);
	}
}

/* Preparació del terreny */
void preparar_terreny(Tterreny &original, Tterreny &temporal) {
	int fila, col;
	for (fila=0;fila<MAX_COOR;fila++) 
		for (col=0;col<MAX_COOR;col++) {
			original[fila][col] = 0;
			temporal[fila][col] = 0;
		}
}
/* Sistema d'insersió d'habitants */
void inserir_habitants(Tterreny &original) {
	int fila, col;
	do {
		scanf("%i",&fila);
		scanf("%i",&col);

		if (fila > 0 && fila < MAX_COOR-1 && col > 0 && col < MAX_COOR-1) 
			if (original[fila][col] == 1) 
				printf("Ya tienes un habitante en la casilla %i:%i\n",fila,col);
			else
				original[fila][col] = 1;
		else
			if (fila != 0 || col != 0) printf("El terreno es de 1x5 x 1x5\n");
	}while(fila != 0 || col != 0);
}

/* Obtenim el nombre de generacions */
int obtenir_generacions(void) {

	int generacions;
	printf("Dime el numero de generacions que quieres que haga (valor positivo)\n");

	do { 
		scanf("%i",&generacions);
		printf("\n");
	}while(generacions < 1);
	return generacions;
}

/* Mostrem el terreny amb els habitants */
void mostrar_terreny(Tterreny &original) {

	int fila, col;

	for (fila=1;fila<MAX_COOR-1;fila++) {
		for (col=1;col<MAX_COOR-1;col++)
			printf("%i",original[fila][col]);
		printf("\n");
	}
}