tiistai 2. syyskuuta 2014

Koodauksen ABC: 3. oppitunti

Kolmannella oppitunnilla opettelimme miten ufon saa laskeutumaan ruudun yläreunasta alas ja  pysähtymään ruudun alareunaan. Teimme koodin yhdessä pala palalta ja vaikka olin tehnyt aikaisemmin ohjeet ufon laskeutumiselle, huomasin meneväni asioita aivan erilailla kuin ohjeessa (Lataa ufo-animaation ohje).

Lähdin liikkeelle siitä, että selitin miten Racketin 2htdp/universe - kirjaston big-bang toimii. Tähänastihan olimme tehneet vain ohjelmanpätkiä, jotka tekevät jotain ja lopettavat toimintansa heti eli niissä ei ole ollut ns. message loop:ia, joka jäisi kuuntelemaan käyttäjän näppäinten painalluksia tai tietokoneen kellon "tikitystä". big-bang - funktio käynnistää tällaisen loopin. 

big-bang:in avulla voi tehdä interaktiivisia ohjelmia
Jotta big-bang tietäisi mitä milloinkin pitää tehdä, ohjelmoijan on kirjoitettava muutama funktio. Aloitimme kirjoittamalla ainoan pakollisen funktion, eli sen miten näyttöä päivitetään, kun vuorossa on toiminto to-draw. Koska tehtävänä oli saada ufo laskeutumaan ruudun yläreunasta alaspäin, kirjoitimme piirrä-ufo - funktion. 
Tämä oli ensimmäinen oppilaiden itsensä kirjoittama funktio, joten käytimme ensin aikaa muuttuja - käsitteen sisäistämiseen. Harjoittelimme ufon laskeuttamista ns. "manuaaliohjauksella" eli määrittelimme ensin define:llä muutaman vakion (KORKEUS, LEVEYS, KENTTÄ) sekä ufon kuvan (UFO) ja sitten kirjoitimme DrRacketin alempaan ikkunaan rivin koodia, joka piirsi UFO:n kentälle. Tehtävänä oli ajaa koodirivi uusilla parametreilla niin kauan kunnes ufo pääsi maanpinnalle. 




Nyt olikin jo paljon helpompaa miettiä, mikä voisi olla piirrä-ufo - funktion muuttuja. Valitsimme muuttujan nimeksi tila, ja kirjoitimme ensimmäisen funktion. Sitä myös testattiin heti kutsumalla sitä eri muuttujan arvoilla DrRacketin alemmasta ikkunasta. Ja sehän toimi! Tämän jälkeen kirjoitimme funktiolle myös kuvauksen kommenttiriville. Funktiota on jatkossa helpompi käyttää, kun merkitsee tällä tavalla funktion nimen (piirrä-ufo), parametrien tyypit (numero) ja paluuarvon tyypin (kuva). 

;; piirrä-ufo : numero -> kuva
(define (piirrä-ufo tila)
        (place-image UFO 250 tila KENTTÄ))

Kokeilimme tätä funktiota big-bang:in kanssa. Ja tietenkään ufo ei liikahtanutkaan.

(big-bang 0 
         (to-draw piirrä-ufo))

Pienen mietinnän jälkeen oli selvää, että kukaan tai mikään ei koskaan muuta tilaa, ja näin pääsimme tekemään siirrä-ufo - funktiota. Tämä on se funktio, jota big-bang kutsuu on-tick:llä, eli se toteutaa asioita, jotka muuttuvat ajan funktiona. Tässä vaiheessa piti miettiä miten tila ufon laskeutuessa muuttuikaan, ja päädyimme yhteenlaskuun (y-koordinaatithan kasvavat alaspäin kuljettaessa Racket:issa):

;; siirrä-ufo : numero -> numero
(define (siirrä-ufo tila)
        (+ tila ASKEL))

Lisäsimme uuden rivin big-bangiin ja nyt ufo lähti tosiaan liikkeelle mutta katosi maanpinnan alle!

(big-bang 0 
         (to-draw piirrä-ufo)
         (on-tick siirrä-ufo))

Viimeinen uusi asia tällä tunnilla oli big-bang:in lopetusehdon kirjoittaminen eli stop-when. Funktion nimeksi valittiin  maassa?. Nimessä oleva kysymysmerkki kertoo siitä, että se palauttaa ns. boolean arvon. Vaikka boolean - arvot eivät olleet entuudestaan tuttuja, oppilaiden tuntui olevan melko helppo ymmärtää, että jokin matemaattinen lauseke voi olla true tai false. Tällainen lopetusehdosta tuli:

;; maassa? : numero -> boolean
(define (maassa? tila)
            (>= tila MAANPINTA))

Ja big-bangiin lisättiin taas yksi uusi rivi:

(big-bang 0 
         (to-draw piirrä-ufo)
         (on-tick siirrä-ufo)
         (stop-when maassa?))

Nyt ufo saatiin laskeutumaan maanpinnalle. Jokaisella oppilaalla oli hieman eri kokoinen KENTTÄ, joten he saivat itse etsiä sopivan arvon MAANPINTA-vakiolleen.

Tässä kaksoistunnissa oli hirveästi asiaa, ja tunnin lopuksi oppilaat olivat hieman pyörällään päästä. Ehkäpä jatkossa pitäisi yrittää tehdä pienempiä kokonaisuuksia :-)

Ei kommentteja:

Lähetä kommentti