Ohjelmointi 1: Olipa kerran olio

Samankaltaiset tiedostot
Java-kielen perusteet

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Javan perusteita. Janne Käki

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

7. Näytölle tulostaminen 7.1

Olio-ohjelmointi Javalla

Sisältö. 22. Taulukot. Yleistä. Yleistä

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Sisältö. 2. Taulukot. Yleistä. Yleistä

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

17. Javan omat luokat 17.1

Ohjelmoinnin jatkokurssi, kurssikoe

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Java-kielen perusteet

Java-kielen perusteita

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

9. Periytyminen Javassa 9.1

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

16. Javan omat luokat 16.1

Ohjelmointi 2 / 2010 Välikoe / 26.3

17. Javan omat luokat 17.1

Luokat ja oliot. Ville Sundberg

Taulukot. Jukka Harju, Jukka Juslin

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Metodien tekeminen Javalla

Tietorakenteet (syksy 2013)

Mikä yhteyssuhde on?

Java-kielen perusteita

Taulukoiden käsittely Javalla

ITKP102 Ohjelmointi 1 (6 op)

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Listarakenne (ArrayList-luokka)

1. Omat operaatiot 1.1

Ohjelmoinnin perusteet, syksy 2006

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

1 Tehtävän kuvaus ja analysointi

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

ITKP102 Ohjelmointi 1 (6 op)

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

14. Poikkeukset 14.1

KOHDELUOKAN MÄÄRITTELY

Sisällys. 15. Lohkot. Lohkot. Lohkot

Java kahdessa tunnissa. Jyry Suvilehto

Java-kielen perusteet

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

9. Periytyminen Javassa 9.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

15. Ohjelmoinnin tekniikkaa 15.1

Taulukot, silmukat ja muut joka koodin pikku veijarit

Java-API, rajapinnat, poikkeukset, UML,...

ITKP102 Ohjelmointi 1 (6 op)

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

15. Ohjelmoinnin tekniikkaa 15.1

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

12. Monimuotoisuus 12.1

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

14. Poikkeukset 14.1

Rajapinta (interface)

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Taulukot. Taulukon käsittely. Tämän osan sisältö. Esimerkki. Taulukon esittely ja luonti. Taulukon alustaminen. Taulukon koko

ITKP102 Ohjelmointi 1 (6 op)

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

4. Luokan testaus ja käyttö olion kautta 4.1

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Ohjelmoinnin perusteet Y Python

Ohjelmointi 1 C#, kevät 2013, 2. tentti

58131 Tietorakenteet ja algoritmit (syksy 2015)

Ohjelmoinnin perusteet Y Python

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

8. Näppäimistöltä lukeminen 8.1

Ohjelmoinnin perusteet Y Python

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Standardi- ja tietorakenneluokkia

Ohjelmoinnin perusteet, kurssikoe

Oliot viestivät metodeja kutsuen

Luokan muodostimet (Constructors)

19. Olio-ohjelmointia Javalla 19.1

Periytyminen (inheritance)

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Ohjelmoinnin perusteet Y Python

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Transkriptio:

Ohjelmointi 1: Olipa kerran olio Taustaa Ensimmäisten neljän kotitehtäväkierroksen ohjelmointitehtävät liittyvät seikkailupelimaailmaan. Seikkailupeli on keinotekoinen maailma, joka koostuu paikoista, olennoista ja esineistä. Pelin pelaaja ohjaa yhtä olentoa; tietokone tai mahdolliset muut pelaajat ohjaavat toisia olentoja. Olennot liikkuvat paikoissa ja käyttävät esineitä erilaisten tehtävien suorittamiseen. Yleensä pelillä on jokin tavoite, esimerkiksi aarteiden kerääminen, toisten olentojen kukistaminen ja vastaan tulevien ongelmien ratkaiseminen. Koska tämä on ensimmäinen harjoitus, emme pyri luomaan kokonaista seikkailupeliä vaan ainoastaan tiettyjä pelissä tarvittavia luokkia ja niihin liittyviä attribuutteja ja metodeja. Käsiteltävät luokat ovat Esine ja sen aliluokat sekä Olento. Pelimaailman olioita Pelimaailma koostuu olioista, jotka ovat seuraavien luokkien ilmentymiä: Esine Taikajuoma Tynnyri Puukko Olento Pelissä käsiteltävien esineiden yläluokka. Useimmiten esineitä ei luoda suoraan tästä luokasta vaan sen aliluokista. Kullakin esineellä on nimi ja paino. Maukas luonnontuote. Pelimaailmassa on useita erilaisia taikajuomia niin painoltaan kuin maultaan. Pelin olennot juovat taikajuomaa saadakseen lisää elinvoimaa. Jotkin taikajuomat ovat kuitenkin myrkyllisiä ja tarjoavat juojalleen epämukavan yllätyksen. Maaginen säilytysesine. Tynnyriä tökkäämällä voi hankkia itselleen uusia esineitä; koskaan ei kuitenkaan voi tietää, millaisen esineen saa. Perinteinen härmäläinen esine, jota käyttämällä sen kantaja saa keinon puolustaa itseään. Valitettavasti moni käyttää näitä hyökätäkseen toisten kimppuun. Pelissä toimivien olentojen luokka. Kullakin olennolla on nimi sekä elinvoima, joka kuvaa olennon senhetkistä fyysistä kuntoa. Jos elinvoima pääsee loppumaan, olento kuolee. Tätä voi yrittää ehkäistä juomalla pelimaailmasta löytyviä taikajuomia, jotka kasvattavat elinvoimaa. Myrkylliset taikajuomat toimivat valitettavasti juuri päinvastoin. Olennon elämän keskeinen sisältö on taistelu kanssaolentoja vastaan. Tämä tapahtuu yleensä puukon antamien lisävoimien avulla. 1

Osatehtävä 1: Luokka Esine Tässä osatehtävässä tarvitset seuraavien asioiden hallintaa: Luokan ja olion käsitteet (engl. class, object). Attribuutin eli ominaisuusmuuttujan käsite (engl. attribute). Näkyvyysmääreet, erityisesti public ja private (engl. visibility modifiers). Metodin käsite (engl. method). Saanti- ja asetusmetodit. Koska tässä harjoituksessa käytämme ohjelman nimissä suomea, ovat saanti- ja asetusmetodien (engl. getters and setters) nimet muotoa annaxxx ja asetaxxx, missä xxx on käsiteltävän attribuutin nimi. Näistä edellinen palauttaa arvonaan attribuutin arvon ja jälkimmäinen asettaa sille uuden arvon. Sijoituslause (engl. assignment). Merkkijonot (String) ja niiden muodostaminen. Metodi tostring(). Pääohjelmametodi main. Muodosta luokka Esine, jolla on seuraavat attribuutit eli ominaisuusmuuttujat: String nimi Esineen nimi tai muu esinettä kuvaava merkkijono. double paino Esineen paino. Määritä attribuuttien näkyvyys niin, että niitä voidaan käsitellä suoraan vain tässä luokassa muualle ne eivät saa näkyä. Määritä lisäksi seuraavat metodit, jotka ovat käytettävissä kaikkialla (myös tämän luokan ulkopuolella): Esine(String nimi, double paino) Luontimetodi eli konstruktori (engl. constructor), jota kutsutaan aina uutta esinettä luotaessa. Esine saa nimekseen parametrin nimi arvon. Esineen painoksi tulee vastaavasti parametrin paino arvo. Parametrien arvoja ei tarvitse, eikä voikaan, tietää vielä luontimetodia kirjoitettaessa. Kunkin luotavan esineen nimi ja paino määritellään vasta siinä vaiheessa, kun luontimetodia kutsutaan ja parametrit saavat todelliset arvot. Luontimetodin koodia laatiessasi voit kuitenkin olettaa, että parametrimuuttujien nimien nimi ja paino takana on oikeat arvot ne vain voivat olla "mitä vain" merkkijonoja ja desimaalilukuja. String annanimi() Metodi palauttaa esineen nimen. Käytä return-avainsanaa. double annapaino() Metodi, jonka palautusarvo on esineen paino. 2

