#include /* fputc(), fflush(), stdout */ #include /* exit() */ #include /* sleep() */ #define ykoko 23 #define xkoko 60 char kentta[xkoko*ykoko+1]= " " " " " " " " " " " # " " # # " " ## ## ## " " # # ## ## " " ## # # ## " " ## # # ## # # " " # # # " " # # " " ## " " " " " " " " " " " " " " " " " " "; int ok(int x, int y) { return (x > 0) && (x < xkoko) && (y > 0) && (y < ykoko); } int elossa(int x, int y) { if (ok(x,y)) { return kentta[x + y * xkoko] & 1; } return 0; } void kuolee(int x, int y) { if (ok(x,y)) { kentta[x + y * xkoko] &= 1; } } void syntyy(int x, int y) { if (ok(x,y)) { kentta[x + y * xkoko] |= ~1; } } int uusi(int x, int y) { if (ok(x,y)) { return (kentta[x + y * xkoko] >> 1)& 1; } return 0; } void seuraava_sukupolvi(x,y) { if (ok(x,y)) { kentta[x + y * xkoko] >>= 1; } } int saanto(int x, int y) { int naapurit; naapurit = elossa(x-1,y-1) + elossa(x ,y-1) + elossa(x+1,y-1) + elossa(x-1,y ) + elossa(x+1,y ) + elossa(x-1,y+1) + elossa(x ,y+1) + elossa(x+1,y+1); if (elossa(x,y)) { if ((naapurit < 2) || (naapurit > 3)) { kuolee(x,y); } } else { if (naapurit == 3) { syntyy(x,y); } } return uusi(x,y); } int alusta_kentta() { int x, y, soluja; soluja = 0; for (y = 0; y < ykoko; y++) { for (x = 0; x < xkoko; x++) { if (elossa(x,y)) { syntyy(x,y); soluja++; } else { kuolee(x,y); } } } return soluja; } int main (int argc, char**argv) { int vanha, soluja, kierros, x, y; soluja = alusta_kentta(); kierros = 0; printf("\n*** Game Of Life ***\n\n\n"); while(soluja) { kierros++; vanha = soluja; for (y = 0; y < ykoko; y++) { for (x = 0; x < xkoko; x++) { fputc(uusi(x,y) ? '#' : ' ', stdout); seuraava_sukupolvi(x,y); } fputc('\n', stdout); } soluja = 0; for (y = 0; y < ykoko; y++) { for (x = 0; x < xkoko; x++) { soluja += saanto(x,y); } } fprintf(stdout,"kierros%4d soluja%4d uusia%4d", kierros, vanha, soluja); fflush(stdout); sleep(1); } printf("\n*** Ei uusia soluja! ***\n"); exit(0); }