Seikkailupelimaailma

Rajatun keinotekoisen maailman ilmiöiden mallittaminen tarjoaa hyvän kohteen luokka- ja oliokäsitteiden sekä perinnän harjoitteluun. Seikkailupelit tarjoavat tällaisen keinotekoisen maailman. Seikkailupelissä tyypillisesti on joukko olentoja (ihmisiä, haltioita, peikkoja, hirviöitä jne.), esineitä (aseita, haarniskoita, avaimia, jalokiviä, ruokaa jne.) sekä paikkoja (alueita, huoneita, jne.). Pelissä on jokin tietty tavoite, esimerkiksi vihollisten kukistaminen ja aarteen löytäminen, jonka pelaaja pyrkii saavuttamaan. Pelaaja ohjaa yhtä tai useampia olentoja ja tietokone ohjaa muita olentoja.

Tässä harjoituksessa muodostetaan pala palalta yksinkertainen seikkailupelimaailma. Harjoituksen tekeminen ei edellytä aiempia tietoja peleistä. Alla olevat ohjeet ovat aluksi sangen yksityiskohtaisia, mutta myöhemmissä osatehtävissä detaljit on jätetty pois.

Tärkeintä ei ole saada kaikkia pelin osia toteutettua vaan se, että ymmärtää, miten olioita, luokkia ja perintää käytetään Javassa. Osatehtäviä on hyvin paljon, eikä niitä kaikkia tarvitse tehdä, mikäli ei ehdi.

Osatehtävä 1: Luokka Esine

Esineitä varten muodostetaan ensin luokka Esine, jonka alaluokkien ilmentymiä kaikki pelissä esiintyvät esineet ovat. Luokasta Esine ei varsinaisesti luoda yhtään ilmentymää, vaan ilmentymät luodaan sen alaluokista. Aloitetaan siis luokasta Esine, joka kirjoitetaan tiedostoon Esine.java. Sille määritetään seuraavat ominaisuusmuuttujat ja metodit.

Metodi public double paino()
Seikkailupeleissä olento kykenee yleensä kantamaan vain tietyn määrän esineitä kerrallaan. Siksi jokaisella esineellä tulee olla paino. Tämä metodi kertoo, mikä esineen paino on kiloissa.
Metodi public int arvo()
Seikkailupeleissä esineillä on yleensä jokin rahallinen arvo. Tämä metodi kertoo, mikä esineen arvo on.
Metodi public String toString()
Tämä metodi palauttaa arvonaan esinettä kuvaavan merkkijonon. Kuvauksesta tulee näkyä esineen tyyppi ja ominaisuudet eli sen paino ja arvo.
Ominaisuusmuuttuja double paino
Tämä ominaisuusmuuttuja tallettaa esineen painon. Emme halua, että painoa voisi muutella olion ulkopuolelta. Mikä näkyvyysmääre (public, protected, private) ominaisuudelle kannattaa asettaa?
Ominaisuusmuuttuja int arvo
Tämä ominaisuusmuuttuja tallettaa esineen arvon. Emme halua, että arvoa voisi muutella olion ulkopuolelta. Mikä näkyvyysmääre (public, protected, private) ominaisuudelle kannattaa asettaa?
Luontimetodi public Esine(double paino, int arvo)
Luontimetodi, joka tekee uuden Esine-olion, jolla on parametrina annettu paino sekä arvo.

Kun olet kirjoittanut luokan, käännä se nähdäksesi, onko koodisi syntaktisesti oikeaa.

Osatehtävä 2: Luokka Jalokivi

Seuraavaksi tehdään luokan Esine alaluokka Jalokivi. Kirjoita luokka tiedostoon Jalokivi.java. Jalokivellä on painon ja arvon lisäksi väri, joka esitetään kokonaisluvulla. Tee luokalle seuraavat ominaisuudet ja metodit.

