#include<Python.h>
#include<fstream>
#include<stdlib.h>
#include<time.h>
using namespace std;

const int dimx = 101, dimy = 101, N = 100;
const double seuil = 0.8;

void initialisation(int** m) {
  int i, j;
  for (i = 0; i < dimy; i++)
    for (j = 0; j < dimx; j++)
      if (drand48() >= seuil) m[i][j] = 1;
      else m[i][j] = 0;
}

int nombre_voisins(int** m, int i0, int j0) {
  int i, j, s = 0;
  for (i = i0-1; i <= i0+1; i++)
    for (j = j0-1; j <= j0+1; j++)
      if (!(i == i0 && j == j0))
	s += m[(i+dimy)%dimy][(j+dimx)%dimx];
  return s;
}

void applique_regles(int** m, int** m1) {
  int i, j, s;
  for (i = 0; i < dimy; i++)
    for (j = 0; j < dimx; j++) {
      s = nombre_voisins(m,i,j);
      if (s == 3) m1[i][j] = 1;
      else if (s == 2) m1[i][j] = m[i][j];
      else m1[i][j] = 0;
    }
}

int main() {
  int i, j, k;
  int** m, ** m1;
  fstream fich;
  srand48(time(NULL));
  m = (int**)malloc(dimy * sizeof(int*));
  for (i = 0; i < dimy; i++)
    m[i] = (int*)malloc(dimx * sizeof(int));
  m1 = (int**)malloc(dimy * sizeof(int*));
  for (i = 0; i < dimy; i++)
    m1[i] = (int*)malloc(dimx * sizeof(int));
  Py_Initialize();
  PyRun_SimpleString("from numpy import *");
  PyRun_SimpleString("from matplotlib.pyplot import *");
  PyRun_SimpleString("ion()");
  PyRun_SimpleString("fig=figure()");
  for (k = 0; k < N; k++) {
    if (k == 0)
      initialisation(m);
    else {
      applique_regles(m, m1);
      for (i = 0; i < dimy; i++)
	for (j = 0; j < dimx; j++)
	  m[i][j] = m1[i][j];
    }
    fich.open("jeu.dat", ios::out);
    for (i = 0; i < dimy; i++) {
      for (j = 0; j < dimx; j++)
	fich << m[i][j] << " ";
      fich << endl;
    }
    fich.close();
    PyRun_SimpleString("A=loadtxt('jeu.dat')");
    PyRun_SimpleString("clf()");
    PyRun_SimpleString("imshow(A,cmap=cm.Purples)");
    PyRun_SimpleString("fig.canvas.draw()");
    PyRun_SimpleString("pause(0.3)");    
  }
  Py_Finalize();
  for (i = 0; i < dimy; i++) {
    free(m[i]); free(m1[i]);
  }
  free(m); free(m1);
  return 0;
}
