Suunnitelmat |
(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) |
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