maanantai 29. joulukuuta 2014

Koodattuja joulukortteja (7.lk)

Viimeisellä kouluviikolla koodasimme 7. luokan matematiikan ryhmäni kanssa joulukortteja Racket:illa. Käytimme tähän kaksi 45 min oppituntia. Ensimmäisellä tunnilla opettelimme miten piirretään ympyrä, kolmio ja tähti ja miten niille annetaan define:llä nimet. Toisella tunnilla yhdistimme niitä overlay/xy:llä joulukuuseksi, johon sijoiteltiin koristeita. Nopeimmat ehtivät kirjoittaa myös joulutoivotuksensakin "korttiin".

Harjoitus oli mukava ja sopi hyvin sekä geometrian aihepiiriin, että ajankohtaan. Viimeisellä tunnilla luokkaan jäi vielä pari kolme koodaria vaikka kello soikin, tällaista tilannetta ei ole matikan tunnin jälkeen vielä tapahtunutkaan :-)

Näillä ohjeilla mentiin:





Hienoimmissa joulukuusissa oli monta palloa ja tähti. Tärkeintä oli kuitenkin se, että jokainen sai tehtyä jonkinlaisen kuusen. Tässä kolmen oppilaani näkemykset joulukuusesta sekä joulutoivotukset koodattuna Racketillä.


Lielahden koodauskerhon syksy 2014

Vedin tänä syksynä ensimmäistä kertaa elämässäni koodauskerhoa. Kerho kokoontui keskiviikkoisin (2h) ja siellä kävi säännöllisesti noin kymmenen 5.-7.-luokkalaista. Kerholaisista vain kaksi oli ohjelmoinut aikaisemmin, toinen CoolBasic:llä ja toinen Scratch:llä, joten pääsimme lähtemään liikkeelle lähes tyhjältä pöydältä.

Aloitimme ohjelmointiin tutustumisen pelaamalla code.org:in ohjelmointipelejä. Kerholaiset jaksoivat pelata näitä pelijä 1-2 tuntia, mutta sitten kiinnostus lopahti. Seuraavalla kerhokerralla siirryimme tekemään peliä Scratch:llä. Tein koko ryhmälle yhteiset tunnukset Scratch - sivustolle ja jokainen sai ryhtyä suunnittelemaan omaa peliänsä. Näytin aluksi miten Scratch-kissan saa liikkumaan ja kääntymään ja sen miten hahmot lähettävät toisilleen viestejä. Näytin myös miten uusia hahmoja ja taustoja piirretään. Kävimme läpi myös miten hahmon liikkeitä voi animoida vaihtamalla asusteita ja miten huomataan törmääminen esim. jonkin värin kanssa. Kävimme yhdessä läpi myös muuttujien käytön, koska useampi kerholainen halusi tehdä hyppäävän hahmon, jonka hypyn korkeus määräytyi siitä montako kertaa välilyöntiä oli painanut. Myös taustan (tason) vaihtuminen käytiin yhdessä läpi. Näitä asioita opetin useammalla kerhokerralla sitä mukaan, kun niitä peleissä tarvittiin.

Scratch-peleissä vaikeinta taisi olla oman peli-idean löytäminen ja siinä pysyminen. Osa kerholaisista vaihtoi peli-ideaansa useammankin kerran eikä sitten lopulta saanut mitään valmiiksi. Myös toisten tekemiin Scratch-peleihin tutustuminen netissä (=pelaaminen) kiinnosti välillä enemmän kuin oman pelin tekeminen. Parilla kerholaisella ongelmia tuotti myös itse ohjelmointi: haluttiin tehdä heti ensimmäisessä pelissä suhteellisen monimutkaista pelilogiikkaa. En aina itsekään osannut heti neuvoa oppilaita kun ruudulla tapahtui jotain outoa: hahmot putosivat maanpinnan läpi tai  hyppylaskuri kasvoi holtittomasti jne. Huomasin myös, että osalla työ ei edennyt koska hahmojen tarkkaan piirtämiseen käytettiin paljon aikaa jolloin varsinainen ohjelmointi jäi sivuseikaksi.

Tässä erään kerholaisen tekemän Scratch - pelin kaksi tasoa sekä pelihahmot
Lopulta vain 2 oppilasta sai oman Scratch - pelinsä valmiiksi, lopuilla into lopahti joko siksi, että en osannut aina neuvoa heti kun ongelma ilmeni tai pelin loppuun saattaminen olisi vain ollut liian hidasta. Ehkä peli-ideat olivat lopultakin liian vaativia tai lopputuloksen suhteen oltiin liian kriittisiä? Tässä kuitenkin yksi valmistuneista peleistä: bomb boy.

