Peliohjelmointia Scratchillä
Kuinka nuoret saadaan innostumaan koodauksesta? Yksi lähestymistapa innostavaan koodaukseen voisi olla pelien tekeminen. Kuinka se käytännössä kannattaa tehdä? Pitääkö osata jotain ohjelmointikieltä ennen kuin toimiva peli syntyy? Onneksi nykyään löytyy helppoja graafisia koodausympäristöjä, joilla pääsee hyvin alkuun. Tässä artikkelissa käydään esimerkin avulla läpi, mitä pitää huomioida, kun opetetaan peliohjelmointia peruskoulussa.
Pelin tekemisen vaiheet
On löydettävissä selkeitä vaiheita, kuinka peli saadaan työstettyä ideasta valmiiksi peliksi. Kun opettelee koodausta, voi aluksi tehdä mallin mukaisia valmiita pelejä, joita sitten muuntelee eri tilanteissa. Kun saa hieman kokemusta koodauksesta ja pelin tekemisestä, on seuraavaksi vuorossa oman pelin kehittäminen. Kun tekee omaa peliä, on ensimmäinen vaihe peli-idean ymmärtäminen. Pelissä on oltava jokin tavoite. Esimerkiksi pelissä voisi olla tavoitteena kerätä timantteja. Peli päättyy voittoon, kun saadaan kerättyä 10 timanttia. Sitten voisi kysyä kuka niitä kerää ja miten. Timantteja voisi kerätä sukeltaja, jota ohjattaisiin hiirellä. Ohjaus voisi tapahtua siten, että sukeltaja menee aina kohti hiiren osoitinta. Kun sukeltaja koskettaa timanttia, niin pelaaja saa pisteen ja timantti poistetaan näkyvistä. Tästä tullaankin jo siihen seuraavaan havaintoon, että peli tarvitsee muuttujan, jotta pisteet saadaan tallennettua pelin suorituksen aikana. Nimetään pelin tarvitsema muuttuja nimellä: Pisteet. Entä kuinka pelistä saataisiin jännittävä? Peli tarvitsee selvästi pahiksen. Tämä pahis voisi olla hai. Jos hai koskettaa sukeltajaa, niin peli päättyy tappioon. Hai voisi liikkua satunnaisessa paikassa vaakasuuntaan, samoin timantteja voisi pudota satunnaisesta kohdasta pystysuunnassa.