Kirjoita luokkaan seuraavaksi pääohjelmametodi public static void main(string[] args), jossa luot pari erinimistä ja -painoista esinettä ja tulostat ne metodin System.out.println avulla (antamalla kunkin esineen suoraan metodin parametriksi). Mitä huomaat? Tulostaako ohjelma mitään informatiivista? Kirjoita luokkaan vielä yksi metodi (pääohjelmametodi on yleensä tapana jättää viimeiseksi, joten lisää seuraava metodi koodiin ennen sitä): String tostring() Luokassa Object määritetyn metodin tostring() uudelleenmäärittely. Metodin tulee palauttaa merkkijono "n, paino p kg", missä n on esineen nimi ja p sen paino. Käännä luokka vielä kerran ja kokeile uudelleen pääohjelmametodin ajamista. Miltä esineiden tulostaminen näyttää tällä kertaa? Osatehtävä 2: Luokka Taikajuoma Tässä osatehtävässä tarvitset seuraavien uusien asioiden hallintaa: Perintä (engl. inheritance). Luontimetodi ja yläluokan luontimetodin kutsuminen. Yläluokan metodin uudelleenmäärittäminen aliluokassa (engl. overriding). Eksplisiittinen tyyppimuunnos (engl. type conversion / type casting).?:-operaattori tai ehdollinen lause eli if-lause. Seuraavaksi muodostetaan luokan Esine aliluokka Taikajuoma, joka edustaa pelimaailman eri taikajuomia. Esine-luokalta perittyjen attribuuttien ja metodien lisäksi jokaisella taikajuomalla on tieto siitä, miten herkullinen se on. Huomaa, että javassa etenkään varsinaisessa koodissa ei käytetä ääkkösiä, ja merkkiongelmien takia on suositeltavaa, ettei ääkkösiä käytä myöskään kommenteissa. Taikajuomien jaottelu eri tyyppeihin voitaisiin tehdä laatimalla joka tyyppiä varten oma Taikajuoma-luokan aliluokka, mutta koska kaikki Taikajuomat ovat ominaisuuksiltaan ja toiminnallisuudeltaan samanlaisia (ainoastaan ominaisuuksien arvot vaihtelevat), näillä uusilla luokilla ei olisi oikeastaan mitään virkaa. Ne eivät lisäisi alkuperäiseen taikajuoman konseptiin mitään uutta. Menettelemme siis hieman toisin. Laadimme seuraavaksi luokan Taikajuoma, joka perii luokan Esine. Määritä luokalle seuraavat attribuutit: 3

boolean herkullinen Tieto siitä, onko taikajuoma herkullinen. Jos tämän arvo on false, taikajuoma vähentää juojansa elinvoimaa. String tyyppi Tieto taikajuoman tyypistä myöhempää käyttöä varten. Määritä attribuuttien näkyvyys niin, että niitä voidaan käsitellä suoraan vain tässä luokassa. Luokalla on lisäksi seuraavat, kaikkialla käytettävissä olevat metodit: Taikajuoma(String vari, String tyyppi, double paino, boolean herkullinen) Luontimetodi, jota kutsutaan taikajuomaa luotaessa. Taikajuoman nimi muodostuu väristä ja tyypistä välilyönnillä eroteltuna. Luotavan Taikajuoma-instanssin nimi voisi olla vaikkapa "keltainen mehu". Muista kutsua yläluokan luontimetodia, jolle annetaan taikajuoman nimeksi edellä kuvatun mukainen merkkijono. Taikajuoman herkullinenattribuuttiin asetetaan herkullinen-parametrin arvo. Taikajuoman väriä ei erikseen tallenneta mihinkään sen attribuuttiin, sillä se ilmenee taikajuoman nimestä. Myös painon tallentaminen jätetään yksin yläluokan huoleksi. boolean onkoherkullinen() Palauttaa true, jos taikajuoma on herkullinen tai false, jos taikajuoma on myrkyllinen. int annaherkullisuus() Taikajuoman herkullisuuden palauttava metodi. Taikajuoman herkullisuus on sen paino kerrottuna kahdella ja pyöristettynä alaspäin lähimpään kokonaislukuun. Jos Taikajuoma ei ole herkullinen, herkullisuus on lisäksi negatiivinen. Huomaa, että desimaaliluvun muuttaminen kokonaisluvuksi ei tapahdu automaattisesti, vaan se vaatii niin sanotun eksplisiittisen tyyppimuunnoksen. Tällä ohjelmoija ilmoittaa kääntäjälle hyväksyvänsä sen, että muunnoksessa voi kadota tietoa (tässä tapauksessa desimaaleja). Javassa double-tyyppisen desimaaliluvun muuntaminen int-tyyppiseksi kokonaisluvuksi katkaisee desimaaliosan pois (eli pyöristää luvun alaspäin). Tyyppimuunnoksista voit etsiä lisätietoa esimerkiksi hakusanoilla type conversion tai type casting.?: operaattori Javassa on yksi-, kaksi- ja kolmioperandisia operaattoreita. Yksioperandinen operaattori on esimerkiksi ++, kaksioperandinen taas ==. Monimutkaisin operaattori?: taas vaatii kolme operandia. Operaattorin syntaksi on muotoa b? x : y ja se toimii siten, että mikäli ensimmäinen boolean-tyyppinen operandi (tässä b) on true, palautetaan keskimmäisen operandin (tässä x) arvo, muutoin taas jälkimmäinen (tässä y).?:- operaattori on siis tavallaan eräänlainen if-lauseen 4 oikotie, ja sitä käytetään joskus hyvin yksinkertaisten ehtojen siistimiseen. Sitä käyttäessä täytyy varoa, ettei tule tehneeksi koodista epäselvää.

