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.
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.
public double paino()public int arvo()public String toString()double painopublic, protected,
private) ominaisuudelle kannattaa asettaa?
int arvopublic, protected,
private) ominaisuudelle kannattaa asettaa?
public Esine(double paino, int arvo)Esine-olion, jolla
on parametrina annettu paino sekä arvo.
Kun olet kirjoittanut luokan, käännä se nähdäksesi, onko koodisi syntaktisesti oikeaa.
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.
public int väri()int väripublic Jalokivi(double paino, int arvo,
int väri)Jalokivi-olion, jolla
on parametrina annettu paino, arvo ja väri. Huomaa, että metodin
on kutsuttava yläluokan Esine luontimetodia.
int sininen, int
punainen ja int vihreä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.
public String toString()Käännä luokka ja poista syntaksivirheet.
Peli
Tee yksinkertainen pääohjelmaluokka Peli ja siihen metodi
main. Luo pääohjelmassa muutamia jalokiviä ja
tulosta niiden kuvaukset metodikutsulla System.out.println
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.
public double terävyys()public double teroita(double muutos)double terävyysMiekka-olion, jolla
on parametrina annettu paino, arvo ja terävyys.
public String toString()Käännä luokka ja poista syntaksivirheet. Muuta pääohjelmaluokkaa niin, että siellä luodaan miekkoja, teroitellaan niitä sekä välillä tulostetaan niiden kuvaukset.
OlentoTämä on yläluokka pelissä esiintyville olennoille - ihmisille, peikoille, haltioille, noidille jne. Tee luokalle seuraavat ominaisuudet ja metodit.
nimipituusEsine oikea ja Esine
vasennull.
public void poimiOikeaan(Esine e)e.
Tee vastaavasti myös metodi poimiVasempaan.
public void pudotaOikeasta()pudotaVasemmasta.
Olento-olion, jolla
on parametrina annettu nimi sekä pituus. Käsissä ei ole aluksi
mitään.
public String toString()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.
Reppu
Seuraavaksi tehdään luokan Esine alaluokka
Reppu. Reppuun voi laittaa esineitä.
Tee luokalle seuraavat ominaisuudet
ja metodit.
kapasiteettipublic void lisääEsine(Esine e)public void poistaEsine(Esine e)Reppu-olion.
public String toString()Käännä luokka ja poista syntaksivirheet. Muuta pääohjelmaluokkaa niin, että siellä luodaan reppu ja laitetaan siihen esineitä.
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.
reppunull 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.
Huone
Luokka Huone kuvaa aluetta pelissä. Kussakin
huoneessa voi olla joukko olentoja ja esineitä. Lisäksi huoneet
on voitu kytkeä toisiin huoneisiin.
nimiolennotesineetolennot.
itään, länteen,
etelään ja pohjoiseenHuone ja
ominaisuuden arvona on jokin huone taikka null.
public void kytkeItään(Huone h)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.