/*
To compile: gcc -lcurses -o life life.c
*/

#include <ncurses.h>
#include <stdlib.h>
#include <time.h>

int main() {

	initscr();

	int i, j, n, mi, mj ;

	const int ni = LINES-1 ;
	const int nj = COLS-1 ;
	const int nl = 100000 ;

	char a[ni][nj], b[ni][nj] ;

	srand(time(0)) ;

	for( i = 0 ; i < ni ; i++ )
		for( j = 0 ; j < nj ; j++ ) 
			if( rand() > (RAND_MAX/2) )
				a[i][j] = 1 ;
			else
				a[i][j] = 0 ;

	box( stdscr, '|', '-' ) ;
	refresh() ;

	for( n = 0 ; n < nl ; n++ ) {

		for( i = 0 ; i < ni ; i++ )
			for( j = 0 ; j < nj ; j++ ) {
				if( a[i][j] )
					mvprintw( i, j, "0" ) ;
				else
					mvprintw( i, j, " " ) ;

				int neigh = 0 ;
				for( mi = -1 ; mi <=1 ; mi++ )
					for( mj =-1 ; mj <=1 ; mj++ ) {
						if( mi == 0 && mj == 0 ) continue ;
						if( mi+i < 0 || mi+i >= ni ) continue ;
						if( mj+j < 0 || mj+j >= nj ) continue ;
						if( a[mi+i][mj+j] ) neigh++ ;
					}

				if( a[i][j] )
					if( neigh == 2 || neigh == 3 ) b[i][j] = 1 ; else b[i][j] = 0 ;
				else
					if( neigh == 3 ) b[i][j] = 1 ; else b[i][j] = 0 ;

			}

		refresh();

		for( i = 0 ; i < ni ; i++ )
			for( j = 0 ; j < nj ; j++ )
				a[i][j] = b[i][j] ;

	}

	endwin();
	return 0;
}