Vielä Rosettan kivi -esimerkki. Nämä kaksi lohkoa tekevät täysin saman asian toisessa siihen käytetään kuusi riviä, toisessa yksi. On pitkälti mielipidekysymys, kumpi on selkeämpää. int muuttuja; if (b) { muuttuja = x; } else { muuttuja = y; } int muuttuja = b? x : y; Äskeisessä metodissa voi käyttää?:-operaattoria herkullisuuden ja myrkyllisyyden erottelussa (herkullisuuden positiivinen arvo vs. negatiivinen arvo).?:-operaattorin käyttö ei kuitenkaan tässä tapauksessa ole aivan pakollista. String annatyyppi() Palauttaa Taikajuoman tyypin. String tostring() Luokassa Object määritetyn metodin tostring() uudelleenmäärittely. Metodin tulee palauttaa merkkijono "h n, paino p kg", missä h on joko "herkullinen" tai "myrkyllinen" riippuen Taikajuoman herkullisuudesta, n on Taikajuoman nimi ja p paino. Testaa luokkaa muodostamalla sille pääohjelmametodi, joka luo joitakin erilaisia taikajuomia ja tulostaa ne metodilla System.out.println. Osatehtävä 3: Luokka Puukko Tässä osatehtävässä tarvitset seuraavien uusien asioiden hallintaa: Javan valmiiden luokkien importointi ja käyttö. Satunnaislukujen käyttö. Parametrien hyödyntäminen metodeissa. Seuraavaksi luomme luokan Esine aliluokan Puukko, joka soveltuu vaikkapa olentojen vahingoittamiseen. Jokaisella puukolla on nimen ja painon lisäksi erityinen terävyys-kerroin, joka ilmoittaa, kuinka teräväksi puukko on hiottu eli kuinka hyödyllinen se on. Muodosta luokka Puukko, joka perii luokan Esine. Luokalle määritellään seuraavanlainen attribuutti: 5

int teravyys Luku, joka kertoo, kuinka terävä Puukko on. Mikäli terävyys on pieni, ei Puukko ole kovin vaarallinen. Kaikkein vaarallisimmilla taas terävyys on suuri ja niillä saa aikaan todella pahaa jälkeä. Lisäksi luokalla Puukko on seuraavat metodit: Puukko(String nimi, double paino, int teravyys) Luo uuden puukon. Puukon nimeksi asetetaan (yläluokan luontimetodin avulla) nimi ja painoksi paino. Myös teravyys pannaan talteen. int annavoima() Palauttaa puukon voiman. Isompi on parempi, joten voima on puukon paino kerrottuna terävyydellä ja pyöristettynä ylöspäin lähimpään kokonaislukuun. Puukosta ei näe päällepäin, miten voimakas se todella on, joten totutusta poiketen tämä metodi määritellään yksityiseksi. Koska seuraavassa Puukko-luokan metodissa tarvitaan Olento-luokkaa, saatamme sen alkuun tässä välissä. Muodosta luokka Olento. Luokalle määritellään seuraavanlainen metodi (ei siis vielä konstruktoria tai attribuutteja): boolean muutaelinvoimaa(int muutos) Muuttaa olennon elinvoimaa parametrina annetun määrän negatiivinen parametrin arvo siis vähentää elinvoimaa. Tässä vaiheessa meidän tarvitsee vain pystyä kutsumaan tätä metodia testimielessä, joten se pannaan toistaiseksi tulostamaan: "Olennon elinvoiman muutos: n", missä n on annettu muutos. Tulostettuaan näin metodi palauttaa true. Seuraavaksi teemme Puukko-luokkaan seuraavan metodin: void vahingoita(olento uhri) Vahingoittaa parametrina annettua Olento-luokan oliota. Vahinko on satunnainen luku väliltä [1, annavoima()]. Jokaisella välin luvulla on yhtäläinen todennäköisyys tulla valituksi. Huomaa, ettemme tässä metodissa välitä siitä, ettei Olento-luokan muutaelinvoimaa-metodi varsinaisesti tee vielä mitään luotamme siihen, että se myöhemmin täytetään. Satunnaislukujen käytöstä kerrotaan esimerkiksi tässä ohjeessa. 6

