|
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:
-
En død celle kan våkne til nytt liv hvis den har
tre levende naboer:
Er en celle i live, så forblir den i live dersom den
har enten to eller tre levende naboer:
I alle andre tilfeller dør en celle, eller forblir dødt
(det er enten for ensomt for å leve, eller overbefolket)
|
|
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):
(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:
|
Dette skjer når man kjører settStartKonfigurasjon() [kolonnebredden
må du sette selv]:
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:
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:
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:
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:
|
9. Nå er det bare å teste om gameOfLife() virker. Hvis ja: ta
deg en Cola, du har fortjent det!
|
|
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
|