środa, 3 kwietnia 2013

Processing : gra w życie

Napisałem wizualizację gry w życie Conway'a w Processing.

Kod wygląda tak:
int ileKomorek=40;
int wysKomorki = 8;
int ileStartowych=300;
boolean[][] przed, po;

int ileSasiadow(int i, int j, int rozmiar)
{
  int ile=0;
  int[] xoff = {
    i-1, i, i+1
  };
  int[] yoff = {
    j-1, j, j+1
  };

  for (int ii=0; ii<3; ii++)
  {
    if (xoff[ii] < 0) xoff[ii]+=rozmiar;
    if (yoff[ii] < 0) yoff[ii]+=rozmiar;
    if (xoff[ii] >= rozmiar) xoff[ii]-=rozmiar;
    if (yoff[ii] >= rozmiar) yoff[ii]-=rozmiar;
  }

  for (int x=0; x<3; x++)
    for (int y=0; y<3; y++)
      if (x!=1 || y!=1)
        if (przed[xoff[x]][yoff[y]]) ile++;

  assert(ile>=0 && ile<=8);
  return ile;
}

void setup()
{
  size(ileKomorek*wysKomorki, ileKomorek*wysKomorki);
  background(255);
  przed = new boolean[ileKomorek][ileKomorek];
  po = new boolean[ileKomorek][ileKomorek];

  int i=0;
  while (i<ileStartowych)
  {
    if (!przed[int(random(0, ileKomorek))][int(random(0, ileKomorek))])
    {
      przed[int(random(0, ileKomorek))][int(random(0, ileKomorek))] = true;
      i++;
    }
  }
  fill(204, 102, 0);
  noStroke();
}

void draw()
{
  background(255);
  for (int i=0; i<ileKomorek; i++)
  {
    for (int j=0; j<ileKomorek; j++)
    {
      if (przed[i][j])
      {
        rect(i*wysKomorki, j*wysKomorki, wysKomorki, wysKomorki);
        po[i][j] = (ileSasiadow(i, j, ileKomorek) >=2 && ileSasiadow(i, j, ileKomorek) <= 3);
      }
      else if (ileSasiadow(i, j, ileKomorek) ==3) po[i][j] = true;
    }
  }

  for (int i=0; i<ileKomorek; i++)
    for (int j=0; j<ileKomorek; j++)
      przed[i][j]=po[i][j];
  delay(1000);
}
A teraz wyobraź sobie, że masz to samo napisać w C++ lub czymś jeszcze bardziej niskopoziomowym.
BTW: Przymierzam się do zrobienia implementacji w Haskell

Brak komentarzy:

Prześlij komentarz