Testaa luokkaa muodostamalla sille pääohjelmametodi, joka luo joitakin puukkoja ja tulostaa ne metodilla System.out.println. Luo tämän jälkeen olento (olennon luominen onnistuu ilman erikseen määriteltyä konstruktoria!) ja pane puukot vahingoittamaan sitä. Tarkista, että tehty vahinko on sallituissa rajoissa. Java on ystäväsi, sillä se tarjoaa käyttöösi huikean määrän valmiita luokkia, jotka helpottavat joskus erittäin olennaisesti asioiden tekemistä. Java-API-sivuilta näet, mitä kaikkea sinun ei itse tarvitse ohjelmoida, koska joku muu on laatinut sinulle sopivat työkalut valmiiksi. Ensi alkuun Java-API:n luokkien hämmentävä paljous saattaa jopa pelottaa, mutta näissä tehtävissä tarvitsemasi valmiit luokat on pääsääntöisesti kerrottu suoraan sinun on vain selvitettävä, miten niitä käytetään. Kaikki valmiit luokat sijaitsevat jossakin nimetyssä pakkauksessa (engl. package). Pakkausten tarkoituksena on ryhmitellä samaan aihepiiriin liittyviä luokkia yhteen ja tällä tavoin helpottaa niiden löytämistä. Kun otat koodissasi käyttöön jonkin Javan valmiin luokan, sinun on tiedettävä, mistä pakkauksesta se löytyy. Tämän voit helpoimmin selvittää kyseisen luokan Java-API-sivulta. Satunnaislukujen generointiin tarvittava Random-luokka löytyy pakkauksesta java.util, joka sisältää erilaisia pieniä työkaluja, kuten tietorakenteita. Luokka otetaan käyttöön avainsanalla import kirjoittamalla oman luokkatiedostosi alkuun import java.util.random;. Ilman tätä riviä kääntäjä valittaa, ettei ymmärrä, mihin sana Random koodissasi oikein viittaa. Pakkauksen kaikki luokat voi importoida yhdellä kertaa kirjoittamalla import java.util.*, mutta tämä on harvoin perusteltua saati tyylikästä. Jotkin Java-kielen tavallisimmat luokat, kuten Object ja String, on koottu pakkaukseen java.lang. Tämä pakkaus on aina käytössäsi, joten siihen kuuluvia luokkia ei ole tarpeen erikseen importoida. Osatehtävä 4: Metodi luotaikajuoma Tässä osatehtävässä tarvitset seuraavien uusien asioiden hallintaa: Taulukoiden luonti ja käyttö. Apumuuttujien käyttö. Seuraavaksi rakennamme metodin, joka osaa automaattisesti luoda erilaisia taikajuomia. Metodi luo satunnaislukugeneraattorin avulla taikajuomia, jotka ovat erivärisiä sekä erilaisia tyypiltään ja painoltaan. Luodaan ensin luokkaan Taikajuoma muutamia luokkakohtaisia ominaisuusmuuttujia metodin avuksi: String[] VARIT Taulukko, jonka alkioiksi sijoitetaan mahdolliset värit. Värejä voi olla miten monta tahansa kuitenkin vähintään yksi. Käytä taulukon alustajaa (ks. seuraava sivu) ja keksi itse mahdolliset värit. 7