Bomb boy:ssä on monta level:iä
Kun huomasin että Scratch - projekti ei oikein edennyt, ehdotin parille 7. luokkalaiselle ohjelmointia Racket:llä. Annoin heille linkin opettajille pitämäni Racket - pajan materiaaliin ja kävimme sen avulla läpi Racketin piirtofunktioita. Pienen harjoittelun jälkeen he koodasivat autot ja funktion käsitteen selittettyäni myös "maalaa-auto"-funktiot. Lopuksi he pääsivät kokeilemaan myös autolla "ajelua". Autolla ajelu ja mm. auton nopeuden säätö olivat pojista hauskaa mutta toisaalta harjoitusta tehdessämme huomasin, että funktion käsite oli melkoisen vaikea vielä 7.-luokkalaisille. Tältä autolla ajelu "Racket-autolla" näyttää:


Yhdellä kerhokerralla emme päässeet kirjautumaan ollenkaan Scratch - sivustolle, joten koodasimme koko ryhmä Racket:llä. Ihmeekseni myös 5.luokkalaiset ymmärsivät miten lippuja ohjelmoidaan ja kahden tunnin aikana syntyi monen eri maan lippuja! Racket kokeilun jälkeen moni hylkäsi Scratch - projektinsa kokonaan ja jatkoi Racketin kanssa piirtelyä. Osa jatkoi omatoimista koodailua, ja näiden kokeilujen tuloksena syntyi mm. mielikuvitusmaan lippu ja kolmiulotteisuutta mallintavan "Death Star".

Tässä 6.luokkalaisten Racket - koodausnäytteitä: "Death Star" ja lippuja
Osa kerholaisista jatkoi Racketin kanssa, joko maalaa-auto-funktioiden parissa tai ryhtyi opiskelemaan ufon laskeutumislogiikkaa näiden ohjeiden pohjalta. Yksi oppilas pääsi ufonsa kanssa jopa siihen pisteeseen, että hän pystyi ohjailemaan ufon laskeutumista nuolinäppäilillä oikealle ja vasemmalle! Vaikka saimmekin ufon laskeutumaan, huomasin että ohjeet eivät olleet riittävän tarkat jotta kerholaiset olisivat itsenäisesti voineet niitä seurata... Ja tältä ufon laskeutuminen näyttää valmiina:


Marraskuussa kerhomme osallistui myös Majava - kilpailuun. Kilpailu oli itselleni uusi tuttavuus mutta se toimi hienosti ja sopi hyvin toteutettavaksi yhdellä kerhokerralla. Tähän osallistumme myös ensivuonna!

Joulukuuhun mennessä 2D-hommat oli osan mielestä "jo niin nähty", että he halusivat että asennutan koulun koneille 3D-mallinnusohjelman (Blender). Varoittelin kerholaisia etukäteen siitä, että en osaa itse käyttää ko. ohjelmaa (vaikka olen kurssin käynytkin) mutta siitä huolimatta he saivat aikaan 3D - malleja, jopa animoituja sellaisia! Yksi oppilas kokeili myös ohjelmoida Blenderin pelilogiikka-moduulilla. Tässä yhden kerholaisen tekemä Blender-3D-animaatio:


Aivan kaikki eivät Blenderistä innostuneet vaan jatkoivat Racketillä koodaamista. Ennen joulua valmistui vielä pari koodattua joulukorttiakin:


Keväällä jatkamme koodailua ja uutena juttuna aloitamme Lego-robottien rakentamisen ja ohjelmoinnin. Jos saamme jotain valmista aikaan, voisimme yrittää osallistua myös keväällä järjestettävään  RoboCupJunior - kisaan. 

Kerhon vetäminen on ollut mukavaa mutta myös opettavaista. Olen saanut opetella olemaan vähemmän "opettaja" ja enemmän "ohjaaja". Jokainen kerholainen on saanut itse valita mitä tekee, ja olen opetellut ohjaamaan montaa eri juttua yhtäaikaa. Tästä johtuen en ole voinut suunnitella kerhokertoja juurikaan etukäteen. Toisaalta minulla on pitänyt olla takataskussa tasaisin väliajoin joitain "uutta kivaa". Silti kerholaiset yllättivät minut tekemällä sellaisia juttuja Blenderillä, joita en itse osaisi edes tehdä. Sain siis huomata, että vaikka kerhonvetäjän omat taidot ovat toki tärkeitä, kaikkein tärkeintä ovat kerholaisten omat ideat sekä motivaatio ja halu saada jotain toimivaa aikaiseksi. Mistä se motivaatio sitten syntyy, ja miten se pidetään hengissä? Ehkä sekin vielä selviää...

sunnuntai 28. joulukuuta 2014

Koodauksen ABC: 7. oppitunti