Kuva 1: Scratch-ohjelmassa on valmis grafiikkakirjasto, joten koodauksen voi aloittaa ilman, että osaa käyttää jotain piirto-ohjelmaa.
Kun pelin idea on selvillä, joudutaan miettimään millä tavoin peli toteutetaan. Meidän pelimme tarvitsee kolme pelihahmoa eli sukeltajan, timantin ja hain. Lisäksi tarvitaan taustakuva. Nämä olisi hyvä saada bittikarttakuvina pelinteko-ohjelmaan. Hahmot saadaan liikkumaan koodauksen avulla eli meidän pitää valita jokin ohjelmointiympäristö. Valitsemme nyt koodausympäristöksi Scratchin, jossa on mukana valmis grafiikkakirjasto. Muita vaihtoehtoja pelien ohjelmointiympäristöksi aloittelijalle voisivat olla esimerkiksi GDevel5 tai Construct 3. Mikäli mitään valmista grafiikkakirjastoa ei olisi käytössä, meidän pitäisi osata käyttää myös jotain piirustusohjelmaa. Scratchin mukana tulee bittikartta-piirustusohjelma, jota voi myös käyttää omien pelihahmojen piirtämiseen. Hyvä vektorigrafiikkaohjelma olisi kuitenkin parempi vaihtoehto, jos tarkoitus on tehdä useampi peli, koska on hyvin todennäköistä, että tarvitsemamme kuva ei löydy valmiista grafiikkakirjastosta. Ilmainen ja hyvä ohjelma tähän tarkoitukseen olisi esimerkiksi Inkscape, jolla piirretyt hahmot voidaan tallentaa png-bittikarttakuviksi. Inkscapen käyttöön ja pelihahmojen luomiseen löytyy esimerkiksi YouTubesta paljon videoita.
Käynnistetään seuraavaksi Scratch-ohjelma, lisätään sinne pelihahmot ja taustakuva Scratchin vakiokirjastosta sekä lisätään sinne muuttuja: Pisteet. Mitä tehdään seuraavaksi? Vuorossa on algoritmin eli sanallisen ohjeen laatiminen siihen, kuinka sukeltaja, hai tai timantit käytännössä saadaan liikkumaan. Kun idea on selvillä, se pitää testata koodaamalla ja ajamalla koodi ohjelmointiympäristössä.
Scratchissä on käytössä xy-koordinaatisto, jossa ikkunan keskellä on koordinaattipiste (0,0). Koordinaatisto on sama kuin matematiikassakin. Kun mennään oikealle, silloin x:n arvot kasvavat, ja vastaavasti kun mennään vasemmalle, silloin x:n arvot vähenevät. Kun mennään ylös, silloin y:n arvot kasvavat, ja vastaavasti kun mennään alas, silloin y:n arvot vähenevät. Suunta oikealle on 90 astetta ja vasemmalle –90 astetta, vastaavasti suunta ylös on 0 astetta ja alas 180 astetta (tai –180°). Scratchistä löytyvät valmiit komennot hahmon laittamiseksi tiettyyn paikkaan ja liikkumiseen tässä koordinaatistossa. Kaikki komennot alkavat aloituskomennolla, joka on tässä tapauksessa vihreä lippu. Sukeltajan algoritmi on yksikertaisuudessaan seuraava: Asetetaan sukeltaja ikkunassa keskelle alas eli paikkaan x = 0 ja y = -170 ja suunta on oikealle eli itään päin (90°). Kun laitamme ikuisen silmukan sisälle komennot, jossa hahmo osoittaa kohti hiiren osoitinta ja samalla liikkuu eteenpäin, esimerkiksi 2 askelta, niin sukeltajaa voidaan ohjata hiiren avulla. Luodaan samalla toinen ehto. Jos Pisteet-muuttuja saa arvon 10, silloin ilmoitetaan, että olet voittanut pelin ja peli päättyy. Tämä komento on laitettava ikuisen silmukan sisälle, koska muuten tarkistus tehtäisiin vain kerran. Katso koodin toteutus kuvasta 2.

Kuva 2: Koodin lisääminen sukeltajalle.
Samalla tavalla hai voidaan asettaa tiettyyn alkupaikkaan (x = 0, y = 150) xy-koordinaatistossa. Hai saadaan liikkumaan esimerkiksi 2 askelta haluttuun suuntaan, kun laitetaan tämä komento ikuisesti silmukan sisälle. Mutta mitä tehdään sitten kun hai törmää ikkunan reunaan? Hain pitäisi silloin muuttaa suuntaa. Suunnan muuttaminen tarkoittaa sitä, että suunnan etumerkki muutetaan päinvastaiseksi eli vastaluvuksi, koska oikealle suunta on 90 astetta ja vasemmalle suunta on –90 astetta. Tarvitsemme siis ohjelmaan ehdon, että jos hai koskettaa reunaa, niin muuta suunnan etumerkki. Kun suunta on muutettu, voidaan arpoa uusi satunnainen paikka pystysuunnassa ja liikkua hieman eteenpäin, jotta emme kosketa enää reunaa. Tämä toteutus on esitetty kuvassa 3. Samalla lisätään vielä toinen komento, jossa ikuisen silmukan sisällä tehdään tarkistus: Jos hai koskettaa sukeltajaa, niin peli päättyy siihen.

