11
Racket – perusteet SOVELLUKSET A

Racket perusteet - Sovellukset A

Embed Size (px)

Citation preview

Page 1: Racket perusteet - Sovellukset A

Racket – perusteet SOVELLUKSET A

Page 2: Racket perusteet - Sovellukset A

2

Interaktiivisia sovelluksia

Jotta voimme tehdä interaktiivisia sovelluksia, joita käyttäjä ohjaa hiirellä tai näppäimistöllä tai joka reagoi tietokoneen sisäiseen kelloon, meillä pitää olla käytössä message loop, joka toimii ”liimana” oman koodimme ja tietokoneen laitteiston välillä. Racket:issä sen nimi on big-bang.

Interaktiiviset ohjelmat vaativat kirjaston 2htdp/universe

(require 2htdp/universe)

Page 3: Racket perusteet - Sovellukset A

big-bang pyörittää ohjelmaa

3

big-bang

(on-mouse ..)

(on-key ..)

(on-tick ..)

(to-draw ..)

Näillä ”liimataan”oma koodi big-bang:iin

ohjelman tilamuuttuja

Page 4: Racket perusteet - Sovellukset A

4

2htdp/universe Kirjasto sisältää big-bang:in lisäksi animate-funktion, jonka avulla voidaan tehdä yksinkertaisia animaatioita.

Racket perusteet tehtävissä otamme valmiin ohjelmapohjan, jossa big-bang tai animate on alustettu valmiiksi, joten emme käsittele niitä tässä yhteydessä kovin tarkasti (lisätietoa käsikirjassa).

Tärkeintä on ymmärtää se, että big-bang kutsuu käyttäjän tekemiä funktioita tarvittaessa, antaa niille ohjelman tilamuuttujan, ottaa vastaan päivitetyn tilamuuttujan, pitää sen tallessa ja välittää sen muille funktioille. Tilamuuttuja on eri ohjelmissa erilainen, riippuen ohjelman tarpeista.

Page 5: Racket perusteet - Sovellukset A

5

animate(aika muuttujana)

animate – funktio kutsuu siihen ”liimattua” funktiota 28 kertaa sekunnissa antaen argumenttina kokonaisluvun, joka kasvaa jokaisella kutsukerralla yhdellä

Esim.

(animate kuva)

Kutsuu kuva-funktiota näin:(kuva 0)(kuva 1)(kuva 2)(kuva 3) ...

(define (kuva t) (place-image

(circle t ”solid” ”red”) 150 150

(empty-scene 300 300)))

”liima” oma koodi

Page 6: Racket perusteet - Sovellukset A

6

modulo Animaatioissa on usein jakso, joka toistuu. Aika kulkee kuitenkin aina eteenpäin, joten jos haluamme palata takaisin lähtöpisteeseen (aika = 0) tarvitsemme modulo:a. Modulo ottaa osamäärän jakojäännöksen, eli rajoittaa arvon tietylle välille.

Esim.

Lisätään apufunktio ”rullaava-kuva”:

(define (rullaava-kuva t) (kuva (modulo t 220)))

(animate rullaava-kuva) animate:ssa tilamuuttujana on aika

Page 7: Racket perusteet - Sovellukset A

7

place-image ja empty-scene

(place-image 150 250 (empty-scene 300 500)))

(0, 0)

(150, 250)

x

y

150

250

Page 8: Racket perusteet - Sovellukset A

(0, 0)

(150, 50)

x

y

150

250

(0, 0)

(150, 250)

x

y

150

250

(0, 0)

(150, 450)

x

y

150

250

Kun y muuttuu, ufo liikkuu...

y=50 y=250 y=450

Page 9: Racket perusteet - Sovellukset A

9

big-bang(animaatio)

(require 2htdp/image) (require 2htdp/universe)   (define UFO (overlay/xy  (ellipse 120 40 "solid" "violet")      30 -25      (circle 30 "outline" "black")))

(define (piirrä-kuva y)   (place-image UFO 150 y (empty-scene 300 500)))

(define (siirrä-ufo y) (+ y 1))

(big-bang 0           (to-draw piirrä-kuva)           (on-tick siirrä-ufo))

Enemmän mahdollisuuksia, kuntilamuuttujana voi olla muukin kuin aika

lähtötila, y=0siirrä-ufo-funktiota kutsutaan 28 kertaa sekunnissa

Page 10: Racket perusteet - Sovellukset A

10

ufo rullaa(muutetaan y:tä)

Lisää ehtolause tai valintalause ufon y-koordinaatin päivittämiselle: (define (siirrä-ufo y) (if (< y 500) (+ y 1) 0))

tilamuuttujana y

piirrä-kuva – funktio tuottaa tämän kuvan

siirrä-ufo – funktio päivittää y:tä

big-bang hoitaa kaiken muun

Page 11: Racket perusteet - Sovellukset A

11

big-bang(hiiriohjelma)

Saamme ”liimakoodin” kautta x ja y koordinaatit, jossa hiiri on tai jossa sitä on klikattu. Tämän perusteella voidaan muuttaa ohjelman toimintaa.

Ohjelman logiikka on ”hiiri” – funktiossa:

(define (hiiri k x y tapahtuma)

(if (< x 150)

(place-image (oma-kuva "black") x y k)

(place-image (oma-kuva "red") x y k)))

(big-bang KUVA

(to-draw piirrä)

(on-mouse hiiri))tilamuuttujana on nyt kuva