Tämä oli viimeinen oppituntimme ennen jakson vaihtumista, joten mitään uutta ja isoa emme olisi ehtineet aloittaa. Ajattelinkin että tässä olisi hyvä tilaisuus antaa oppilaiden tuunata omia pacman-pelejään haluamaansa suuntaan. Ilmeisesti olimme kuitenkin tehneet töitä liian kauan opettajajohtoisesti, että suurin osa oppilaista ei oikein osannut tai edes keksinyt mitä haluaisi pacmaniinsä lisätä. Yritin ehdotella uusia näppäinkomentoja, "Game over" - tekstiä yms. Lopulta yksi oppilaista tarttui "Game over" - tekstiin. Teksti lisätään kirjoittamalla uusi, viimeisen näkymän piirtävän funktio ja antamalla tämä parametrina stop-when:lle.

(define (piirrä-loppu tila)
  (overlay (text "Game Over" TEKSTI-KOKO "black") (piirrä-pacman tila)))


Teksti muutetaan ensin kuvaksi

Pienen mietinnän jälkeen yksi oppilas halusi lisätä pacmanille "syömisliikkeen" mutta hän ei osannut lähteä sitä itse koodaamaan joten ryhdyimme pohtimaan sitä yhdessä. Päädyimme siihen, että pelkät muuttuvat sektorit eivät anna oikeaa "syömisvaikutelmaa" vaan syövä pacman täytyy muodostaa kahdesta liikkuvasta puoliympyrän muotoisesta leuasta. Leukojen muotoiluun (crop, flip-horizontal, overlay/xy) ja niiden liikuttelun suunnittelemiseen hurahtikin sitten loppuaika, emmekä lopulta saaneet syövää pacmania edes valmiiksi. Ideana oli kuitenkin se, että leuat avautuvat vastakkaisiin suuntiin yhtä paljon (rotate). Uudet pacmanit näyttäisivät siis jotakuinkin tältä:

Syövät pacmanit

Keväällä jatkamme tätä kurssia, ja kysyinkin oppilailta että haluavatko he jatkaa pacman-pelin kimpussa vai koodaammeko jotain muuta. Kaikki halusivat jatkaa pacmanin kanssa, joten ilmeisesti keväällä teemme labyrinttejä, syömme namuja ja väistelemme haamuja. Joululomalla harjoittelin pacman-pelin koodaamista ja totesin, että siinä on edessä melkoinen määrä opittavaa sekä opettajalla että oppilailla! Saapa nähdä kuinka hienot pacman pelit saamme kevään aikana kokoon.

Tässä harjoitteluni tulos:






Koodauksen ABC: 6. oppitunti

Tämä oppitunti aloitettiin siirrä-pacman-funktion loppuun kirjoittamisella ja debuggauksella. Tässä vaiheessa monen oppilaan koodissa ilmeni ihmeellisiä asioita mm. yksi pacman lähti yllättäen liikkumaan viistosti ruudun poikki ja pääsimme miettimään sitä miksi päivitämme koodissamme kerrallaan vain x:ää tai y:tä.

Lopulta saimme jokaisen pacmanin liikkumaan ylös, alas, vasemmalle tai oikealle sen mukaan mitä LÄHTÖ-tilassa määrättiin. Tietenkään tämä ei ollut kovin mielenkiintoista, joten lisäsimme vielä näppäinohjauksen pacmanille. Teimme uuden funktion hoida-näppäimet, jossa käytimme taas vanhaa tuttua COND:ia. hoida-näppäimet - funktio lisättiin luonnollisesti myös big-bang:in kohtaan "on-key". Kulloinkin panettu näppäin saadaan big-bang:ltä tilan lisäksi.

;; hoida-näppäimet : sijainti key -> tila
(define (hoida-näppäimet tila n)
    ( .. ))

Painettu näppäin (n) saadaan big-bang:ltä
Tämän funktion implementoinnin ja testaamisen jälkeen pacman olikin jo valmis liikkumaan kaikkiin suuntiin ja "pelaaja" pystyi ohjailemaan pacmania nuolinäppäimillä. Viimeinen silaus pacmanille tehtiin korjaamalla lopetusehto sellaiseksi, että mihin tahansa neljästä reunasta ajautuminen lopettaa pelin (edellisten muutosten ajaksi olimme kommentoineet stop-when-koodin pois käytöstä).

Jotta lopetusehto olisi helpompi kirjoittaa ja lukea, otimme käyttöön lokaalit muuttujat. Tallensimme ensin pacmanin sijainnin paikallisiin muuttujiin x ja y. Sitten kokosimme ehdot pelikentän reunan ylittämiselle liudaksi ehtolauseita, jotka yhdistettiin loogisella operaattorilla or. Samalla muutimme lopetusehto-funktion nimen muotoon "peli-loppui?".
Otamme käyttöön lokaalit muuttujat sekä loogisen operaattorin OR
Lähes kaikki oppilaat saivat koodinsa toimimaan ja tältä se näyttää: