perjantai 13. helmikuuta 2015

Koodauksen ABC: 12. oppitunti

Tällä tunnilla yhdistimme kevään kenttäkoodin ja syksyn pacman-koodin samaan tiedostoon.  Avasimme molemmat tiedostot auki DrRacket:iin ryhdyimme siirtämään koodia pala kerrallaan vanhasta uuteen. Aivan suoraan emme voineet koodia kopioida, koska emme olleet syksyllä ottaneet huomioon aivan kaikkea...

Ensimmäinen korjattava asia oli tietorakenteet. Syksyllä olimme ottaneet käyttöön sijainti-structin,  jossa oli kentät x, y ja suunta. Keväällä olimme ottaneet käytöön paikka-structin, jossa myös oli käytössä x ja y. Jotta pääsisimme vertailemaan onko pacman (sijainti) samassa ruudussa seinän (paikka) tai namun kanssa (paikka) olisi parempi jos molemmat olisivat samaa tietotyyppiä. Poistimme siis sijainti-structin ja otimme tilalle hahmo-structin, joka on paikka-struct johon on lisätty suunta-kenttä. Huomaa, että tällaista "kenttien periyttämistä" ei voi määritellä "define-struct":lla. Myös haamut olisivat tyyppiä hahmo.

(struct hahmo paikka (suunta))  
 
Aloitimme yhdistämisen anna-pacman - funktiosta. Kopioimme ensin kaikki define:t mitä pacmanin piirtämiseen tarvittiin ja testasimme, että edelleen saimme ylös, alas, vasemmalle ja oikealle katsovia pacmanejä. Sitten korjasimme LÄHTÖ - structin, käyttämään uutta hahmo - structia.

(define LÄHTÖ
  (hahmo 1 1 OIKEALLE))

  
Koska syksyn pacman oli tehty liikkumaan vapaasti missä tahansa, jouduimme muuttamaan piirrä-pacman-funktion käyttämään skaalausta.

;; piirrä-pacman : hahmo -> kuva
(define (piirrä-pacman tila)
  (place-image (anna-pacman
               (hahmo-suunta tila))
               (skaalaa (paikka-x tila))
               (skaalaa (paikka-y tila))
               SEINÄT))


Nyt saatoimme jo testata em. funktiota REPL:ssä LÄHTÖ-tilanteella. Pacman oli monella oppilaalla hieman liian iso tai liian pieni, joten tässä vaiheessa sen kokoa säädettiin sopivaksi.

> (piirrä-pacman LÄHTÖ)

Pacman pääsi labyrinttiin
Jotta pacman lähtisi liikkeelle, kopioimme vielä siirrä-pacman - funktion ja muokkasimme sen käyttämään uutta hahmo-structia. Vaihdoimme myös funktion nimeksi liikuta-hahmoa, koska haamuakin voitaisiin siirtää käyttämällä tätä funktiota. Vaihdoimme myös NOPEUS-vakion arvoksi 1, koska nyt pacman liikkuisi aina seuraavaan ruutuun. Lopuksi kopioimme vielä big-bang- kutsun. Nyt pacman liikkuikin jo niin nopeasti, että hidastimme animaatiota lisäämällä HIDASTUS-arvon.

(define HIDASTUS 0.2)
(big-bang LÄHTÖ
          (on-draw piirrä-pacman)
          (on-tick liikuta-hahmoa HIDASTUS))


Seuraavaksi tarvitseekin enää tehdä em. muutokset hoida-näppäimet - funktiolle, ja sitten vanha pacman-koodi onkin käytetty hyödyksi. Pacman ei kuitenkaan vielä huomaa seiniä eikä namuja, ja namujen piirtämiseenkään ei ole vielä tehty kunnon funktiota. Näihin keskitymme seuraavalla tunnilla.

Aluksi mietin, että tämä tunti on varmasti turhauttava, koska korjaamme jo ns. kerran toiminutta koodia, mutta itseasiassa vanhaan koodiin palaaminen toi hyvin esille määrittelyjen merkityksen, jos unohti kopioida yhden define:n, koodi ei kääntynytkään enää, tai jos liitti sen väärään kohtaan, sekään ei toiminut. Myös big-bang:in toiminta animaation aikaansaamisessa ehkä valkeni hieman paremmin kuten myöskin kirjaston merkitys (big-bang vaatii 2htdp/universe-kirjaston). Ja taas lopputunnista yksi oppilas yllätti osaamisellaan, hän omatoimisesti lisäsi näppäin-toiminnot pacmaniinsä :-)

Ei kommentteja:

Lähetä kommentti