String[] TYYPIT Taulukko, jonka alkioiksi sijoitetaan mahdolliset taikajuomien tyypit. Myös tyyppejä on oltava vähintään yksi, eikä ylärajaa ole. Määrittele yllä kuvatut attribuutit siten, että ne ovat muuttumattomia ja käytettävissä ainoastaan luokan Taikajuoma sisältä. Taulukoista Tässä osatehtävässä luodaan ja käytetään taulukoita. Taulukot ovat yksinkertainen mutta hyvin keskeinen esimerkki tietorakenteesta. Ne ovat säiliöitä, joilla on aina tietty tietotyyppi ja tietty koko. Esimerkiksi String-taulukkoon, jonka koko on 5, voidaan sijoittaa viisi merkkijonotyyppistä arvoa. Näitä arvoja sanotaan taulukon alkioiksi, ja ne sijaitsevat "lokeroissa", jotka on numeroitu nollasta alkaen (tässä tapauksessa 0, 1, 2, 3 ja 4). Näitä lokeroiden numeroita kutsutaan taulukon indekseiksi. Taulukon indeksointi alkaa siis aina nollasta, ja viimeinen indeksi on yhtä pienempi kuin taulukon koko. Taulukot, kuten melkein kaikki muukin Javassa, ovat itse asiassa olioita. Merkkijonojen tapaan ne ovat kuitenkin tietynlaisessa erityisasemassa moniin muihin olioihin nähden sikäli, että niitä varten on Java-kieleen määritelty oma erityinen notaationsa. Tämän notaation keskeinen elementti ovat hakasulut, []. Taulukon alkion arvoon pääsee käsiksi panemalla hakasulkujen sisään indeksin: nimitaulukko[2] palauttaa siis nimitaulukko-nimisen taulukon kolmannen alkion. Vastaavasti nimitaulukko[0] = "Milla" sijoittaa taulukon ensimmäiseksi alkioksi merkkijonon Milla. Jokaisessa tähän asti laatimassamme pääohjelmametodissa olemme määritelleet parametrin String[] args. Kyseessä on itse asiassa merkkijonotaulukko, jonka nimi on args. (Jos haluat tietää lisää kyseisen parametrin merkityksestä, lue siitä vaikkapa täältä.) Vastaavasti kokonaislukutaulukon tietotyyppi olisi int[] ja puukkoja sisältävän taulukon Puukko[]. Javassa on kaksi tapaa luoda uusi taulukko. Ensimmäinen on käyttää avainsanaa new kuten luotaessa mitä tahansa muutakin oliota. Esimerkiksi lause String[] nimet = new String[10]; luo uuden merkkijonotaulukon, jonka koko on 10. Taulukko on aluksi tyhjä, eli sen jokaisessa indeksissä on arvo null. (Jos kyseessä olisi kokonais- tai desimaalilukutaulukko, sen jokaisen "lokeron" arvo olisi aluksi nolla.) Toinen tapa on käyttää merkintätapaa, jota kutsutaan taulukon alustajaksi (array initializer): int[] luvut = { 41, 292, -3, 1337 }; Tämä luo paitsi uuden nelialkioisen taulukon, myös asettaa sen alkioille aaltosulkujen sisällä luetellut alkuarvot. Tätä taulukon luontitapaa voidaan käyttää ainoastaan uuden taulukkomuuttujan määrittelyn yhteydessä. Taulukon koko saadaan selville ilmauksesta taulukko.length. (Kyseessä ei siis ole metodi, vaan taulukko-olion julkinen attribuutti.) Koko ei ole taulukon luonnin jälkeen enää muutettavissa, eli jos jossain vaiheessa huomaamme, että tarvitsemmekin suuremman taulukon kuin mitä tulimme alun perin luoneeksi, joudumme tekemään uuden isomman taulukon ja kopioimaan sinne arvot alkuperäisestä, ahtaaksi käyneestä taulukostamme. Taulukoista on kerrottu lisää muun muassa Sunin Java-tutoriaalissa. 8

