torstai 30. kesäkuuta 2016

Peliohjelmointikurssilla opittua

Kahdeksannen luokan peliohjelmointikurssi jatkui keväällä. Ensimmäisellä kokoontumiskerralla tiimit viimeistelivät suunnitelmansa OneDrive:ssa oleviin dokumentteihin. Me opettajat toimimme katselmoijina ja kyselimme epäselviä asioita sekä tarkennuksia ja lopulta suunnitelmat olivat jotakuinkin yksiselitteisiä niin, että graafikot ja koodarit saattoivat aloittaa omat hommansa.

Koodarit aloittivat tutustumalla opettajan Racket:illä koodaamaan pelipohjaan, jossa oli valmiina hahmojen piirtäminen ruudulle, tietorakenteet "peli" sekä "hahmo", hahmojen liikkumiseen sekä pelaajan ja toisen pelihahmon törmäyksen havaitsemiseen liittyvät funktiot sekä pelimoottori big-bang. Tietorakenteen kentille oli myös valmiiksi koodaattu set- ja get-funktiot.

Peli-tietorakenteessa oli seuraavat kentät:
  • tilanne : Symboli (esim. 'alku 'käynnissä 'pause 'loppu)
  • taso : Luku
  • pisteet : Luku
  • aika : Luku
  • pelaajat : Lista<hahmo>
  • dynaamiset : Lista<hahmo>
  • staattiset : Lista<hahmo>
 Hahmo-tietorakenteessa oli seuraavat kentät:
  • tyyppi : Symboli (esim. 'pejaaja 'kerättävä 'vaara)
  • id : Luku
  • tila : Symboli (esim. 'elossa 'kuollut)
  • varusteet : Lista<symboli> (esim. 'lippis 'pipo)
  • sijainti : Posn (x- ja y-koordinaatti)
  • suunta : Posn (vektori jossa x:n ja y:n suuntainen siirtymä)
  • laskuri : Luku (jos 0 niin ei liiku)
  • asento : Symboli (esim. 'vasen 'oikea)
Vaikka pelipohjassa oli paljon koodia, se ei vielä toteuttanut yhdenkään pelin logiikkaa joten ensimmäinen vaihe oli suunnitella miten kunkin ryhmän peli käyttäisi tietorakenteita hyväkseen, millaisia tiloja pelillä ja hahmolla piti olla jne. Tämä tehtiin isolle paperiarkille.

T'ässä pelissä sipsipussin piti kerätä hyppimällä juomia ja vältellä sivulta tulevia Shrekkejä (toinen "vuoristo"-taso jäi toteuttamatta)
Kun suunnitelma oli valmis, lähdimme tekemään pelejä yhdessä. Vaikka pelit olivatkin hyvin erilaisia, yllättävän monessa pelissä oli samoja piirteitä, jotka saatoimme koodata yhdessä opettajan johdolla kuitenkin niin, että kukin koodaripari sovelsi vaiheen omaan peliinsä sopivaksi. Lähdimme ensin luomaan kuhunkin peliin liittyviä hahmoja ja laitoimme ne liikkumaan oikeaan suuntaan (säätämällä suuntavektoria). Koska meillä ei ollut grafiikoita, ryhmät käyttivät erivärisiä ympyröitä, kolmioita ja nelikulmioita hahmojen kuvina. Ensimmäisinä koodasimme siis funktiot: tee-hahmo ja piirrä-hahmo. Kutsuimme tee-hahmo-funktiota riittävän monta kertaa, että saimme big-bangin käynnistyttyä muutamia hahmoja liikkumaan. Seuraava vaihe oli lisätä funktio, joka toteuttaa pelaajan liikkumisen käyttämällä nuolinäppäimiä. Koodasimme siis funktion: hoida-näppäimet. Kun pelaaja liikkui saatoimme lisätä törmäyksen havaitsemisen sekä pisteiden lisäämisen tai vähentämisen riippuen törmäyksen kohteesta. Nämä toteutettiin funktioiden: päivitä-peli ja törmäsikö? avulla. Lopuksi lisäsimme funktion, joka automaattisesti arpoi peliin lisää hahmoja. Tämä toteutettiin funktion lisää-hahmoja ja arvo-hahmot avulla.

Zombipelissä piti ampua sivuilta tulevia zombeja (huomaa läpinäkyvä ase ja matalalla liitävät ammukset)
Näiden perustoimintojen lisäksi, yhdessä pelissä hahmolle (sipsipussi) piti lisätä painovoima, eli se piti saada hyppäämään ja sen jälkeen putoamaan takaisin. Toisessa pelissä pisteiden laskenta toimi niin, että kolmen "vihanneksen" jälkeen pisteet nollautuivat kokonaan, eli peli loppui ja alkoi taas uudelleen. Kolmannessa pelissä hahmojen lisäksi taustakuva liikkui ajan suhteen, näin saatiin aikaan hahmon putoamisilluusio. Neljännessä pelissä hahmo ampui luoteja hiiren avulla, joten siihen piti lisätä myös hoida-hiiri-funktio. Viides peli jäi alkutekijoihinsä, koska koodareilta loppui mielenkiinto koodaamiseen melko nopeasti. Tämän ryhmän kanssa teimme niin, että graafikot siirtyivät kuvien valmistuttua koodaamaan ja ne ottivat käyttöön Scratch-työkalun, että saisivat jotain valmiiksi siinä  lyhyessä ajassa mitä oli enää jäljellä.

Tässä pelissä sankari hyppää katolta ja kerää matkallaan ES:iä ja nugetteja ja samalla väistelee lintuja (pallot kuvaavat ruokia, jotka jäivät graafikoilta toteuttamatta)
Pelejä koodattiin 7 kaksoistuntia ja samaan aikaan graafikot tekivät peligrafiikoita kuvataiteen opettajan ohjauksessa. Ensimmäisen kerran yritimme liittää kuvia ja koodia yhteen toukokuun alussa. Siinä vaiheessa tuli ilmi montakin ongelmaa, hahmojen kuvissa oli turhia valkoisia taustoja ja kuvia ei oltu rajattu mahdollisimman pieniksi, jotta törmäysehdot toimisivat moitteetta. Myöskään putoamisilluusion luomiseen tarkoitetut talon palaset eivät olleet sellaiset kuin piti (palat olivat eri kokoisia). Graafikot saivat tärkeää palautetta ja he palasivat korjaamaan kuvia, ja koodarit koodasivat pelejä hieman lisää. Kurssin loppu tuli kuitenkin vastaan aivan liian nopeasti, ja lopulta sovimme niin että opettaja koodaa jokaista peliä eteenpäin max 1h per peli. Lopulta neljän pelin loppuun koodamiseen meni 2h15min. Hankalin peli oli zombiepeli, koska siinä sekä zombit että ammukset liikkuivat ja ammuksen ja zombin törmäys piti havaita, kuten myös zombin ja pelaajan törmäys.

Tässä pelissä tehtävänä oli syödä taivaalta putoavia ruokia ja vältellä vihanneksi, tosin vihannekset jäivät graafikoilta piirtämättä ja tilalle tuli läjä sitä itseään.
Pelin lisäksi ryhmän piti tehdä pelille mainossivu, ja tämä toteutettiin blogikirjoituksen muodossa. Ryhmän graafikko ja tarinavastaava tekivät tämän kurssin lopussa. Vielä viimeiselläkin kerralla työstimme vielä pelejä, koska grafiikoissa oli edelleen puutteita: kerrostalon seinässä oli reikiä joista paistoi taivas, pitsapalassa oli turhaa näkymätöntä reunaa ja zombit ja zombien ampuja oli vielä piirtopöydällä. Lopulta kaikki viisi peliä olivat jotakuinkin pelattavassa kunnossa, hyvin riisuttuina versioina tosin mutta kuitenkin. Muutama graafinen elementti jäi puuttumaan, ilmeisesti pienten kommunikaatio-ongelmien takia ja zombien ampujan asekin jäi läpinäkyväksi ja ammusten lähtötaso säätämättä mutta näin voi käydä kun aika vain loppuu kesken.

Tässä pelissä piti hyppiä tasoilta toiselle ja kerätä rahoja, tasoja piti olla eri värisiä ja niiden piti kadota ja tulla taas esiin mutta tämä peli ei toteutunut aivan suunnitellulla tavalla
Kaiken kaikkiaan tämä oli hyvin mielenkiintoinen projekti. Tässä kurssissa tarkoitus ei ollut varsinaisesti oppia ohjelmointia vaan pääpaino oli uuden pelin ideoinnissa sekä projektityöskentelyn opettelussa. Ainakin ryhmille tuli selväksi, että jokaisen työpanosta tarvitaan, eikä peli tule valmiiksi jos jokin osa-alue jää tekemättä. Pelin suunnittelu oli aluksi vaikeaa, mutta lopulta suunnitelluista peleistä tuli jopa hieman turhan monimutkaisia toteutettavaksi näin lyhyen kurssin aikana. Pelipohja toimi siinä mielessä, että sen avulla pystyttiin tekemään nämä pelit, mutta kovin helppokäyttöinen se ei vieläkään ole. Lausekielen (tällä kurssilla Racket) käyttäminen näin suppealla kurssilla ei ehkä vastaa tarkoitustaan varsinkin kuin osalla koodareista ei ollut aikaisempaa kokemusta ohjelmoinnista. Asian (ohjelmointi) syväoppiminen ja pelin valmiiksi saaminen eivät ehkä toteudu saman kurssin puitteissa... Ensi lukuvuonna 8. luokan kurssin nimi onkin pelkkä "ohjelmointi". Katsotaan saako "ohjelmointi" enemmän tilaa, kun "peli"-aspekti jää pois.

Tässä pelien esittelyt löytyvät kurssin blogissa.

sunnuntai 22. toukokuuta 2016

Lietsun koodauskerho RobocupJunior - kisoissa Helsingissä 19.-21.5.2016

Lietsun koodauskerho osallistui tänäkin vuonna RobocupJunior - kilpailuihin, jotka pidettiin Kaapelitehtaalla Helsingissä. Joukkueemme koostui 9 oppilasta, yhdestä huoltajasta ja yhdestä opettajasta. Osallistuimme XSumo-, Alkeispelastus- sekä Freestyle-kilpailuihin.

XSumo

XSumo on alakoululaisille tarkoitettu yleisöystävällinen kisalaji. Siinä kaksi robottia taistelevat sumoareenalla. Se joka jää viimeisenä taistelukentälle voittaa. Tänä vuonna kisaa oli vaikeutettu niin, että sumoareenalle päästäkseen robotin oli seurattava mustaa viivaa, jonka poikki kulki kolme kirkasta teippiä.

XSumo:n kisakenttä - Joona
Meillä oli tähän kilpailuun kaksi XSumo-robottia. Robotit saatiin valmiiksi jo Tampereella viikkoa ennen kilpailuja. Molemmissa oli toimiva värisensoreiden kalibrointiohjelma ja sumolaudalle pääsy oli huolella testattu joten olimme hyvässä iskussa, kun itse kilpailut alkoivat perjantaiaamuna.

Lietsun Xsumo - robotti
Palapelitehdas - robotti
Molemmat robotit pärjäsivät kilpailuissa todella hyvin. Lietsun Xsumo oli oman lohkonsa toinen ja pääsi ensimmäisen päivän jälkeen jatkoon. Palapelitehdas oli oman lohkonsa 4, ja oli siis myös hyvin lähellä päästä jatkoon, kun lohkon 3 parasta pääsivät kilpailemaan voitosta. Lietsun Xsumo ei päässyt semifinaaleihin mutta taisteli hyvin kahdella moottorilla ja kahdella renkaalla,  kun vastustajilla saattoi olla neljäkin moottoria ja 8 rengasta!!!

Jatkokilpailuissa vastustajat olivat enimmäkseen laatikkomallisia - Oliwer
Rakentelualueella sai tuunata robotteja - Verneri ja Lenni

Muutosten jälkeen Palapelitehtaan robotti kävi uusintakatsastuksessa
Lietsun Xsumon "lumikola" osoittautui tehokkaaksi tavaksi kammeta raskaampikin vastustaja kentältä. Myös Palapelitehdas rakensi omaan robottiinsa vastaavan mekanismin toisen päivän kilpailuihin, joten robotit myös kehittyivät hienosti kisan aikana.



Alkeispelastus

Alkeispelastuksessa meillä oli sama tiimi kuin viime vuonnakin: Lauri ja Ulrika. Tällä kertaa sekä robotti, että ohjelmisto olivat valmiina viikkoa ennen kilpailua (viime vuoden pelastajarobotti ei osannut seurata viivaa vielä Tampereelta lähdettäessä). Myös pelastusryhmä oli ottanut värisensorin kalibroinnin haltuun jo ennen kilpailuja.

Lietsun Pelastajat - robotti
Alkeispelastuksessa on kaksi yritystä suorittaa pelastusrata, jossa seurataan mustaa teippiä, joka kulkee useamman "huoneen" läpi. Reitillä on ramppi, oviaukkoja, esteitä, hidasteita, katkoksia seurattavassa viivassa, 90-asteen kulmia sekä kirkkaalla teipillä merkittyjä pelastettavia, joiden kohdalla on pysähdyttävä vilkuttamaan valoja tai annettava äänimerkki. Tehtävä on haastava, koska valaistusolosuhteet ovat hyvin erilaiset talon "alakerrassa" ja "yläkerrassa", samoin molemmat radat ovat erilaiset ja niiden keskinäinen valaistus on myös erilainen. Tällä kertaa ei ollut mahdollisuutta harjoitella harjoitusradalla, mikä vaikeutti entisestään kilpailua. Onneksi torstaina sai harjoitella hieman itse kisaradoilla, ja siinä selvisi se että robotti ei pääse mäkeä ylös ilman telaketjuja ja tämä muutos ehdittiin tehdä ennen kilpailujen alkamista.

Lietsun pelastajat - Lauri ja Ulrika
Ensimmäinen pelastusyritys lähti hyvin käyntiin, robotti selvisi ensimmäisestä huoneesta mutta sitten tapahtui jotain käsittämätöntä, robotti sekosi täysin eikä pystynyt jakamaan. Syytä sekoamiseen etsittiin ja lopulta selvisi, että moottorin johto oli irronnut mystisesti kesken kisasuorituksen. Onneksi joukkue ei tästä masentunut vaan jatkoi robotin kehittelyä, lisäsi siihen kolmannen värisensorin uhrin tunnistusta helpottamaan ja ohjelmoi paremman algoritmin viivan löytämiseksi uhrin tunnistuksen jälkeen. Nämä muutokset ja johtojen tiukentaminen siivittivät robotin kolmanneksi parhaaseen suoritukseen toisena kisapäivänä (78 pistettä). Tämä ei valitettavasti riittänyt aivan mitaleille asti mutta neljäs sija oli hieno tulos tässä kovassa kisassa, jossa voitto irtosi 91 pisteellä.

Freestyle

Viime vuoden Ultracar - joukkue jatkoi tänäkin vuonna valitsemallaan uralla legoautoteknologian kehittelyssä. Heidän kilpailutyönsä oli GyroEMT, eli kahden gyrosensorin avulla kauko-ohjautuva ralliauto. Työnjako toimi tässä tiimissä kuten viimevuonnakin: Onni rakensi auton, Kassu koodasi ja Joel teki videon. Tosin Tampereelta lähdettäessä valmiina oli vain auton ja kaukosäätimen mekaniikka, ohjelma ei toiminut eikä videota oltu kuvattu...

Gyro EMT : Joel, Onni ja Kasperi
Pojat joutuivatkin melko koville kisapäivinä. Torstai-ilta koodattiin ja yritettiin saada bluetooth yhteys toimimaan kaukosäätimen ja auton välillä. Ongelma ei selvinnyt ja autoon kovakoodattiin pieni ohjelma, että saatiin pieni videonpätkä seuraavan päivän Freestyle esittelyä varten. Yön yli nukkumisen jälkeen ongelmat alkoivat pikkuhiljaa ratketa (molempiin blokkeihin päivitettiin mm. firmware), ja lopulta kauko-ohjaus lähti toimimaan iltapäivällä vain hajotakseen jälleen.... Kassu teki koko ohjelman alusta alkaen uudelleen ja perjantai-iltana sitä debugattiin kahden läppärin (ja välillä kahden opettajankin) avulla majoituskoululla. Lopulta kun koko koodi ja kaikki bluetooth asetukset oli tarkistettu, kauko-ohjaus lähti toimimaan ja videota päästiin viimein kuvaamaan oikeasti. Video valmistui 23:30 viimeisenä kisailtana. Oli siis melkoinen suoritus, että tuomarit pääsivät katsomaan toimivaa tuotetta, josta oli myös esittelyvideo!


Työ ei kovasta ponnistelusta huolimatta voittanut mitalisijoja, ja jälkikäteen ajateltuna homma taisi tällä tiimillä jäädä vähän viimetippaan, joten loppusilaus jäi tekemättä. Silti hieno suoritus!!! Tässä nähdään robotin testailua Kaapelitehtaalla.



Kaiken kaikkiaan oli hieno huomata, että kerhomme oli kehittynyt kisalajeissa ja annoimme hyvän vastuksen jokaisessa lajissa. Ensivuonna voisi olla aika ottaa ohjelmistoon uusiakin lajeja. Alkeispelastusryhmämme olisi jo valmis siirtymään varsinaiseen palastussarjaan ja Freestyle - jengi voisi kokeilla alkeisjalkapalloa, kun tuo robotin kauko-ohjaaminenkin on jo tullut tutuksi :-) Erityiskiitos mukanamme olleelle huoltaja-Niinalle! Ensivuonna sitten Ouluun!

