Materiaalit on lisensoitu Creative Commons BY-NC-SA-lisenssillä, eli materiaalin levittäminen ja muokkaaminen on sallittu, kunhan tekijöiden nimet säilyvät mukana ja jatkoversiot julkaistaan samalla lisenssillä. Kaupallinen käyttö kielletty.

Alkuperäiset tekijät (2015): Aino Haavisto ja Jenna Tuominen


Takaisin: Syksy 2015

Scratch-Agar.io

Pelin toiminta Pelissä on tarkoitus kuljettaa omaa pelipalloa kentällä, jolla pienempiä palloja voi syödä ja suuremmat suurempia palloja kannattaa siis väistellä. Pienimmät hituset ovat ruokaa, mutta pelissä on myös tekoälyvastustajia.
Vaikeustaso Peli on jo jossain määrin haastava ja erityisesti hienompaa tekoälyä tavoitellessaan pääsee pinnistelemään ihan huomattavasti. Pelissä käsitellään yhtäaikaisesti monia klooneja ja käytetään listoja kloonien ominaisuuksien tunnistuksissa.
Oppimistavoitteita
  • Kerrataan koordinaatistoa, satunnaisuutta ja ohjelmoinnin perusrakenteita kuten silmukoita ja ehdollisuutta (jos niin:)
  • Opitaan käyttämään klooneja
  • Opitaan kloonien numeroimista myöhempää tunnistusta varten
  • Opitaan käyttämään listoja
  • Tutustutaan tekoälyn toteuttamiseen
Toimiva versio Agar.io mallina Scratchissa
Variaatioita toteutuksessa Pelissä voi toteuttaa tekoälyä monella eri tavalla. Tekoälyn voi jättää tyhmäksi tai sitä voi pyrkiä oikeasti luomaan fiksuksi, jotta se osaa hakea pienempiä ruokia ja väistellä isompiaan.

Kuva mallipelistä:

Screenshot esimerkkipelistä. Screenshot esimerkkipelistä.

Työvaiheet:

Väriselite:

Oppimistavoite
Tarkennus tekotapaan
  1. Maalaa tausta ja piirrä hahmot
    Tee kustakin pallosta oma hahmo. Hahmoja ovat 'oma hahmo'/'minä', 'ruokapallura' ja 'tekoäly'/'vihupallero'. Tekoälyjen tulee myöhemmin osata tunnistaa myös toisiin tekoälyihin osuminen. Itseensä koskemista ei voi tarkistaa, joten tämä tulee tehdä testaamalla osuuko tekoäly johonkin omaan väriinsä. Tekoälyjen kannattaa siis olla kohtuu yksivärisiä.

    Pelihahmon ja tekoälyjen kannattaa olla samankokoisia.

  2. Oma liikkuminen (vaihtoehtoja)
    1. a) Aseta pelihahmo liikkumaan nuolista
    2. Tässä kannattaa testata ikuisesti vuorotellen jos jokin nuolinäppäin on painettu. Jos näppäin on painettu niin hahmoa siirretään vastaavaan suuntaan. (Tällöin hahmo voi liikkua myös väli-ilmansuuntiin. Vrt. tapahtumien "Kun painetaan nuolinäppäin" ei kuuntele yhtä aikaa eri näppäimiä.)
    3. Tai b) aseta pelihahmo liikkumaan kohti hiirtä
    4. Emme siis halua, että pelihahmo 'menee hiiriosoittimen luokse', koska se tapahtuisi välittömästi ja hahmon nopeus olisi tavaton. Kannattaa ennemmin ikuisesti vuorotellen osoittaa aina kohti hiirtä ja liikkua sitten pari askelta siihen suuntaan.
    5. Luo pelihahmon nopeus
      Käytetään ohjelmassa käsinkirjoitettujen lukujen sijaan muuttujia. Tällöin arvo on muutettavissa ohjelman suorituksen aikana tai ohjelmaa tuunatessa helposti kun tarvitsee asettaa vain yhteen kohtaan pelin alkuun uusi lukuarvo muuttujaan.
      1. Aseta nopeus pelin aluksi alkuarvoonsa (esim. 3)
      2. Aseta pelihahmo liikkumaan nopeus-muuttujan verran
      3. Laita siis kaikissa x:n ja y:n siirroissa ja liikuttamisissa kirjoitetun numeron tilalle nopeus-muuttuja.
  3. Ruoan ilmestyminen
    Kerrataan kloonien luontia ja satunnaisuutta. Opitaan miten klooneja voi heti pelin aluksi luoda tietyn määrän ja sitten myöhemmin aika ajoin lisää.
    1. Pelin alkaessa luo esim. 10 kloonia
    2. Siis pelin alkaessa 'toista 10 kertaa' kloonin luominen.
    3. Alun jälkeen luo ikuisesti klooneja tietyin väliajoin
    4. Tietyin väliajoin klooneja saa kun kloonin luomisen jälkeen laittaa ohjelman aina odottamaan tietyn ajan ennen seuraavaa kloonia.
    5. Kloonin syntyessä arvo sille satunnainen paikka
    6. Aseta alkuperäinen ruoka piiloon
    7. Kaikki kloonit osaavat nyt valita kunkin pelin alussa satunnaisen paikan. Samaten jos myöhemmin teemme klooneille lisää toiminnallisuuksia niin ei ole tarkoitus kopioida kaikkea myös alkuperäiselle kappaleelle. Myöhemmin jotain korjatessa kopiot saattaisivat jäädä erilaisiksi epähuomiossa. Laitetaan siis nyt alkuperäinen yksinkertaisesti piiloon ja kukin klooni syntyessään näkyviin.

  4. Ruokaileminen
    Scratchissä on väliä tarkasteleeko pelihahmo osumistaan ruokapalleroon vai päinvastoin. Jos pelihahmo huomaa löytäneensä ruokapalleron ja syö sen niin se ei osaa sanoa ruokapallero-hahmolle mikä klooneista pitäisi poistaa. Päinvastoin ruokapalleroklooni voi aina lähettää viestin, että se on kohdannut pelihahmon. Pelihahmoja on vain yksi ja viesti päätyy oikealle hahmolle tällöin.
    Lähetetään tieto törmäyksestä toiselle törmäyksen osapuolelle viestillä.
    1. Ruokapallero tarkastelee ikuisesti osuuko se pelihahmoon
    2. Scratchissä olisi myös palikka 'odota kunnes', mutta näin saamme samaan ikuisesti silmukkaan myös tarkistuksen osuuko ruokapallero tekoälyhahmoon.
    3. Osumasta ruokapallero lähettää "Pelihahmo söi" -viestin ja klooni poistetaan sitten
    4. Kun pelihahmo vastaanottaa viestin "Pelihahmo söi" sen koko kasvaa ja se hidastuu
    5. Koon muuttaminen on ulkonäköön liittyvä komento. Hidastumisen voi hoitaa muuttamalla nopeus -muuttujaa hieman negatiivisemmaksi: muuta muuttujan nopeus arvoa -0.1. Jotta nopeus ei voi pelin edetessä mennä lopulta negatiiviseksi niin käskyn voi asettaa suoritettavaksi vain jos nopeus on vaikka > 2.
    6. Pelihahmon koko asetetaan pelin alussa
  5. Tekoälypallerot luodaan
    1. Luodaan tekoälypalleroklooneja samoin kuin ruokapalleroita
    2. Erona voi olla hyvä luoda tekoälyjä hieman vähemmän ja sitten harvemmin kuin ruokapalleroita luotiin.
    3. Kukin tekoälypallero valitsee satunnaisen aloituspaikan sekä suunnan
    4. Tekoälypallero asetetaan liikkumaan satunnaisesti
    5. Ohjelmia kannattaa aina tehdä pienissä palasissa ja päätoiminnallisuudet tehdä aluksi. Luomme nyt pallojen syömistoiminnot ensin ja teemme toistaiseksi vain ihan yksinkertaisen ja päättömän liikkumisen tekoälylle, joka sallii syömisen testaamisen. Voimme myöhemmin lähteä muokkaamaan liikkumista "älykkäämmäksi".
      Satunnaisen liikkumisen voi toteuttaa nyt vaikka ikuisesti vuorotellen liikuttamalla hahmoa ja sitten kääntämällä sitä satunnaisella määrällä (esim. -10 - 10 verran). Tarvittaessa tekoälyn voi myös käskeä pomppaamaan reunasta.
    6. Tekoälypallerollakin on nopeus
    7. Tämän nopeus-muuttujan tulee olla "vain tällä hahmolla". Muuten kaikkien tekoälykloonien nopeus on sama. Kun nopeus -muuttuja on olemassa ja asetettu alkuarvoonsa kun klooni luodaan niin muuttujaa tulee myös käyttää kloonia liikutettaessa.
  6. Tekoäly voi syödä
    Nyt klooni yrittää törmätä toiseen klooniin. Ensin törmänneen tulee siis törmäyksen huomattuaan odottaa hetki ja poistua vasta sitten. Tällöin toinenkin klooni ehtii huomata törmäyksen. Viestiä ei voi helposti lähettää, sillä viestin vastaanottajat eivät tietäisi mitä kloonia viesti koski.
    1. Lisää ruokapalleron törmäystestauksiin testi koskeeko se tekoälypalleroa, jos kosketaan niin odotetaan hetki ja poistetaan ruokaklooni sitten
    2. Tietokone on hyvin nopea suorittamaan komentoja, hetkeksi riittää 0.1 s.
    3. Luo tekoälykloonille uusi skripti, jossa se synnyttyään ikuisesti tarkastelee törmäyksiä
    4. Jos tekoälypallero koskee ruokapalleroa niin kasvata tekoälypalleron kokoa ja hidasta sitä
    5. Koon muuttaminen ja hidastaminen kannattaa tehdä samoin kuin pelihahmolla. Nyt myös ruokapallero on paikalla vielä 0.1 sekuntia, joten tekoäly saattaa ehtiä syödä sen useaan kertaan. Jos tämä on ongelma lisää edellisten lisäksi pieni odotus myös tekoälypallerolle.
    6. Aseta alkuperäiselle tekoälypallerolle tietty koko, etteivät kloonitkaan ilmesty turhan suurina
  7. Lisää sekä pelihahmolle että tekoälyklooneille skripti, joka aika ajoin vähentää kokoa ja kasvattaa samalla nopeutta
  8. Pelaajan ja tekoälyn törmäys
    Kahden pelaajan törmätessä toinen voi syödä pienemmän jos kokoero on suuri. Kokoeroa selvitettäessä kuitenkin vain tekoäly tietää oman kokonsa. Jos pelihahmo kysyy tekoälyn kokoa niin se saa tietää vain alkuperäisen tekoälyn koon, ei sen kloonin kokoa, johon se on törmännyt. Tekoälyllä on enemmän tietoa, joten sen kannattaa tarkastella törmäyksiä.

    Jos tekoäly on suunnilleen yhtä suuri ei tarvitse tehdä mitään. Jos tekoäly on paljon suurempi se voi kasvattaa kokoaan. Jos tekoäly on kuitenkin pienempi ja se tulee pelihahmon syömäksi niin pelihahmon tulee jotenkin tietää miten paljon syödä. Tämän voi ohjelmoida helposti ja sinnepäin tai hankalammin, mutta tarkasti. Tässä eri menetelmät:

    a) Tekoäly ennen häviämistään lähettää viestin ja pelihahmo lisää sen vastaanottaessaan itselleen jonkin vakiomäärän kokoa.

    b) Tekoäly lähettää viestin, mutta ennen sitä tallentaa johonkin kaikkien näkemään muuttujaan minkä kokoinen se oli. Pelihahmo kasvattaa kokoaan tekoälyn koon mukaisesti.

    Seuraavaksi törmäys toteutetaan oikealla koolla.

    1. Testaa tekoälykloonin skripteissä myös osuuko tekoäly pelihahmoon, jos törmää niin:
    2. Jos tekoälyn oma koko on pienempi kuin pelihahmon koko - 20 niin se on huomattavasti pelihahmoa pienempi
      1. Tällöin tallenna tekoälyn koko ensin tätä varten tehtyyn muuttujaan
      2. Tallennuksen jälkeen lähetä viesti "Minä söin tekoälyn"
      3. Viestin lähetyksen jälkeen kloonin voi poistaa
      4. Pelihahmo viestin vastaanottaessaan kasvaa ja hidastuu
      5. Pelihahmo voi kasvaa kokoa määrällä tekoälyn koko / 10.
    3. Jos tekoälyn oma koko on suurempi kuin pelihahmon koko + 20 niin se on huomattavasti pelihahmoa suurempi
      1. Kasvata tekoälyn kokoa
      2. Kasvata kokoa arvolla (koko of pelihahmo) / 10. Koko of pelihahmo löytyy tuntoaistipalikoista, siinä sekä ominaisuus (koko) sekä hahmo (pelihahmo) ovat alaspäin avautuvia valikoita.
      3. Lähetä viesti "Tekoäly söi minut"
      4. Hidasta tekoälyä
      5. Kun pelihahmo vastaanottaa viestin niin piilota se
  9. Tekoälyjen keskinäiseen törmäilyyn varautuminen