keskiviikko 28. tammikuuta 2015

Koodauksen ABC: 10. oppitunti

Tällä viikolla palasimme takaisin pacman-pelin suunnitteluun. Aloitimme suunnittelemalla pelikentän labyrintin ruutupaperille. Jokainen teki omanlaisensa pelikentän:

Suunnitelmat
Jotta saisimme peliä hieman yksinkertaisemmaksi, siirryimme tässä vaiheessa ajattelemaan peliä ruudukkona, jossa jokainen ruutu on joko seinää tai käytävää. Käytäväruudussa voi olla, joko pacman, namu ja/tai haamu. Tästä eteenpäin koordinaatit eivät enää olisikaan suoraan pikseleitä ruudulla vaan loogisia sijainteja "grid":ssä ja skaalaisimme loogiset koordinaatit pikseleiksi skaalaa-apufunktion avulla. Tätä varten määritimme RUUTU-vakion, jota käytettiin skaalaa-funktiossa (grid-ruudun koko pikseleissä):

(define RUUTU 40)

(define (skaalaa x)
  (* RUUTU x))


Sitten mietimme miten voisimme tallentaa seinien sijainnit. Koska tähän asti olemme opiskelleet vasta struct:in ja listan niin eipä ollut vaikea keksiä, että mitäpä jos seinäpalojen koordinaatit tallennettaisiin "paikka"-structiin ja näistä tehtäisiin lista. Aluksi teimme kokeeksi listan, jossa oli vain kolme paikkaa, jos tämä toimisi, paikkoja voisi kirjoittaa helposti lisää.

(define-struct paikka (x y))

(define SEINÄ-LISTA
  (list (make-paikka 2 3)
        (make-paikka 3 3)
        (make-paikka 4 3)))


Sitten piti vain kirjoittaa koodi yhden seinäpalan piirtämiselle ruudulle eli määrittelimme piirrä-seinäpala-funktion:

(define SEINÄPALA (rectangle RUUTU RUUTU "solid" "black"))

;; piirrä-seinäpala : paikka kuva -> kuva
(define (piirrä-seinäpala p tausta)
  (place-image SEINÄPALA (paikka-x p) (paikka-y p)  tausta))


Tässä vaiheessa piti kerrata syksyltä struct:in käyttö sekä funktion parametrien tyypit ja paluuarvo. Tämä asia näytti olevan edelleen vaikeaa ymmärtää.

Ja viimeisenä teimme rivin joka piirsi kaikki seinäpalat pelikentälle. foldl-funktio ottaa parametrina piirtofunktion (piirrä-seinäpala), tyhjän pelikentän (PELIPOHJA) sekä listan seinäpalojen paikka-structeja (SEINÄ-LISTA). Se käsittelee listan alkioit yksi kerrallaan eli kutsuu piirrä-seinäpala-funktiota niin monta kertaa kuin annetussa listassa on alkioita. Annettu parametri PELIPOHJA on ns. lähtötilanne ja se annetaan niin ikään parametrina piirrä-seinäpala:lle. Syntyvä kuva siis ikäänkuin "laskostuu" alkutilanteen päälle, eli tämä on taas yksi tapa tehdä loop ja käyttää "akkumulaattoria". En tiedä ymmärsikö yksikään oppilas tätä mutta koodi oli lyhyt kirjoittaa ja se toimi hyvin :-)

(foldl piirrä-seinäpala PELIPOHJA SEINÄ-LISTA)

PELIPOHJA:aan teimme kiinteät reunat laittamalla empty-scene:llä tehdyn värillisen pohjan päälle valkoisen suorakulmion.

(define PELIN-LEVEYS 18)
(define PELIN-KORKEUS 9)

(define POHJA
  (empty-scene (skaalaa (add1 PELIN-LEVEYS))
               (skaalaa (add1 PELIN-KORKEUS))
               "black"))

(define PELIPOHJA
  (overlay (rectangle (skaalaa PELIN-LEVEYS) 

                      (skaalaa PELIN-KORKEUS) 
                      "solid" "white") 
           POHJA))

PELIPOHJA valmiina (siniset ruudut on lisätty selkeyden vuoksi)

Ja tässä kuvaa siitä miltä pelikentän koodausnäytti:

Pelikentän koodausta DrRacketillä

Teimme myös kuvat namuille ja latasimme haamut tästä linkistä, mutta emme ehtineet asettelemaan niitä vielä pelikentälle. Niitä ihmettelemme ensiviikolla. 

Ei kommentteja:

Lähetä kommentti