Nyt voimme luoda luokkaan Taikajuoma seuraavan luokkakohtaisen metodin: Taikajuoma luotaikajuoma() Metodi, joka luo ja palauttaa uuden Taikajuoman seuraavien ehtojen mukaisesti: 1. Taikajuoman väri valitaan satunnaisesti VARIT-taulukosta. Kaikilla taulukon alkioilla on yhtäläinen todennäköisyys tulla valituksi. 2. Taikajuoman tyyppi valitaan satunnaisesti TYYPIT-taulukosta. Myös kaikilla tyypeillä on yhtäläinen todennäköisyys tulla valituksi. 3. Taikajuoman paino saadaan kaavalla 2 + n 4, missä n on normaalijakaumasta satunnaisesti valittu luku. 4. Puolet taikajuomista on herkullisia. Huomaa, että herkullisuus on tyyppiä boolean, ja Random-luokassa on juuri tähän soveltuva metodi. Javan valmiissa luokassa Math on matemaattisiin operaatioihin liittyviä metodeita, kuten potenssiin korotus. Osatehtävä 5: Luokka Tynnyri Tässä osatehtävässä tarvitset seuraavien uusien asioiden hallintaa: Todennäköisyys ja satunnaisluvut. Muodosta luokan Esine aliluokka Tynnyri, jolla on seuraava attribuutti: int pyydetytesineet Tieto siitä, montako esinettä tältä Tynnyriltä on pyydetty. Lisäksi luokalla Tynnyri on seuraavat metodit: Tynnyri() Konstruktori luo uuden Tynnyrin. Tynnyrin nimi on aina Peltitynnyri ", ja sen paino on satunnainen luku väliltä [5, 30]. Esine pyydaesine() Metodi luo ja palauttaa uuden esineen. Esine määräytyy seuraavasti: 20 prosentin todennäköisyydellä luodaan uusi Taikajuoma. Käytä Taikajuoman luontiin edellisessä osatehtävässä määriteltyä tapaa. 9

60 prosentin todennäköisyydellä luodaan uusi Puukko. Saat itse päättää, miten puukon nimi ja terävyys määräytyvät, kunhan niissä on vaihtelua. Tee ratkaisusta tyylikäs (esimerkkivinkki: edellinen tehtävä). 20 prosentin todennäköisyydellä luodaan uusi Tynnyri. String tostring() Luokassa Object määritetyn metodin tostring() uudelleenmääritys. Metodin tulee palauttaa merkkijono "Poikatynnyri, pyydetyt esineet: n", missä n on Tynnyriltä pyydettyjen esineiden määrä. Testaa luokka muodostamalla sille pääohjelmametodi, joka luo Tynnyrin, käyttää muutaman kerran sen metodia pyydaesine ja tulostaa Tynnyrin ja luodut esineet metodilla System.out.println. Osatehtävä 6: Luokka Olento Tässä osatehtävässä tarvitset seuraavien uusien asioiden hallintaa: Olion luokan tutkiminen instanceof-operaattorilla. Muokkaa luokkaa Olento, jotta sillä olisi ainakin seuraavat attribuutit: String nimi Olennon nimi. int elinvoima Olennon tämänhetkinen elinvoima. Jos elinvoima on nolla tai vähemmän, on olento kuollut. Puukko Puukko Olennon Puukko, jonka avulla se voi taistella muita olentoja vastaan. Määritä taas attribuuttien näkyvyys niin, että niitä voidaan suoraan käsitellä vain tässä luokassa. Luokalla on lisäksi seuraavat, kaikkialla käytettävissä olevat metodit: Olento(String nimi, int elinvoima) Luontimetodi, joka muodostaa uuden olennon, jonka nimi on nimi ja elinvoima on elinvoima. Elinvoiman on oltava alussa vähintään 10 ja se voi alussa olla enintään 300. Jos elinvoimalle yritetään asettaa laiton arvo, korjaa se oikeanlaiseksi. Aluksi olennolla ei ole omaa Puukkoa. String annanimi() Palauttaa olennon nimen. int annaelinvoima() Palauttaa olennon elinvoiman. 10

