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 |
(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ä :-)