Cellulära automater och en implementering av Conways spelet i livet (7 / 11 steg)
Steg 7: uppdatering
Detta steg gäller regeln om övergången till varje cell av intressen. Innan jag tar upp denna konstruktion, är det viktigt att ta itu med de två lagrarna av döda celler runt den huvudsakliga konfigurationen. Dessa celler kan automat att utöka vid behov. Normalt, utvecklas en cellulär automat i Conway's Game of Life på en oändlig rutnät. dock är det mer praktiskt att representera detta rutnät i en finite virtuella behållare (t.ex. en vektor). Denna förändring nödvändiggör en "buffert lager" av döda celler som möjliggör expansion av automat. Så, vi ska kolla alla celler i rutnätet inklusive innersta buffert lager (kom ihåg, det yttersta buffer lagret skulle bestå av celler vars stadsdelar har noll levande celler, så att de förblir döda och behöver inte beaktas). I huvudet på funktionen skulle se ut så här (jag har döpt den funktion updateVec).
vektor < vector > updateVec (vector < vektor > rutnät)
I huvudsak funktionen fungerar genom att skapa en ny 2-dimensionell vektor och fylla cellerna med korrekta värden uppdaterade celler från rutnätet ursprungliga. Segmentet hela koden skulle likna följande.
vektor < vector > updateVec (vector < vektor > rutnät)
{
int size=grid.size();
vektor < vector > newgrid (storlek, vektor(storlek));
int c1 = 1;
int c2 = 1;
medan (c1
{
medan (c2
{
int sum_neighborhood = rutnät [c1 + 1] [c2] + rutnät [c1] [c2 + 1] + rutnät [c1 + 1] [c2 + 1] + rutnät [c1-1] [c2-1].
sum_neighborhood += rutnät [c1-1] [c2] + rutnät [c1] [c2-1] + rutnät [c1 + 1] [c2-1] + rutnät [c1-1] [c2 + 1];
om (grid [c1] [c2] == 0 & & sum_neighborhood == 3)
newgrid [c1] [c2] = 1;
annars om (grid [c1] [c2] == 0 & & sum_neighborhood! = 3)
newgrid [c1] [c2] = 0;
annars om (grid [c1] [c2] == 1 & &(sum_neighborhood==2|| sum_neighborhood == 3))
newgrid [c1] [c2] = 1;
annars om (grid [c1] [c2] == 1 & & (sum_neighborhood! = 2 & & sum_neighborhood! = 3))
newgrid [c1] [c2] = 0;
C2 ++;
}
C2 = 1;
C1 ++;
}
återvända newgrid;
}
Observera att initieringen av sum_neighborhood ägde rum över två linjer på grund av rumsliga begränsningar. Iterationen började vid 1 och slutade innan storlek-2 för att undvika slöseri med tid att kontrollera det yttersta buffer lagret.