int annaalkuelinvoima() Palauttaa olennon alkuelinvoiman. Olennon alkuelinvoima on se elinvoima, joka sille annettiin luomishetkellä (eli konstruktorissa). boolean onelossa() Palauttaa arvon true, jos olento on elossa ja arvon false, jos olento on kuollut. Olento on elossa, jos elinvoima on positiivinen. boolean muutaelinvoimaa(int muutos) Muuttaa attribuutin elinvoima arvoa lisäämällä siihen parametrin muutos arvon. Elinvoimaa voidaan heikentää antamalla negatiivinen muutos. Muuta aiemmin tehtyä tulostusta niin, että siitä ilmenee muutoksen määrän lisäksi olennon nimi ja elinvoima muutoksen jälkeen. Jos olento kuoli muutoksen seurauksena, tulostetaan vielä tieto tästä. Elinvoima ei voi tämän metodin seurauksena nousta suuremmaksi kuin olennon alkuelinvoima. Jos elinvoimaa yritetään kasvattaa yli alkuelinvoiman, jää olennon elinvoimaksi alkuelinvoima ja metodi palauttaa arvon false. Muutoin palautetaan arvo true. void juo(taikajuoma taikajuoma) Muuttaa olennon elinvoimaa Taikajuoman taikajuoma herkullisuuden verran. (Myrkyllisen Taikajuoman syönti siis vähentää elinvoimaa.) Tulosta myös sopiva kuvaus tapahtumasta. boolean hyokkaa(olento uhri) Hyökkää parametrina annetun uhrin kimppuun puukon voimin. Jos hyökkääjällä ei ole puukkoa, ei metodi tee muuta kuin palauttaa false. Vaikka hyökkääjällä olisi puukko, yritys epäonnistuu 10 prosentin todennäköisyydellä, eikä metodi tällöinkään tee muuta kuin palauttaa false. Muutoin puukko vahingoittaa uhria, menee rikki 25 prosentin todennäköisyydellä (jos puukko menee rikki, olento hylkää sen) ja metodi palauttaa true. Laita metodiin myös tulostus, joka kertoo, mitä tapahtui. void tokkaa(tynnyri tynnyri) Olento tökkää tynnyria ja pyytää siltä uuden esineen. Riippuen siitä, minkä esineen se saa, olento tekee seuraavat toimenpiteet: Jos esine on juotavaksi kelpaava taikajuoma, olento vetää sen huiviinsa. Jos esine on myrkyllinen taikajuoma, olento luulee sitä herkulliseksi ja juo sen todennäköisyydellä h / ( h + 80), missä h on taikajuoman herkullisuuden itseisarvo. Jos esine on puukko, eikä olennolla ennestään ole puukkoa, olento ottaa sen itselleen. Jos esine on uusi tynnyri, olento tökkää saman tien myös sitä. Tulosta myös kuvaus tapahtuneesta. Olion luokan tutkiminen onnistuu operaattorilla instanceof. 11

Kun Javassa tehdään laskutoimitus (yhteen-, vähennys-, kerto- tai jakolasku) kahdella Niinpä kokonaisluvulla, jakolasku 1 laskun / 4 tulos ei tuotakaan on niin ikään arvoa aina 0.25, kokonaisluku. vaan katkaisee Kokonaisluvun desimaaliosan ja automaattisesti desimaaliluvun pois, jolloin välisen tulos laskutoimituksen on 0. Laskulausekkeet tulos on sen 1.0 sijaan / desimaaliluku, 4, 1 / 4.0 kuten ja 1.0 / 4.0 tuottavat luonnollisesti sen sijaan myös kaikki kahden halutun desimaaliluvun. lopputuloksen 0.25. String tostring() Luokassa Object määritetyn metodin tostring() uudelleenmäärittely. Jos olento on elossa, palauttaa merkkijonon "olento x, elinvoima e, aseena s", missä x on olennon nimi, e olennon elinvoima ja s olennolla oleva (mahdollinen) puukko. Jos olennolla ei ole puukkoa, lukee kuvauksessa edellä mainitun sijaan ei asetta. Jos olento on kuollut, palauttaa merkkijonon, joka on muuten sama kuin yllä, mutta joka alkaa sanalla kuollut. Osatehtävä 7: Eeppinen taistelu Tässä osatehtävässä tarvitset seuraavien uusien asioiden hallintaa: Silmukkarakenne while-lauseella. Jakojäännösoperaattori %. Testaa tekemiäsi luokkia muodostamalla luokkaan Olento pääohjelmametodi, joka luo ja käyttää joitain olentoja ja esineitä (taikajuomia, puukkoja ja tynnyreitä) sekä tulostaa ne metodilla System.out.println. Olennot voivat juoda taikajuomia, tökkiä tynnyreitä ja käyttää puukkojaan. Laita lopuksi kaksi olentoa taistelemaan keskenään hyökkäämään toistensa kimppuun vuoronperään, kunnes toinen olennoista on kuollut (tai vaihtoehtoisesti kunnes toisen kunto on laskenut tietyn rajan alle, jos tällainen ratkaisu miellyttää enemmän). Lisäksi joka toisen hyökkäysvuoronsa aluksi kumpikin olento tökkää Tynnyria. Käytä while-lausetta silmukan toteutukseen. Käytä vuorottelun järjestämiseksi jakojäännösoperaattoria %. Lopputoimet Kun olet ohjelmoinut yllä olevat luokat, testannut niiden toiminnan ja olet muuten tyytyväinen ratkaisuusi, voit palauttaa tehtävän. Palautusohjeet ovat omassa dokumentissaan nopassa. 12