Metodi public int väri()
Metodi palauttaa arvonaan jalokiven värin.
Ominaisuusmuuttuja int väri
Tämä ominaisuusmuuttuja tallettaa esineen värin. Emme halua, että väriä voisi muutella olion ulkopuolelta. Määritä sopiva näkyvyysmääre.
Luontimetodi public Jalokivi(double paino, int arvo, int väri)
Luontimetodi, joka tekee uuden Jalokivi-olion, jolla on parametrina annettu paino, arvo ja väri. Huomaa, että metodin on kutsuttava yläluokan Esine luontimetodia.
Luokkakohtaiset vakiot int sininen, int punainen ja int vihreä
Tee luokalle Jalokivi yhteiset vakiot sininen, punainen ja vihreä. Uusia jalokiviä luotaessa voi sitten antaa värin tyyliin Jalokivi.punainen. Selvitä, mitkä määreet näille on annettava, jotta ne olisivat luokkakohtaisia, näkyvissä luokan ulkopuolella ja lisäksi vakioita.
Metodi public String toString()
Tämä metodi palauttaa arvonaan esinettä kuvaavan merkkijonon. Kuvauksesta tulee näkyä esineen tyyppi ja ominaisuudet eli sen paino, arvo ja väri. Värin tulee näkyä merkkijonona eikä numerona.

Käännä luokka ja poista syntaksivirheet.

Osatehtävä 3: Pääohjelmaluokka Peli

Tee yksinkertainen pääohjelmaluokka Peli ja siihen metodi main. Luo pääohjelmassa muutamia jalokiviä ja tulosta niiden kuvaukset metodikutsulla System.out.println

Osatehtävä 4: Luokka Miekka

Seuraavaksi tehdään luokan Esine alaluokka Miekka. Kirjoita luokka tiedostoon Miekka.java. Miekalla on painon ja arvon lisäksi ominaisuutena terävyys. Terävyys vaikuttaa miekan tuottamaan vahinkoon sitä käytettäessä. Tee luokalle seuraavat ominaisuudet ja metodit.

Metodi public double terävyys()
Metodi palauttaa arvonaan miekan terävyyden. Terävyys on aina välillä 0.0 - 1.0.
Metodi public double teroita(double muutos)
Metodi muuttaa miekan terävyyttä parametrina annetun arvon verran. Metodin on tarkistettava, että terävyys pysyy välillä 0.0 - 1.0.
Ominaisuusmuuttuja double terävyys
Tallettaa terävyyden. Määritä sopiva näkyvyys.
Luontimetodi
Luontimetodi, joka tekee uuden Miekka-olion, jolla on parametrina annettu paino, arvo ja terävyys.
Metodi public String toString()
Tämä metodi palauttaa esinettä kuvaavan merkkijonon. Kuvauksesta tulee näkyä esineen tyyppi ja ominaisuudet eli sen paino, arvo ja terävyys.

Käännä luokka ja poista syntaksivirheet. Muuta pääohjelmaluokkaa niin, että siellä luodaan miekkoja, teroitellaan niitä sekä välillä tulostetaan niiden kuvaukset.

Osatehtävä 5: Luokka Olento

Tämä on yläluokka pelissä esiintyville olennoille - ihmisille, peikoille, haltioille, noidille jne. Tee luokalle seuraavat ominaisuudet ja metodit.

Ominaisuus nimi
Jokaisella olennolla on nimi, joka on merkkijono. Määritä nimelle ominaisuusmuuttuja sekä metodi, joka palauttaa arvonaan nimen.
Ominaisuus pituus
Jokaisella olennolla on pituus, joka on kokonaisluku. Määritä nimelle ominaisuusmuuttuja sekä metodi, joka palauttaa arvonaan pituuden.
Ominaisuusmuuttujat Esine oikea ja Esine vasen
Nämä ominaisuudet kuvaavat olennon käsissään pitämiä esineitä. Jos kädessä ei ole esinettä, on ominaisuuden arvona null.
Metodi public void poimiOikeaan(Esine e)
Metodi laittaa olennon oikeaan käteen esineen e. Tee vastaavasti myös metodi poimiVasempaan.
Metodi public void pudotaOikeasta()
Metodi poistaa esineen olennon oikeasta kädestä. Tee vastaavasti myös metodi pudotaVasemmasta.
Luontimetodi
Luontimetodi, joka tekee uuden Olento-olion, jolla on parametrina annettu nimi sekä pituus. Käsissä ei ole aluksi mitään.
Metodi public String toString()
Tämä metodi palauttaa olentoa kuvaavan merkkijonon. Kuvauksesta tulee näkyä esineen tyyppi ja ominaisuudet.

