#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define A(i,j) a[y*j+i]
#define T(i,j) temp[y*j+i]
#define M(i,j) maske[y*j+i]
void random_array(int *a, int x, int y)                  
{
	int i, j;
	for (i = 0; i < y; i++)
	{
		for (j = 0; j < x; j++)
		{
			A(i,j) = rand() & 1;              
		}
	}
}

void array_anzeigen(int *a, int x, int y)       
{
	int i, j;
	for (i = 0; i < y; i++)
	{
		for (j = 0; j < x; j++)
		{
			printf("%2d", A(i,j));
		}
		printf("\n");
	}
	printf("\n");
}

void neues_array(int *a, int x, int y)
{
	int i, j;
	int *temp = calloc(sizeof*a, x*y);
	int *maske = calloc(sizeof*a, x*y);
	memcpy(temp, a, x*y*sizeof*a);

	for (i = 0; i < y; i++)
	{
		for (j = 0; j < x; j++)
		{
			if (T(i-1,j-1) == 1 && i     > 0 && j     > 0) ++M(i,j);
			if (T(i-0,j-1) == 1 && j     > 0)              ++M(i,j);
			if (T(i-1,j-0) == 1 && i     > 0)              ++M(i,j);
			if (T(i-1,j+1) == 1 && i     > 0 && j + 1 < x) ++M(i,j);
			if (T(i-0,j+1) == 1 && j + 1 < x)              ++M(i,j);
			if (T(i+1,j-0) == 1 && i + 1 < y)              ++M(i,j);
			if (T(i+1,j-1) == 1 && i + 1 < y && j     > 0) ++M(i,j);
			if (T(i+1,j+1) == 1 && i + 1 < y && j + 1 < x) ++M(i,j);

			if (M(i,j) > 3 || M(i,j) < 2)
				A(i,j) = 0;
			else if (M(i,j) == 3)
				A(i,j) = 1;
		}
	}
	free(maske), free(temp);
}

int main()
{
	int runde;
	int x = 20;
	int y = 20;
	int *a = calloc(sizeof*a, x*y);
	srand(time(0));
	random_array(a,x,y);

	for (runde = 1; runde < 5; ++runde, getchar())
	{
		neues_array(a, x, y);
		printf(" Runde %i\n", runde);
		array_anzeigen(a, x, y);
	}

	free(a);
	return 0;
}