Kuva 3: Koodin lisääminen haille.
Nyt tarvitsee enää lisätä koodi timantille. Kuinka yhdestä timantista saadaan useampi timantti? Se onnistuu kloonaamalla timanttia, ja tälle toiminnolle on Scratchissä jo valmiina omat komennot. Luodaan siis koodi, jossa piilotamme alkuperäisen timantin näkyvistä ja teemme siitä joka 5 sekunnin välein uuden kloonin. Kun klooni on luotu, tuomme sen näkyväksi ja asetamme sen ikkunan yläreunaan (y = 170) satunnaiseen vaakapaikkaan. Kun pienennämme silmukan sisällä tämän kloonitimantin y arvoa, niin kloonitimantti tippuu alapäin. Kloonitimantti voidaan poistaa kahdella tavalla. Jos timantti on päässyt ikkunan alareunaan (y on pienempi kuin -170) tai kloonitimantti koskettaa sukeltajaa. Jos kloonitimantti on alareunassa, silloin vähennetään piste. Jos kloonitimantti koskettaa sukeltajaa, silloin annetaan piste. Tämän idean toteutus on esitetty kuvassa 4.

Kuva 4: Koodin lisääminen timantille.
Vaikka koodi on nyt tehty, peli ei ole vielä täysin valmis. Lopuksi peliä pitää testata pelaamalla. Onko pelin vaikeustaso sopiva? Liikkuvatko hai ja sukeltaja sopivalla nopeudella? Onko pelissä tarpeeksi haastetta, pitäisikö sinne lisätä toinen hai? Tai entä jos ylhäältä tippuisi myös vaarallisia esineitä, joita ei saa koskettaa? Pelin idea voisi myös olla se, että pitää väistellä vaarallisia esineitä. Timanttien putoaminen voisi myös nopeutua aina kun timantti saadaan kiinni. Toisaalta putoaminen voisi myös hidastua, kun timanttia ei saada kiinni.
Voi kehitellä myös erilaisia esteitä, joista sukeltaja ei pääse läpi vaan ne täytyy kiertää. Esimerkiksi jos koskettaa hahmoa, liikkuu taaksepäin eli negatiiviseen suuntaan. Peliin voi myös lisätä toisen sukeltajan, jolloin pelistä tulee kaksinpeli. Tällöin tarvittaisiin toinen muuttuja toisen pelaajan pisteille. Pelin voittaa se, joka ensimmäisenä saa esimerkiksi kymmenen pistettä. Sitten pitäisi lisätä myös ohjaus, kuinka pelaajat liikkuisivat näppäimistöllä.
Pohdintaa
Tärkeintä peliohjelmoinnissa on algoritminen ajattelu eli ongelman ratkaisu ja pelilogiikan pohdinta sanallisesti. Koodaus on vain tämän sanallisen algoritmin toteutusta. Tärkeintä on luoda luokkaan ohjelmointikeskustelua – eli mitä tapahtuu, jos tämä ja tämä ehto täyttyy. Oppilaat olisi hyvä saada pohtimaan eri vaihtoehtoja, jotta innostus oman pelin tekemiseksi syttyisi. Peliohjelmointi on hyvä aloittaa Scratchillä, jotta kynnys koodaukseen olisi mahdollisimman pieni. Jos koodattaisiin pelejä JavaScariptillä, Pythonilla tai C++:lla, pohjalle tarvittaisiin kuukausien ohjelmointirutiini ennen kuin päästäisiin tekemään omia pelejä. Peliohjelmointi on hyvä tapa saada nuoret kiinnostumaan ohjelmoinnista, ja kannustankin opettajia pitämään valinnaisaineena peliohjelmointia yläkoulussa ja lukiossa.

Kuva 5: Kuvankaappauksia peleistä, joiden ohjeet löytyvät MAOLin jäsenmateriaalista.
MAOL tarjoaa valmista materiaalia, jonka avulla peliohjelmoinnissa pääsee alkuun. MAOLin Materiaalit-verkkosivulta löytyy ohjeita Scratch- ja GDevelop5-peliohjelmointiin. Tämä on jäsenetu kaikille MAOLiin kuuluville, ja suosittelen tutustumaan materiaaliin. Grafiikan tekemiseen Inkscapella löytyy ohjeita kohdasta Tietotekniikan punainen lanka.
Scratch-ohjeita (11.9.2023)
GDevelop5-ohjeita (29.7.2025)
Tietotekniikan punainen lanka (29.6.2022)