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