Koodarit palasivat hiihtoloman ja toimintailtapäivän jälkeen sorvin ääreen ja jatkoimme pacmanien kanssa. Tällä tunnilla tekisimme suuren hyppäyksen pelkästä pacmanin liikuttelusta koko pelin pyörittämiseen, joten otimme käytöön uuden peli - structin. Tätä tarvittaisiin, jotta voisimme pitää muistissa mitkä namut on vielä syömättä, paljonko meillä on pisteitä koossa, missä haamut majailevat ja onko pacman edes elossa enää.
;; namut : paikka-lista
;; haamut : hahmo-lista
;; pisteet : numero
;; elossa? : boolean
(struct peli hahmo (namut haamut pisteet elossa?))
Big-bang saisi tästä eteenpäin tämänlaisen structin sisäänsä, joten muutimme LÄHTÖ-tilan käyttämään uutta structia. Asetimme toistaiseksi haamut-listan tyhjäksi.
(define LÄHTÖ
(peli 1 1 OIKEALLE namu-lista '() 0 true))
Koska emme olleet vielä tehneet namujen piirtoon kunnon funktiota, teimme sen nyt muokkaamalla sen vanhasta TESTI:stä.
;; namunpiirtäjä : paikka-lista -> kuva
(define (namunpiirtäjä namulista)
(foldl piirrä-namupala SEINÄT namulista))
ja otimme uuden namunpiirtäjä - funktion käyttöön piirrä-pacman - funktiossa:
;; piirrä-pacman : peli -> kuva
(define (piirrä-pacman tila)
(place-image (anna-pacman
(hahmo-suunta tila))
(skaalaa (paikka-x tila))
(skaalaa (paikka-y tila))
(namunpiirtäjä (peli-namut tila))))
Nyt pääsimme korjaamaan hoida-näppäimet - funktiota, muutimme sitä niin että se palauttaa peli - structin.
;; hoida-näppäimet : peli -> peli
(define (hoida-näppäimet tila n)
(define p-suunta (hahmo-suunta tila))
(cond [(key=? n "up")
(peli (paikka-x tila)
(paikka-y tila)
YLÖS
(peli-namut tila)
(peli-haamut tila)
(peli-pisteet tila)
(peli-elossa? tila))]
... jne
Koska nyt pelissä tapahtuisi paljon muutakin kuin vain pacmanin liikkuminen, teimme uuden funktion päivitä-peli, joka korvaisi liikuta-hahmo - funktion (huom! jätimme liikuta-hahmo:n kuitenkin apufunktioksi. Tämä funktio toimii niin, että ensin laskemme uuden sijainnin pacamanille vanhan liikuta-hahmo - funktion avulla, sitten testaamme että onko uudessa ruudussa seinäpala, ja jos on emme liiku siihen (else-haara), jos taas ei ole siirrymme siihen (not seinä?). Seinän testaaminen tehdään onko-seinä? - funktiolla, ja sen teemme ensikerralla. Ensi kerralla lisäämme logiikan myös namujen havaitsemiseen sekä niiden syömiseen.
;; päivitä-peli : peli -> peli
(define (päivitä-peli tila)
(define pacman (liikuta-hahmo tila))
(define seinä? (onko-seinä? pacman))
(cond [(not seinä?)
(peli (paikka-x pacman)
(paikka-y pacman)
(hahmo-suunta tila)
(peli-namut tila)
(peli-haamut tila)
(peli-pisteet tila)
(peli-elossa? tila))]
... jne
Tässä vaiheessa kurssia on jo selvää, että emme saa koko pacman-peliä valmiiksi. Haamut jäävät auttamatta pois, mutta toisaalta jos saamme edes namuja syövän, labyrintissa kulkevan pacmanin on se jo aivan huimaa!!!
Ei kommentteja:
Lähetä kommentti