Racket ohjelmointia osa 2 Tiina Partanen Lielahden koulu 2014
Sisältö 1) Funktiot ja muuttujat (kertaus) 2) Animaatiot & pelit (big-bang) 3) Vertailuoperaattorit sekä boolean arvot 4) Tietorakenteet (struct) 5) Haarautuminen (cond) 6) Loogiset operaattorit and ja or 7) If ja rekursio 8) Lopputeksti 2
1. Funktio ja muuttuja (kertaus) Määrittele UFO-niminen kuva ja KENTTÄ-niminen empty-scene Laskeuta UFO manuaaliohjauksella alas kuvaruudun yläreunasta alas Kirjoitetaan funktio, joka piirtää ufon eri kohtiin ruutua ;; piirrä-ufo : numero -> kuva (define (piirrä-ufo..) (.. )) Lataa ufokuva tästä.
#lang racket (require 2htdp/image) (require 2htdp/universe)
(define UFO ) Kuvan lisääminen DrRacket:ssä: Valitse Insert Insert image
(empty-scene 500 300) 300 500
(place-image UFO 250 0 KENTTÄ) 0 250
(place-image UFO 250 50 KENTTÄ) 50 250
(place-image UFO 250 250 KENTTÄ) 250 250
Koodaushaaste 1 Etsi y:n arvo, jolla saat ufon laskeutumaan maanpinnalle niin, että sen pohja koskettaa maata. Määrittele löytämäsi luku vakioksi MAANPINTA.
2. Animaatiot ja pelit (big-bang) big-bang funktio mahdollistaa interaktiiviset pelit ja animaatiot. Se kutsuu ohjelmoijan itsensä kirjoittamia funktioita, kun jotakin tarvitsee tehdä. (big-bang LÄHTÖ (to-draw..) (on-tick..) (on-key..) (stop-when..)) piirrettävä näytölle aika kuluu käyttäjä painoi näppäintä lopetusehto
2htdp/universe : big-bang (on-tick..) big-bang (on-key..) (to-draw..) (stop-when..)
Kirjoitettava omia funktioita lähtötila (big-bang 0 (to-draw piirrä-ufo) (on-tick siirrä-ufo) (stop-when maassa?)) (define (piirrä-ufo tila )..) (define (siirrä-ufo tila )..) (define (maassa? tila )..)
Funktion parametrit ja paluuarvot Kun big-bang kutsuu ohjelmoijan omia funktioita, se antaa parametrina pelin tilan. Laskeutuvan ufo:n tila voidaan ilmoittaa yhdellä numero:lla (ufon y-koordinaatti). y-koodinaatti on siis funktioidemme muuttuja eli parametri. Funktioiden pitää palauttaa big-bang:lle tietyntyyppisiä paluuarvoja. Racket ei vaadi ohjelmoijaa kertomaan parametrien tyyppejä koodissa mutta on hyvä tapa kirjoittaa ne näkyviin kommenttiriville ennen funktion määrittelyä. ;; piirrä-ufo : numero -> kuva ;; siirrä-ufo : numero -> numero ;; maassa? : numero -> boolean
UFO laskeutuu 1) (define UFO..) 2) (define KENTTÄ..) 3) (define (piirrä-ufo tila)..) 4) (define (siirrä-ufo tila)..) 5) (bigbang 0 (to-draw..) (on-tick..)) UFO laskeutuu scenen yläreunalta alas (ei pysähdy vielä maahan)
3. Vertailuoperaattorit sekä boolean arvot Jotta ufo saadaan pysähtymään maan pinnalle on käytettävä vertailuoperaattoria Vertailuoperaattoreita ovat: <, >, <=, >=, = Jos väite on totta, paluuarvo on true, jos epätosi false Esim. (< 2 3) palauttaa true Kirjoita funktio, joka testaa onko ufo maassa: ;; maassa? : numero -> boolean
UFO pysähtyy maanpinnalle Jotta UFO saadaan pysähtymään maanpinnalle, lisätään lopetusehto (stop-when) 1) (define (maassa? tila)..) 2) (bigbang 0 (to-draw..) (on-tick..) (stop-when..)) UFO laskeutuu ja pysähtyy maanpinnalle
Koodaushaaste 2 Muuta koodia niin, että UFO lähteekin maanpinnalta ylöspäin ja pysähtyy kuvan yläreunaan.
TILAMUUTTUJAT? Miten ufo saadaan menemään myös vasemmalle ja oikealle?
TILAMUUTTUJAT? Jotta ufo saadaan kulkemaan saman animaation/pelin aikana sekä ylhäältä alas, että vasemmalta oikealle, tarvitaan lisää tilamuuttujia (y:n lisäksi tarvitaan myös x). Nämä pitää tallentaa samaan tietorakenteeseen. Sijainti x y
4. Tietorakenteet (struct) MÄÄRITELLÄÄN TIETORAKENNE: (define-struct sijainti (x y)) LUODAAN TIETORAKENNE: (make-sijainti 0 0) Tallennetaan uudet tilatiedot tietorakenteeseen (struct) VIITATAAN TIETORAKENTEEN KENTTÄÄN: (sijainti-x..) (sijainti-y..) EI VIELÄ LISÄÄ UUTTA TOIMINNALLISUUTTA
Tietorakenteen (struct) käsittely Luodaan tietorakenne, annetaan kentille alkuarvot, annetaan sille nimi: (define LÄHTÖ(make-sijainti 100 200)) LÄHTÖ sijainti Kenttien sisältämän tiedon saa ulos kutsumalla funktiota, jonka nimi muodostuu structin ja kentän nimestä: (sijainti-x LÄHTÖ) 100 200 sijainti 100 (sijainti-y LÄHTÖ) 200
5. Haarautuminen (cond) Jotta ufoa voi ohjata näppäimillä oikealle ja vasemmalla, tarvitsemme funktion, joka hoitaa näppäimen painallukset (on-key) Cond-rakenteella koodi saadaan haarautumaan (cond [( ehtolause ) (.. )] [( ehtolause ) (.. )] [( ehtolause ) (.. )] [else..])
Ufon ohjaaminen oikealle ja vasemmalle (cond [(key=? n left")(make-sijainti..)] [(key=? n right")(make-sijainti..)] [else (make-sijainti..)])
Koodaushaaste 3 Lisää laskeutuvalle ufolle kaasunappi, joka saa se nousemaan ylöspäin (esim. nuolinäppäin up tai välilyönti )
6. Loogiset operaattorit and ja or Nyt kun ufo leijuu, se pitää saada pysymään ilmassa niin, ettei se kosketa mihinkään seinään. Lopetusehdon voi laatia käyttämällä loogista operaattoria or. (define (loppu? tila) (define x (sijainti-x tila) (define y (sijainti-y tila) (or (<= x YLÄREUNA) (>= x ALAREUNA) (<= y VASENREUNA) (>= y OIKEAREUNA))) Lokaalit apumuuttujat tekevät koodista luettavampaa.
7. If ja rekursio Ohjelmointikielissä on monta tapaa tehdä silmukoita eli looppeja. Yksi on rekursio. Kokeile oheista koodinpätkää tällä kuvalla. Rekursion lopetus ehdossa on käytössä myös if. (define (pyöritä-kuvaa kulma kohta kuva taulu) (if (>= kulma 360) taulu (pyöritä-kuvaa (+ kulma 45) (- kohta 110) kuva (overlay/xy (rotate kulma kuva) kohta -10 taulu)))) Kutsu funktiota esim. näin: (pyöritä-kuvaa 60 0 (empty-scene 720 80))
8. Lopputeksti Pelin tai animaation loppuun voi laittaa lopputekstin (text Game over 78 blue ) Tämä funktio palauttaa kuvan, jonka voi liittää overlay/xy:llä toisen kuvan päälle Pelin viimeisen ruudun piirtofunktio annetaan stop-when funktiolle parametrina: (define (piirrä-loppukuva..) (.. )) (big-bang.. (stop-when loppu? piirrä-loppukuva))
Koodaushaaste 4 Tee uusi maalaa-auto - funktio, joka ottaa auton renkaiden ja korin värin lisäksi myös mainostekstin sekä tekstin värin. ;; maalaa-tekstiauto : teksti t-väri r-väri k-väri -> kuva Vihje: Kutsu vanhaa maalaa-auto funktiota tämän uuden funktion sisältä.
Koodaushaaste 5 Pistä autosi ajamaan ruudun vasemmasta reunasta oikealle ja pysähtymään ennen kuin autosi katoaa kokonaan. Koodaushaaste 6 Tee autolle kaasu ja jarru. Kun kaasua painetaan se lähtee liikkeelle, ja kun jarrua painetaan se pysähtyy. Vinkki 1: näppäimet k ja j voivat olla kaasu ja jarru Vinkki 2: tarvitset enemmän kuin yhden tilamuuttujan
Lähteet 1) Ufo-kuva OpenClipArt - sivuilta: 2) Racket - ohjelmointiohjeita Realm of Racket - kirjasta: http://openclipart.org/detail/20150/ufo-in-cartoonstyle-by-rg1024 http://www.amazon.com/realm-racket-learn- Program-Game/dp/1593274912