Käännä luokka ja poista syntaksivirheet. Muuta pääohjelmaluokkaa niin, että siellä luodaan muutamia olentoja, laitetaan niiden käsiin tavaroita ja tulostetaan niiden kuvaukset eri vaiheissa.

Osatehtävä 6: Luokka Reppu

Seuraavaksi tehdään luokan Esine alaluokka Reppu. Reppuun voi laittaa esineitä. Tee luokalle seuraavat ominaisuudet ja metodit.

Ominaisuus kapasiteetti
Tämä ominaisuus kertoo, kuinka monta esinettä reppuun voi enintään laittaa. Tee ominaisuusmuuttuja ja metodi, joka palauttaa ominaisuuden arvon.
Metodi public void lisääEsine(Esine e)
Lisää esineen reppuun, mikäli sielä on tilaa.
Metodi public void poistaEsine(Esine e)
Poistaa esineen repusta, mikäli se on siellä.
Luontimetodi
Luontimetodi, joka tekee uuden Reppu-olion.
Metodi public String toString()
Tämä metodi palauttaa esinettä kuvaavan merkkijonon. Kuvauksesta tulee näkyä esineen tyyppi ja ominaisuudet.

Käännä luokka ja poista syntaksivirheet. Muuta pääohjelmaluokkaa niin, että siellä luodaan reppu ja laitetaan siihen esineitä.

Osatehtävä 7: Luokka Ihminen

Luokan Olento alaluokka Ihminen kuvaa olentoa (tai olentoja), joita pelaaja ohjaa. Ihminen voi kantaa myös reppua, johon voi laittaa tavaroita. Näin on mahdollista kuljettaa enemmän esineitä mukanaan.

Ominaisuus reppu
Ominaisuuden arvona on joko null tai jokin reppu. Tee vastaavasti metodit poimiReppu, joka asettaa repun ihmiselle ja pudotaReppu, joka poistaa repun käytöstä.

Tee luokkaan myös luontimetodi ja toString-metodi. Käännä luokka ja poista syntaksivirheet. Muuta pääohjelmaluokkaa niin, että siellä luodaan ihminen ja laitetaan sille reppu selkään.

Osatehtävä 8: Luokka Huone

Luokka Huone kuvaa aluetta pelissä. Kussakin huoneessa voi olla joukko olentoja ja esineitä. Lisäksi huoneet on voitu kytkeä toisiin huoneisiin.

Ominaisuus nimi
Jokaisella huoneella on nimi, joka on merkkijono. Määritä nimelle ominaisuusmuuttuja sekä metodi, joka palauttaa arvonaan nimen.
Ominaisuus olennot
Taulukko, joka sisältää viittaukset huoneessa oleviin olentoihin. Taulukolla voi olla jokin maksimikoko, joka rajaa huoneessa enintään olevien olentojen määrää. Tee vastaava ominaisuusmuuttuja sekä metodit, jotka poistavat ja lisäävät olentoja huoneeseen.
Ominaisuus esineet
Taulukko, joka sisältää viittaukset huoneessa oleviin esineisiin. Toteuta tämä samaan tapaan kuin ominaisuus olennot.
Ominaisuudet itään, länteen, etelään ja pohjoiseen
Kukin ominaisuus on tyypiltään Huone ja ominaisuuden arvona on jokin huone taikka null.
Metodi public void kytkeItään(Huone h)
Kytkee huoneen h tämän huoneen itäpuolelle. Tee vastaavat metodit myös muille ilmansuunnille.

Tee luokkaan lisäksi toString-metodi sekä luontimetodi. Luo pääohjelmassa joukko huoneita ja kytke ne toisiinsa. Laita niihin esineitä ja olentoja. Tulosta niiden kuvaukset eri vaiheissa.


Studio1
Last modified: Mon Apr 1 15:56:13 EEST 2002