Game of Life



Game of Life on erään englantilaisen matemaatikon, John Horton Conwayn, vuonna 1970 kehittelemä yksinkertainen peli jossa ruudukossa elävät solut syntyvät ja kuolevat tiettyjen sääntöjen perusteella. Game of Life on yksinkertainen versio niin kutsutusta soluautomaatista jossa jokaisen pisteen tuleva tila riippuu lähellä olevien muiden pisteiden tilasta.

"Peli" lienee hieman harhaanjohtava sana tässä tapauksessa. Game of Life on ennemminkin eräänlaista keinoelämää simuloiva ympäristö.


Pelialue ja säännöt

Peliä pelataan äärettömän kokoisessa 2-ulotteisessa maailmassa joka on jaettu ruutuihin. Käytännössä äärettömän kokoinen ruudukko on pienoinen ongelma, mutta paljon pienempikin maailma riittää yleensä Life-olioille ja niiden tutkimiseen. Leikkimielisemmässä Life-olioiden tutkinnassa äärettömyyttä voi matkia yhdistämällä äärellisen pelialueen reunat toisiinsa, eli ylä- ja alareuna yhteen sekä vasen ja oikea reuna yhteen.

Jokaisessa ruudussa on solu joka voi olla joko elävä tai kuollut. Kun pelin alkutilanne on annettu, solut lähtevät elämään kahden säännön pohjalta:

  • Kuollut solu herää henkiin (syntyy) jos sen ympärillä on tasan kolme elävää solua, muussa tapauksessa se pysyy kuolleena.
  • Elävä solu pysyy hengissä jos sen ympärillä on kaksi tai kolme elävää solua, muussa tapauksessa se kuolee.

    Tärkeää on huomata että kaikkien solujen tilan muutokset tapahtuvat yhtä aikaa! Eli ensin tarkistetaan jokaisen maailman solun kohdalla mitä solulle tulee tapahtumaan ja vasta sitten kun kaikki muutokset on selvillä, solujen tilojen muutokset tulevat voimaan kaikki kerralla.

    Esimerkki yhdestä sukupolven vaihdoksesta:

        Alkutilanne, 5*6 kokoisessa maailmassa on 6 elävää solua.
        Vihreä väri näyttää solut jotka ovat kuolleita mutta jotka tulevat heräämään henkiin (kaikkien ympärillä on tasan kolme elävää solua). Punainen väri puolestaan näyttää solut jotka ovat elossa mutta tulevat kuolemaan. Ylempi solu kuolee ylikansoitukseen (ympärillä neljä elävää solua) ja alempi yksinäisyyteen (ympärillä vain yksi elävä solu).
        Lopputulos, olio on nyt siirtynyt yhden sukupolven verran eteenpäin alkutilanteesta.

    Näin jatketaan niin pitkälle kuin jaksetaan. Aikaa myöden oliot yleensä kuolevat kokonaan pois, tai jäävät toistamaan jotain tiettyä jaksoa ikuisesti.

    (Tavallisen Game of Life -pelin syntyy/kuolee-sääntö kirjoitetaan yleensä muotoon B3/S23 eli "Birth 3 / Survival 2,3")


    Pelaaminen

    Life-peliä voi halutessaan pelata vaikka ruutupaperilla lyijykynän ja kumin avustuksella tai aivan pienimuotoisesti vaikka shakki-laudalla. Life-pelin pelaaminen onkin kätevää aivojumppaa, mutta pidemmän päälle se on kutakuinkin yhtä tuskallista kuin tetriksen pelaaminen ruutupaperin ja nopan avulla.

    [Ei Javaa!]     Onneksi siis nykyisin on tietokoneet jotka ovat aivan omiaan tälläiseen laskentaan. Olen tällä sivulla käyttänyt pientä Java-sovelmaa Life-olioiden esittelyyn. Kyseinen sovelma on käynnissä tämän tekstin vasemmalla puolella. Tällä hetkellä sovelmassa on näkyvissä sama alkutilanne kuin yläpuolella olleessa esimerkissä, ympäröivä maailma tosin on hieman suurempi. Kun klikkaat vasenta hiiren painiketta olion päällä, se siirtyy seuraavaan sukupolveen. Klikkaile tovi ja katso miten tilanne kehittyy. Tai pidä vasenta hiiren painiketta pohjaan painettuna, niin sukupolvet lähtevät itsestään menemään eteenpäin kunnes irrotat painikkeesta. Jossain vaiheessa solut muuttuvat punaisiksi, mikä on merkki siitä että maailman reunat tulivat vastaan eli olio kasvoi maailmasta ulos. Värinmuutos on siis vain merkkinä siitä että solujen tila ei välttämättä enää vastaa sitä todellista tilaa mikä niillä olisi jos maailma olisi äärettömän kokoinen. Oikealla hiiren painikkeella pääset takaisin alkutilanteeseen.

    Jos näet vain tekstin "[Ei Javaa!]", selaimesi ei tue Javaa tai Java on kytketty pois päältä. Silloin sinulta jää kyllä suuri osa tämän sivun sisällöstä näkemättä :-(

    Tämän sivun alaosasta löytyy linkki tekemääni JavaLife-sovelmaan jonka avulla voi itsekin rakennella olioita ja testailla niitä.


    Paikalleen jämähtänyt elämä

    Eräs yksinkertainen elämänmuoto life-pelissä on olio joka pysyy sukupolvesta toiseen muuttumattomana (still life). Kyseessä on siis oikeastaan jaksollinen olio jonka jakson pituus tosin on vain 1. Yksinkertaisin ja yleisin tälläinen olio on nk. Blockki, eli neljän solun muodostama neliö. Tälläisessä oliossa jokaisella elävällä solulla on kolme elävää naapuria joten kukaan ei kuole ja toisaalta yhdelläkään ympärillä olevalla kuolleella solulla ei ole kolmea elävää naapuria joten uusia eläviä soluja ei synny. Toinen erittäin yleinen on mehiläiskenno (beehive), joka on alla olevassa esimerkissä ylärivin keskimmäisenä.

    [Ei Javaa!]     Yleisiä muuttumattomia pysyviä olioita.

    Englanninkieliset nimet (järjestyksessä vasemmalta oikealle, kahdessa rivissä):
    Block, Tub, Beehive, Pond, Aircraft Carrier
    Loaf, Ship, Boat, Snake


    Jaksollinen elämä

    Toinen elämänmuoto on olio joka toistaa itseään tietyissä jaksoissa (Pn oscillator). Lyhin mahdollinen mielekäs jakso on kaksi, mutta jotkin monimutkaiset oliot voivat toistaa itseään usemman sadankin sukupolven jaksoissa. Ylärajaa ei periaatteessa ole. Kahden jaksoissa itseään toistavat oliot ovat ehdottomasti yleisimpiä ja myös pienimpiä.

    Yksinkertaisin ja yleisin tälläinen olio on Vilkku (Blinker/Traffic light) joka on kolmen solun mittainen suora joko pysty- tai vaakasuunnassa. Tämä näkyy alla olevassa esimerkissä vasemmalla.

    (Muista klikkailla esimerkkejä hiirellä niin näet sukupolvenvaihdokset.)

    [Ei Javaa!]     Esimerkkejä olioista joiden jaksonpituus on 2 (P2-oskillaattoreita).

    Englanninkieliset nimet (vasemmalta oikealle):
    Blinker, Toad, Clock, Beacon

    [Ei Javaa!]     Esimerkkejä olioista joiden jaksonpituudet ovat 3, 4, 5 ja 6.

    Englanninkieliset nimet:
    Jam, (nimetön?), Octagon II, (nimetön?)

    [Ei Javaa!]     Tästä sinänsä yksinkertaisesta alkutilanteesta syntyy varsin kaunis P3-oskillaattori nimeltään Pulsar.

    [Ei Javaa!]     10 solun rivi muuttuu pian P15-oskillaattoriksi jota kutsutaan Pentadecathlon:ksi.


    Liikkuva elämä

    Ensimmäinen ehkä vähän mielenkiintoisempi olio on maailmassa liikkuva olio. Liikkuvat oliot ovat siinäkin suhteessa mielenkiintoisia että ne todistavat kuinka yksinkertaisilla säännöillä voi saada aikaiseksi monimutkaisia kokonaisuuksia. Life-pelin säännöthän eivät missään vaiheessa puhu solujen liikkumisesta maailmassa, ainoastaan solujen syntymisistä ja kuolemisista. Liikkuvat oliot vain syntyvät itsestään useamman elävän ja kuolevan solun yhteistyön summana.

    Liikkuvat oliot ovat itseään jaksoissa toistavia olioita, mutta omaan alkutilanteeseensa palattuaan ne ovatkin eri kohdassa maailmaa. Jotkin oliot liikkuvat siististi eteenpäin jättämättä jälkiä (kutsutaan avaruusaluksiksi, spaceship/fish), jotkin isommat oliot saattavat taas jättää jälkiä peräänsä liikkuessaan eteenpäin (näitä kutsutaan nimillä puffer tai puffer train).

    Pieni ja yksinkertainen liikkuva olio on esimerkiksi kulkuri (Glider) joka on vain viiden solun kokoinen. Se toistaa itseään neljän sukupolven jaksoissa mutta on aina tuon neljän sukupolven jälkeen liikkunut yhden ruudun verran sekä vaaka- että pystysuunnassa. (Se mihin suuntaan kulkuri liikkuu riippuu ihan siitä miten päin kulkuri maailmaan on laitettu tai mistä suunnasta maailmaa katsoo.)

    Samalla törmäämme käsitteeseen valonnopeus. On selvää ettei mikään Life-olio voi liikkua nopeammin kuin yhden solun verran eteenpäin yhden sukupolven aikana koska mikään olio ei voi mitenkään vaikuttaa kahden ruudun päässä oleviin soluihin. Tätä "1 ruutu per sukupolvi"-nopeutta sanotaankin siis valonnopeudeksi koska valonnopeus on tunnetusti suurin mahdollinen liikkumisnopeus. (Ja koska tälle sivulle on päädytty varsin usein hakukoneilta hakusanalla "valonnopeus" niin mainittakoon nyt samalla että oikeassa maailmassa valon nopeus tyhjiössä on 299.792.458 metriä sekunnissa eli noin 300.000 kilometriä sekunnissa eli reilut miljardi kilometriä tunnissa.)

    Liikkuville olioille voidaan nyt määritellä myös nopeus joka on muotoa c/n (missä c on valonnopeus). Esimerkiksi yllämainitun kulkurin nopeus on c/4, eli neljännes valonnopeudesta. Kulkurihan liikkui yhden ruudun verran (vinottain) neljän sukupolven aikana.

    [Ei Javaa!]     Testaa kulkuria. (Oikealla hiiren painikkeella sait palautettua alkutilanteen.)

    [Ei Javaa!]     Kolme erikokoista, vaakatasossa puolella valonnopeudella kulkevaa avaruusalusta.

    Näitä kutsutaan myös nimillä LWSS (Light Weight SpaceShip), MWSS (Medium Weight SpaceShip) ja HWSS (Heavy Weight SpaceShip).

    Jokaisen näiden kolmen olion jaksonpituus on 4. Jokainen näistä olioista on myös nk. flipper, koska oliot muodostavat itsestään peilikuvan oman jaksonsa puolessa välissä.

    [Ei Javaa!]     Isompi liikkuva olio (myöskin nopeudeltaan c/2) joka jättää jälkeensä Vilkkuja.

    On myös olemassa olio joka osaa liikkua ja syödä vilkkuja (syöjistä lisää alempana). Kun nämä kaksi oliota laitetaan peräkkäin saadaan yksi pituutta kasvattava olio sillä vilkkuva syövä olio liikkuu hitaammin kuin vasemmalla oleva vilkkuja tekevä olio. Näin niiden välissä oleva vilkkurivistö kasvaa ikuisesti.

    Valonnopeus on Game of Life -pelissä vielä saavuttamatta ja taitaa myös jäädä sellaiseksi. Jotkin oliot voivat toki hetkellisesti liikkua valon nopeudella, mutta eivät loputtomasti. Nopeimmat ikuisesti liikkuvat oliot ovat juuri noita puolella valonnopeudella liikkuvia olioita ja on jo todistettu että se on myös suurin nopeus mikä liikkuvalla oliolla voi olla.

    On kuitenkin kehitetty eräs erittäin mielenkiintoinen P60-olio nimeltään Tähtiportti (Stargate). Kun LWSS (Light Weight Space Ship, esimerkki tästä oliosta oli yllä) saapuu Tähtiporttiin, se siirtyy yhteensä 30 ruutua eteenpäin 28:ssa sukupolvessa! Eli hetkellisesti Tähtiportin sisällä ollessaan alus jopa ylittää valonnopeuden, kulkien nopeudella 30c/28 (noin 1,07 kertainen valonnopeus). Alus ei tosin pysy ehjänä Tähtiportin sisällä vaan alus hajoaa kappaleiksi sisään tultuaan ja rakentuu uudeksi samanlaiseksi alukseksi Tähtiportin toisella laidalla.

    Nopeudesta puhuen, oma haasteensahan on tietysti myös yrittää tehdä mahdollisimman hitaasti liikkuvia olioita.


    Syöjät

    Syöjiksi (eaters) kutsutaan paikallaan pysyviä olioita jotka tuhoavat niihin osuvat toiset oliot ilman että syöjät itse tuhoutuvat. Toisin sanoen syöjät voivat tuhota niihin osuvia olioita loputtomasti. Luonnollisesti tietynlaiset syöjät voivat tuhota vain tietynlaisia ja tietyistä suunnista tulevia olioita. Mitään yleissyöjää ei siis ole olemassa, sehän tarkoittaisi oliota joka selviäisi ikuisesti ympäristön vaikutuksista huolimatta.

    Yleensä syöjät toimivat seuraavalla periaatteella: Kun "saalis" on tarpeeksi lähellä syöjää, niiden välillä muodustuu silta elävistä soluista. Seuraavissa sukupolvissa silta hajoaa ylikansoituksen vuoksi vieden osan syöjä- ja saalis-oliosta mukanaan. Tämän jälkeen syöjä osaa korjata itsensä mutta saalis ei joten se tuhoutuu.

    [Ei Javaa!]     Syöjä (oikealla alhaalla) joka tuhoaa siihen osuvan kulkurin tuhoutumatta kuitenkaan itse.

    Tämä kyseinen syöjä on nimeltään Fishhook mutta joskus sitä kutsutaan vain nimellä Eater tai jopa The Eater.


    Muita esimerkkejä

    [Ei Javaa!]     "R-Pentomino": Ehkä kuuluisin alkutilanne.

    Vain viisi solua, mutta tarpeeksi suuressa maailmassa tämä synnyttäisi melkoisen vilinän. Parhaimmillaan soluja on hengissä useampi sata yhtä aikaa ja tämä olio synnyttää myös kuusi kulkuria jotka jäävät ikuisesti matkaamaan tyhjyyteen. R-Pentomino muuttuu "tylsäksi" vasta sukupolvessa 1103, jolloin maailmassa on jäljellä niiden kuuden kulkurin lisäksi vain neljä vilkkua ja kasa paikalleen pysähtyneitä oliota.

    Tämä oli ensimmäinen Life-pelin alkuaikoina (1970-luvulla) löydetty alkutilanne jonka lopullinen kohtalo jäi tuntemattomaksi kunnes tietokoneet tulivat avuksi laskemisessa.

    [Ei Javaa!]     "Glider Gun": Kulkuritykki joka ampuu liikkeelle yhden kulkurin joka 30. sukupolvi.

    Sinänsä hauska pikkuseikka on että kahdeksan sopivasti toisiinsa törmäävää kulkuria voi muodostaa uuden kulkuritykin. Tässä (äärimmäisen rajoitetussa) suhteessa kulkuritykit voisivat siis lisääntyä.

    [Ei Javaa!]     Kolme toisiinsa törmäävää kulkuria muodostavat kevyen avaruusaluksen.

    [Ei Javaa!]     "Queen Bee Shuttle": Olio joka tekee kaksi mehiläiskennoa.

    Olio lähtee aluksi liikkeelle oikealle, synnyttää kennon ja kääntyy vasemmalle. Sitten myös vasemmalle syntyy kenno ja olio kääntyy taas takaisin. Tämän jälkeen se valitettavasti törmää ensimmäisenä tekemäänsä kennoon ja koko olio hajoaa.

    [Ei Javaa!]     Muunnelma yllä olevasta oliosta. Alkutilanne sama kuin yllä mutta reunoihin on lisätty Blockit. Blockit toimivat tässä syntyneiden mehiläiskennojen syöjinä. Nyt pääolio voi jatkaa kennojen rakentelua ikuisuuksiin.

    Tarkkaavainen ehkä huomaakin että hieman ylempänä ollut Kulkuritykki onkin itse asiassa vain kaksi hieman eri tasossa ja vaiheessa olevaa vastakkaista "Queen Bee Shuttle":a. Vertaapa tämän olion sekä Kulkuritykin vasemman ja oikean puoliskon liikkeitä.


    Monimutkaisempaa elämää

    Voisi kuvitella ettei Life-pelin alkuperäisillä yksinkertaisilla säännöillä pääsisi puusta pitkään. Mutta kuten tämä sivu jo toivottavasti osoitti, niin Life-olioilla saa tehtyä varsin monimutkaisiakin, ja erityisesti yllättäviä rakennelmia.

    Life-olioilla voi esimerkiksi toteuttaa maailmassa kulkevia singaaleja (liikkuvat oliot) ja myös loogiset AND-, OR- ja NOT-portit on saatu tehtyä Life-olioilla. Näitä yhdistelemällä voi saada rakennettua jopa alkeellisia "tietokoneita" jotka suorittavat tiettyä tehtävää. Life-pelin olioilla on saatu myös toteutettua esimerkiksi yksinkertainen 8 bitin muisti sekä olio joka "luettelee" alkuluvut.

    Yksi suuri haaste, jota ei vielä ole ratkaistu, on yritys rakentaa replikaattori (replicator). Eli olio joka tuottaisi kopioita itsestään. Teoriassa tälläisiä olioita pitäisi olla olemassa, mutta yhtään sellaista ei ole vielä onnistuttu tekemään. Todennäköisesti tälläinen olio tulee olemaan varsin suuri.


    Sääntöjen muunnokset

    Life-pelin säännöistä on tietysti aikaa myöden tehty paljon muutoksia. Yksinkertaisin muutos on muuttaa sääntöjä jotka määräävät koska solu herää henkiin ja koska se kuolee. Tällä tavalla voidaan saada aikaiseksi hyvin erilaisia maailmoja joissa oliot käyttäytyvät varsin erilailla. Useimmat maailmat ovat kuitenkin joko liian tappavia tai liian paljon elämää suosivia jolloin oliot kasvavat turhan räjähdysmäisesti.

    Yksi mielenkiintoinen muunnelma vakiosäännöistä on HighLife (B36/S23). Eli eroa tavallisiin sääntöihin on vain että myös kuollut solu, jolla on kuusi elävää naapuria, herää henkiin. Monet oliot käyttäytyvät tässä maailmassa varsin samalla tavalla kuin normaalissakin Game of Life -maailmassa mutta HighLife-muunnelmassa on onnistuttu rakentamaan replikaattori. Vieläpä varsin yksinkertainen sellainen, kyseisen replikaattorin alkutilanne on vain kuuden elävän solun kokoinen.

    Replikaattoreita on onnistuttu tekemään myös monissa muissa maailmoissa joissa vain B/S-sääntöä on muutettu. Yksinkertaisimpia lienee B1-säännöllä toimiva yhden solun kokoinen replikaattori :-)

    Monimutkaisemmiksi asioita saa vielä muuttamalla sääntöjä niin että myös muutkin kuin vain naapurisolut vaikuttavat solun seuraavan sukupolven tilaan. Esimerkiksi myös naapurien naapurit vaikuttaisivat, tai miksei paljon pidemmältäkin. Tälläisen muutoksen myötä paikallisten tapahtumien ennustaminen vaikeutuu huomattavasti.

    Toinen tapa muuttaa sääntöjä on muuttaa itse maailmaa. HexLife-muunnelmassa maailma on ruutujen sijasta jaettu heksagoneihin (kuusikulmioihin, eli maailma näyttä mehiläiskennostolta). Tälläisessä maailmassa jokaisella solulla on kahdeksan naapurin sijasta vain kuusi naapuria. Mitään erityisen mielenkiintoisia tälläisessä maailmassa eläviä olioita ei kuitenkaan ole löydetty.

    Maailmaa voisi muuttaa myös tekemällä siitä kolmiulotteisen, mutta ainakin tälläisten olioiden tutkiminen vaikeutuisi huomattavasti.

    Kolmas tapa muuttaa sääntöjä olisi lisätä solujen eri tiloja. Normaalissa Life-pelissähän solu on vain joko elävä tai kuollut, mutta solulle voisi keksiä useita erilaisia tiloja jotka vaikuttaisivat naapurisoluihin eri tavoilla. Eri tiloja voisi kuvata esimerkiksi eri väreillä.

    Nämä ovat vain kolme perustapaa muuttaa peliä, muitakin tapoja varmasti löytyy. Säännöistähän voi tarvittaessa tehdä ihan niin mutkikkaat kuin vain mielikuvitus antaa myöden.


    JavaLife

    Omien olioiden rakenteluun ja testailuun olen tehnyt JavaLife-nimisen sovelman. Ohjelma ja sen ohjeet ovat tosin englanninkielisiä mutta käyttö lienee silti helppoa vaikkei englanti kunnolla sujuisikaan. JavaLife-sovelmaan.


    Palautetta

    Palautetta tästä sivusta voi lähettää helposti tällä lomakkeella.




    www.tiikoni.net/gameoflife/ Full page map Copyright © Pasi Laaksonen