Lietsun koodauskerho korkeasaaressa jäätelöllä

torstai 28. tammikuuta 2016

Alakoulun koodaustunteja

Ensi syksynä uusi OPS vaatii ohjelmoinnin opettamista luokilla 1-6. Koska Lielahden koulussa ei alakoulun puolella ole vielä oppitunneilla koodattu päätin, että nyt oli korkea aika kokeilla miten se sujuu.

Luokanopettajat saivat varata 1-2h paja-aikoja ja vierailin oppitunneilla vetämässä ohjelmointia. Tässä lyhyesti kokemuksia.

Ekaluokkalaisten kanssa koodasimme kaksi tuntia. Paikalla oli puolikas luokka kerrallaan. Ensimmäiselle tunnilla tutustuimme Beebot-robottiohjelmointiin. Aluksi juttelimme hieman siitä mitä robotit ovat, mihin niitä voi käyttää ja miten ne saadaan liikkumaan. Kysyin oliko joku jo  sellaisen nähnytkin (Lielahden Prismassa kuulemma oli ollut yksi täyttämässä hyllyjä). Sitten esittelin Beebotin ja kerroin millasta peliä pelaisimme sillä.

Beebot:in piti "kerätä" loogisia paloja pelikentältä (4x4). Jokaisesta oikeasta palasta sai pisteen, väärästä menetti pisteen. Koska käytössäni oli vain yksi Beebot oppilaat ohjelmoivat sitä pareittain: ensin he sopivat mitä paloja kerätään (siniset tai pyöreät tms) ja missä palat sijaitsevat. Tämän jälkeen he saivat vuorotellen ohjelmoida robotin. Sillä aikaa muut pelasivat Beebot-peliä iPadeillä.


