puftrain
Game of Life
"Game of Life" er navn til et spill uten vinnere og tapere. Det er heller ikke et spill. Det er en model for livet her på jorden.
"Game of Life" avspiller seg på celler, akkurat som på et Excel regneark. En celle er enten i live eller død.
Modellen består av følgende tre enkle regler:
  1. En død celle kan våkne til nytt liv hvis den har tre levende naboer:
    birth Er en celle i live, så forblir den i live dersom den har enten to eller tre levende naboer:
    survival I alle andre tilfeller dør en celle, eller forblir dødt (det er enten for ensomt for å leve, eller overbefolket)
    death
Viktig: disse reglene fungerer slik at man først bestemmer for hver celle om den skal vøre i live eller ikke. Etterpå forandrer man alle celler samtidig.
Det forbausende og fascinerende er, at disse enkle regler kan skape en veldig komplisert verden. Les mer...
Det er best du leker selv! Her har du noen trinn-for-trinn instrukser om hvordan du kan gjenskape Game of Life i Excel.
1. Start med et nytt ark.
2. Registrer to enkle makroer som fargelegger en celle enten grønnt eller rødt. Dette vil vi interpretere som enten levende eller død. Kanskje dine makroer ser ut som disse her (noen overflødige linjer ble fjernet):
gameOfLife
(Synes du dette var kryptisk? Da bør du gå tilbake til din allerførste makro.)
3. Nestre trinn er at vi trenger en makro som setter noen celler til live, og noen døde. Dette trenger vi for å kunne komme i gang med vårt spill, eller modellering.
La oss anta at alt liv skal vøre begrenset til cellene B2 til K11. (Ikke velg celler på randen, som A1 -- dette skaper bare problemer her!) Da kan denne makroen se ut som denne her:
gameOfLife
Dette skjer når man kjører settStartKonfigurasjon() [kolonnebredden må du sette selv]:
gameOfLife

Som du ser, skriver denne makroen 'GW' på feltet -- ingen grunn til å gjøre det samme!

Denne makroen kan du skape ved å kjøre dine settCelleLevende() og settCelleDød() makroer og registrere det hele i makro-opptakeren. Eller du kan skrive hele makroen direkte inn i Visual Basic editoren. Valget er ditt.
4. Nå kommer en skikkelig fin makro som du ikke kan registrere, fordi den er for vanskelig for Makro-opptakeren! Det den makroen skal gjøre: for en celle som er utvalgt, finne ut hvor mange blant naboene er i live, og skrive dette tallet inn i cellen.
Denne makroen kan hete finnAntallNaboer(). Det den gjør, er altså:
  • Forberede tellingen av levende nabo-celler ved å registrere en teller, og sette den lik null
  • Se på alle nabo-celler etter tur. Inkrementere telleren dersom en levende celle er møtt
  • Skrive resultatet av tellingen inn i selve cellen
Du kan bruke fargen til en celle som kriterium om den er i live for øyeblikket, eller steindød. Din makro kan da se ut som denne her:
gameOfLife
Som du ser, går vi utifra at en celle er utvalgt i momenten da denne makroen kjører (det er jo ikke noe utvalgs-kommando inn i makroen). Makroen sjekker antall naboer til den utvalgte cellen ved å kikke på cellen til høyre, til venstre, ovenfor, etc.
Siste delen av finnAntallNaboer() er der hvor resultatet av tellingen blir lagt inn i cellen:
gameOfLife

Du ser hvordan denne makroen skriver innholdet til cellen ved å sette 'Value'-egenskapet til cellen.

5. Det kan lønne seg å prøvekjøre denne makroen, for å se om den funker.
6. Nå er det ikke mye som mangler. Det viktigste er nå en makro som vil treffe selve avgjørelsen -- skal en celle være levende, eller skal en celle være død? Remember, dette avhenger av antall levende naboene -- og vi antar nå at tallet som en celle inneholder, forteller oss nettopp hvor mange levende naboer en celle har.
Reglene var alså: hvis en celle er død, så er det bare sjans for forandring dersom den har akkurat tre levende naboer. Hvis en celle er i live, er det bare sjans for forandring dersom den har mindre enn to eller mer enn tre naboer.
Igjen antar vi at en celle er utvalgt, og at vi nå må bestemme om en celle får leve eller ikke. Hvis det er behov for å forandre en celle sin status, skal makroen gjøre dette automatisk, ved ä kalle settCelleLevende() eller settCelleDød().
Alt dette kan du oversette i en makro som består av en masse if-linjer:
gameOfLife

Du ser hvordan denne makroen leser innholdet til cellen ved å se på 'Value'-egenskapet til cellen.

7. Test settCelleStatus() makroen ved å prøvekjøre.
8. I prinsippet er vi ferdig nå. Vi kan kjøre finnAntallNaboer() for hver celle -- da vet vi for hver celle hvor mange levende celler er i nabolaget. Etterpå kan vi kjøre settCelleStatus() på hver celle -- da vet vi om cellen lever eller ikke. Dermed har vi spillt en runde, og kan begynne forfra.
Men det er tungvint, særlig for oss som driver med makroer! Lag to løkker som her -- da har du selve hoved-makro som styrer alt:
gameOfLife
9. Nå er det bare å teste om gameOfLife() virker. Hvis ja: ta deg en Cola, du har fortjent det!
coke
Jeg vil gjerne se hvor langt du har kommet med dette, og eventuelt hjelpe til i tilfelle problemer! Send ditt regneark til vanlig addresse: gisle.kleppe@hsh.no

Mer om Game of Life
Tilbake til index