diff --git a/GameOfLife.c b/GameOfLife.c
index 1efaec057ac72d5713781b832b17cc39ec5bb245..8ca80440942135dc2a840db1cfd125483f05030b 100644
--- a/GameOfLife.c
+++ b/GameOfLife.c
@@ -3,7 +3,7 @@
 #include <string.h>
 
 typedef struct Generation {
-	int **board;
+	int **generation;
 	int rows;
 	int cols;
 } generation_t;
@@ -15,11 +15,22 @@ typedef struct Game {
 	int totalGenerations;
 } game_t;
 
-void startGame (game_t *game, char **argv);
-void defineSizes (game_t *game, char **argv);
-void memmoryAlloc (game_t *game);
-void firstGeneration (game_t *game);
-void playGame (game_t *game);
+#define ALIVE 1
+#define DEAD 0
+
+void startGame            (game_t *game, char **argv);
+void defineSizes          (game_t *game, char **argv);
+void memoryAlloc          (game_t *game);
+void firstGeneration      (game_t *game);
+int  testSize             (game_t *game, int x, int y);
+void playGame             (game_t *game);
+void printGeneration      (game_t *game);
+void nextCellStatus       (game_t *game, int x, int y);
+int checkNeighbors        (game_t *game, int x, int y);
+void createLife           (game_t *game, int x, int y);
+void keepStatus           (game_t *game, int x, int y);
+void killCell             (game_t *game, int x, int y);
+void incrementGeneration  (game_t *game);
 
 int main (int argc, char **argv)
 {
@@ -29,8 +40,7 @@ int main (int argc, char **argv)
 	{
 		startGame (&game, argv);
 
-		if ( !firstGeneration (&game) )
-			return 2;
+		firstGeneration (&game);
 
 		playGame (&game);
 
@@ -46,7 +56,9 @@ void startGame (game_t *game, char **argv)
 {
 	defineSizes (game, argv);
 
-	memmoryAlloc (game);
+	memoryAlloc (game);
+
+	game->generationNumber = 1;
 
 	printf ("How many generations do you want to simulate?\n");
 	scanf ("%d", &game->totalGenerations);	
@@ -63,29 +75,30 @@ void defineSizes (game_t *game, char **argv)
 	game->this.cols = cols;
 
 	game->next.rows = rows;
-	game->next.rows = rows;
+	game->next.cols = cols;
 }
 
-void memmoryAlloc (game_t *game)
+/* Allocate the generations matrices with all cells DEAD (0). */
+void memoryAlloc (game_t *game)
 {
 	int i;
 
-	game->this.board = (int**) calloc ( game->this.rows, sizeof (int*) );
+	game->this.generation = (int**) calloc ( game->this.rows, sizeof (int*) );
 
 	for ( i=0; i < game->this.rows; i++ )
-		game->this.board[i] = (int *) calloc ( game->this.cols, sizeof (int) );
+		game->this.generation[i] = (int *) calloc ( game->this.cols, sizeof (int) );
 
 
-	game->next.board = (int**) calloc ( game->next.rows, sizeof (int*) );
+	game->next.generation = (int**) calloc ( game->next.rows, sizeof (int*) );
 
 	for ( i=0; i < game->next.rows; i++ )
-		game->next.board[i] = (int *) calloc ( game->next.cols, sizeof (int) );
+		game->next.generation[i] = (int *) calloc ( game->next.cols, sizeof (int) );
 }	
 
 
 void firstGeneration (game_t *game)
 {
-	int i, alive, x, y;
+	int alive, x, y, i=0;
 
 	printf ("\n");
 	printf ("How many alive cells do you want in the first generation?\n");
@@ -94,23 +107,120 @@ void firstGeneration (game_t *game)
 	printf ("\n");
 	printf ("Put the coordinates of the cells you want alive on the first generation:\n");
 
-	for ( i=0; i < alive; i++ )
+	while ( i < alive )
 	{
-		printf ("Cell [%d]: ", i+1);
+		printf ("Cell [%d]: ", i);
 		scanf ("%d %d", &x, &y);
-		x--;
-		y--;
 
 		if ( testSize (game, x, y) )
-			createLife (game);
+		{
+			game->this.generation[x][y] = ALIVE;
+			i++;
+		}
 
 		else
 			printf ("Invalid coordinates.\n");
 	}
 }
 
+int testSize (game_t *game, int x, int y)
+{
+	if ( (x < 0) || (y < 0) || (x >= game->this.rows) || (y >= game->this.cols) )
+		return 0;
+
+	return 1;
+}
+
+
 void playGame (game_t *game)
 {
+	int i, j;
+
+	printGeneration (game);
+
+	while (game->generationNumber < game->totalGenerations)
+	{
+		for ( i=0; i < game->this.rows; i++ )
+			for ( j=0; j < game->this.cols; j++ )
+				nextCellStatus (game, i, j);					
+
+		incrementGeneration (game);
+
+		printGeneration (game);
+	}
+}
+
+void printGeneration (game_t *game)
+{
+	int i, j;
+
+	printf ("\n"); /*clrs*/
+
+	for ( i=0; i < game->this.rows; i++ )
+	{
+		for ( j=0; j < game->this.cols; j++ )
+			printf ("%d ", game->this.generation[i][j]);
+		printf ("\n");
+	}
+}
+
+void nextCellStatus (game_t *game, int x, int y)
+{
+	switch ( checkNeighbors (game, x, y) )
+	{
+		case 3:
+			createLife (game, x, y);
+			break;
+
+		case 2:
+			keepStatus (game, x, y);
+			break;
+
+		default:
+			killCell (game, x, y);
+	}
+}
+
+/* ------------- Here is the jump of the cat --------------*/
+int checkNeighbors (game_t *game, int x, int y)
+{
+	int i, j, aliveCellCount = 0;
+
+	printf ("bruh\n");
+
+	for ( i=-1; i <= 1; i++ )
+		for ( j=-1; j <= 1; j++ )
+			if ( !( (x+i < 0) || (y+j < 0) || (x+i > game->this.rows) || (y+j > game->this.cols) ) )
+				if ( (x!=0) || (y!=0) )
+					if ( game->this.generation[x+i][y+j] == 1 )
+						aliveCellCount++;
+
+	return aliveCellCount;
+}
+
+void createLife (game_t *game, int x, int y)
+{
+	game->next.generation[x][y] = ALIVE;
+}
+
+void keepStatus (game_t *game, int x, int y)
+{
+	game->next.generation[x][y] = game->this.generation[x][y];
+}
+
+void killCell (game_t *game, int x, int y)
+{
+	game->next.generation[x][y] = DEAD;
+}
+
+void incrementGeneration (game_t *game)
+{
+	int i, j;
+
+	for ( i=0; i < game->next.rows; i++ )
+			for ( j=0; j < game->next.cols; j++ )
+				game->this.generation[i][j] = game->next.generation[i][j];
 
+	game->generationNumber++;
 }