Toisen ryhmän kanssa kokeilimme myös sitä, että pari teki ohjeet ensin paperille, ja vasta sitten tulivat ohjelmoimaan robottia. Olisi luullut, että koodin kirjoittaminen olisi auttanut pitkän ajatteluketjun saamista oikeaksi mutta tulokset olivat usein huonompia kuin ilman suunnittelua.

Toisella tunnilla tutustuimme ScratchJr iPad appsiin. Näytin ensin tykin kautta miten hahmot saadaan liikkumaan, miten hahmoja lisätään ja taustakuvaa vaihdetaan sekä miten hahmo saadaan puhumaan koskettamalla sitä (vuorosanojen äänittäminen). Toisen ryhmän kanssa ehdimme tehdä myös silmukoita ja siirtyä tasolta toiselle. Yllättävän paljon ekaluokkalaisetkin saivat tästä ohjelmasta irti.

ScratchJr
Nelos- ja viitosluokkalaisten kanssa aloitimme myös ScratchJr:lla. Ohjelma kiinnosti myös isompia oppilaita ja he tekivätkin näppärästi pidempiäkin tarinoita, joissa on useampia hahmoja sekä tasoja. Näiden ryhmien kanssa kävin läpi hieman tarkemmin ohjelman hallintaa: miten asiat saadaan tapahtumaan samaan aikaan ja miten ne saadaan tapahtumaan peräkkäin viestien avulla. Molemmat ryhmät opettelivat ohjelmaan kaksoistunnin ajan ja nelosluokka sovelsi tietojaan tekemällä Hölmöläistarinat animaatioksi. Tarinassa tarvittava esine piirrettiin ensin paperille ja sitten  valokuvattiin hahmoksi. Tämä ryhmä ei äänittänyt vuorosanoja vaan kirjoitti ne puhekupliin.

Hölmöläisten TV animaatio ScratchJr
Lego-ohjelmointia kokeiltiin kolmos-, nelos- ja viitosluokkien kanssa. Meillä oli valmiina EV3:n perusrobotit ja käytimme iPadin Lego Programming appsia. Kävimme ensin läpi robotin osat ja sen mikä niiden rooli on. Sitten näytin miten robotin saa kulkemaan eteenpäin ja kääntymään. Helpoin tapa säätää robotin kulkemaa matkaa sekä sen tekemää käännöstä tuntui olevan moottorin pyörimisajan säätö. Sitten näytin vielä miten robotin saa pysähtymään seinään ultraäänisensorin avulla.

EV3 Lego Programming iPad appsi

Tämän jälkeen oppilaat saivat haasteeksi ohjelmoida robotin kiertämään esteen (penaali) ja palaamaan lähtöviivalle (maalarinteippi). Toinen haaste oli saada robotti pysähtymään mustalle viivalle. Ja kolmas oli tehdä "pölynimurirobotti" joka toimisi lakkaamatta. Oppilaat ohjelmoivat robotteja pareittain ja koska kaikille pareille ei riittänyt robotteja he aloittivat pelaamalla Robo logic HD iPad peliä. Kun jokin pari sai haasteen valmiiksi he siirtyivät pelaamaan ja pelaajat siirtyivät robottihaasteen pariin. Kaksoistunnin aikana kaikki saivat tehtyä ensimmäisen haasteen ja puolet toisen haasteen. Muutama oppilas sai tehtyä myös pölynimurin.


Kaiken kaikkiaan oppilaat olivat innostuneita ohjelmoinnista. Robottien ohjelmointiin pystyi sitomaan mukaan hyvin tosielämän aihepiirejä kuten liikenne, fysiikka (ääni, valo, sähkö, energia) ja sekä matematiikkaa (pienempi kuin vertailuja, etäisyyden ja ajan mittaamista, logiikkaa). Animaatioiden tekeminen soveltui puolestaan äidinkielen ja kuvataiteen kanssa yhdistettäväksi projektiksi. Hieman jäin miettimään onnistuuko tämä ensi vuonna ilman minua (kuten toivon). Ehkä näillä ohjeilla?