Sisällysluettelo2. Tekninen toteutus
2.2 Toteutusympäristö 2.3 Toteutuksen pääperiatteet 2.4 Ohjelman luokat 2.5 Käytetyt algoritmit 5. Ohjelmakoodi Javadoc- kommentoituna 1. Ohjelman kuvaus1.1 YleiskuvausProjektina tekemäni peli on moderni versio yhdestä lapsuusajan suosikkipelistäni, Arvaa kukasta. Perusidealtaan se on samalainen. Molemmilla pelaajilla on 24 persoonallisen näköistä kuvakorttia, sekä "mysteerikortti", jota toinen yrittää arvata kysymällä kysymyksiä "mysteerikortin" ominaisuuksista. Omia kortteja poistetaan sitä mukaan kun niiden ominaisuudet eivät enää uusien tietojen valossa täsmää "mysteerikorttiin". Mitä vähemmän kortteja on jäljellä, stä helpompaa on arvata, mikä niistä voisi olla "mysteerikortti". Kuten alkuperäisessäkin versiossa, ensimmäisenä oiken arvannu voittaa pelin. 1.12 Toiminnallisuus
Toiminnallisuudeltaan peli on tottakai hieman erilainen kuin alkuperäinen, koska se pelataan laudan sijasta
tietokonella ja vastustajakin on tekoälynsä rajoitteissa pelaava tietokone. Kysyttävät kysymykset on rajoitettu
tiettyihin mahdollisiin. Pelaajan kysymykset ovat näytöllä JComboBoxissa, josta pelaaja voi valita haluamansa.
Peli alkaa pelaajan valitessa ensimmäisen kysymyksensä. Vastustaja vastaa kysymykseen mysteerikorttinsa perusteella
kysymyksen alapuolelle. Vastauksen perusteella pelaaja voi sitten "poistaa" kuvakorttejaan näytöltä klikkaamalla niitä
hiiren vasemmalla näppäimellä. "Poistettua" korttia uudelleenklikkaamalla se tulee takaisin, siten pelaaja voi korjata
mahdolliset virheelliset poistot. Vuoro päättyy korttien poistamiseen. Vuoron päättymisestä pelaaja viestittää vastaustajalle
klikkaamalla hiirellä Valmis-nappia.
1.3 Käyttöliittymä
Ohjelman käyttöliittymä on graafinen. Käyttöliittymän toteutuksen tavoitteena oli selkeys ja ymmärrettävyys, sekä saada
kaikki pelin kannalta olennaiset asiat näkyviin. Käyttöliittymä on siitä yksinkertainen, ettei pelinäkymä juurikaan muutu
pelin aikana. GridBagLayoutin opettelemisessa ja sillä komponenttien asettelussa oli kuitenkin omat haasteensa.
Peli alkaa aloitussivulla, josta voi valita haluaako aloittaa ykköstason tai kakkostason, vai lukea peliohjeet.
Itse Pelinäkymä koostuu pelaajan korteista, mysteerikortista, vastustajan korteista, pelaajan kysymyksistä (JComboBox),
vastustajan vastaus- ja kysymyspaikoista (JTextField), pelaajan vastausnapeoista, eli Kyllä- ja Ei-napista, Valmis- napista,
sekä alapaneelista, johon tulee pelin aikana tietoja ja ohjeita.
Toteutuksen yleiperiaate eroaa täysin projektisuunnitelmassa pohditusta. Aluksi pelissä piti olla pelimoottori ja pelaaja luokat.
Peliä tehdessäni kuitenki huomasin, ettei pelimoottoria tarvitakkaan, vaan selkeintä on laittaa luokat kommunikoimaan keskenään
vuoron vaihtumisesta. Pelaaja luokka oli mukana vielä pitkälle, kunnes totesin ettei siihen yksinkertaisesti tarvita mitään, koska
pelaaja päättää kaikista toiminnoistaan itse. Pelaajan kanssa tuntui olevan helpointa kommunikoida kuuntelijoiden välityksellä,
koska kaikkiin pelaajan mahdollisiin siirtoihin liittyy kuuntelija. Niin peliin loppujenlopuksi jäi vaan Pelikehys ja Vastustaja, jotka huolehtivat siirtojen
kulusta ja käyttöliittymän luomisesta, sekä Kuvakortti luokka joka huolehtii korteista ja niille olennaisista toiminnoista.
Kakkostasossa luokat ovat perusperiaatteiltaan samanlaisia, mutta erinimisiä.
2.2 ToteutusympäristöOhjelmointi on toteutettu Eclipse ohjelmalla. Kuvakorteissä käytetyt kuvat on piirretty käsin ja muokattu sopiviksi ACDSee for Pentax kuvankäsittelyohjelmalla. Kakkostason piirroshahmokuvat on lainattu lelugatalogista, sekä interentsivuilta ja muokattu Paintia sekä ACD:tä kayttäen. Tietoa ohjelmoinnin apuun on hankittu paljon JavaAPI- oppaasta. 2.3 Toteutuksen pääpiirteet
Ohjelma koostuu kuudesta pelin toiminnan kannalta olennaisesta luokasta, sekä Aloituksesta ja Peliohjeista, jotka ovat ikkunoita.
Kuusi luokkaa jakautuu molempien tasojen kolmeen olennaiseen luokkaan. Pelikehys luokassa luodaan pelinäkymä ja kaikki siinä
olevat komponentit, mukaanlukien kuvakortit, sekä vastustaja, näin luokkien välinen kommunikaatio toimii. Pelikehyksessä
luodaan myös muita pelin kannalta olennaisia elementtejä, kuten listat kysymyksistä ja korteista.
2.4 Ohjelman luokatPelikehys - KakkoskehysPelikehys on ykkösluokan ja Kakkoskehys kakkosluokan muiden luokkien äiti. Kommunikoinnin helpottamiseksi muut luokat luodaan niissä. Niissä luodaan myös kaikki muu pelin toiminnan kannalta olennainen, kuten lista kysymyksistä. Pelikehyksessä on metodeita joilla sen komponentteihin pääsee käsiksi. Kuten muuttamaan vastustajan kysymyksen ja vastauksen tekstejä ja muuttamaan aktiivisiksi ja ei-aktiivisiksi ruudun nappeja ja JComboBoxia. Metodit ovat olennaisin osa kommunikointia Vastustaja-luokan kanssa. Kakkoskehyksellä on lisäksi metodeita joilla voi muuttaa pelikentän taustaväriä ja vastustajan korttien sekä nappien värejä. Vastustaja - VastapeluriLuokat huolehtivat kaikista vastustajan toiminnoista, Vastustaja ykköstason ja Vastapeluri kakkostason. Niihin on metodien avulla rakennettu koneen "teköäly". Luokat ovat melkein identtiset. Vastapeluri luokan metodit toimivat samalla periaatteella, niissä on vain enemmän pituutta, koska kakkostason korteissa on enemmän ominaisuuksia ja siten myös kysymyksiä on enemmän. Joten metodeissa joudutaan tarkastamaan enemmän vaihtoehtoja. Kuvakortti - KakkoskorttiLuokka on vastuussa kuvakorteista. Korttien mahdolliset ominaisuudet ovat luokan attribuutteina. Luokassa on metodit jokaisen ominaisuuden selvittämiseen, niitä tarvitaan kysymyksiin vastaamiseen. Luokan metodeilla voidaan myös selvittää onko pelaajan kortti "poistettu" vai ei ja onko se asetettu sellaiseksi että sitä voi muokata vai ei. Jokaisen 24 kortin ominaisuudet on kuitenkin kirjoitettu tekstitiedostoon, josta ne luetaan ja niiden pohjalta luodaan Kuvakortti tai Kakkoskortti luokan luontimetodilla kortteja Pelikehys luokassa. 2.5 Käytetyt algoritmit ja tietorakenteet
Osa vastustajan toiminnoista, kysymykseen vastaaminen ja korttien sekä kysymysten poistaminen muodostuivat pitkähköiksi for-
ja if- lause komplekseiksi. Metodeissa käytetyt algoritmit eivät edes ole kovin monimutkaisia, ne oli suhteellisen helppo
keksiä, niistä vaan muodostui pitkiä, koska tarkasteltavia vaihtoehtoja oli niin monia. Tosin niissä oli myös helppoa
tehdä pieniä virheitä, jotka vaikuttivat olennaisesti pelin toimintaan.
Muissakin Vastustaja ja vastapeluri luokkien metodeissa, kuten vaikka kysymyksen arpomisessa on käytetty kohtuullisen
paljon if-lauseita, mutta niissä ei ole kovin merkittäviä algoritmejä, vaan vain vaihtoehtoisia toimintoja ja todennäköisyyksiä
kortin arvaamiselle(arvoKysymys). Pelikehys luokassa on enimmäkseen vaan metodeja joilla pääsee käsiksi sen ominaisuuksiin
ja komponentteihin samoin Kuvakorttiluokassa metodeita ominaisuuksien kysymiseen. Näitä metodeja sitten käytetään Vastustaja
luokan metodeissa.
muokkaaKortistoa
Muokkaa kortistoa-metodi poistaa vastustajan kortteja jotka eivät enää sovi kuvaukseen, pelaajan vastauksen jälkeen.
Metodi saa parametrinä pelaajan vastauksen. Aluksi siinä laitetaan taulukkoon vastustajan kysymä kysymys, katsotaan onko
se tarpeeksi pitkä ja jos on, sijoitetaan sen ensimmäinen sana muuttujaan. Kysymyksestä ei tarvitse tarkastella kuin
ensimmäistä sanaa, koska se on tavallisissa kysymyksissä kysymyksen numero ja mysteerikortin arvauksessa "Onko". Vastustajan
kysymys laitetaan aina kysyttäessä muuttujaan talteen, jotta sitä voidaan tässä metodissa tarkastella. Sitten käydään kaikki
vastustajan jäljellä olevat kortit for-loopilla läpi ja forin sisällä tutkitaan jokainen kysymysvaihtoehto ja kysymyksen molemmat
vastausvaihtoehto if-lauseella ja tehdään tarvittavat toimenpiteet. Käytän esimerkkinä ensimmäisen kysymyksen tarkastelua,
kaikki loput käydään läpi samalla tavalla. Ensin katsotaan if lauseella, onko kysymksen ensimmäinen sana "1.", jos on,
katsotaan if-lauseella onko pelaajan vastaus(parametrinä saatu) kyllä, jos on kutsutaan poistaKysymys-metodia ominaisuudella
"nainen" ( poistaKysymys-algoritmi), koska kysymys numero yksi on "Onko hän nainen ?". Sitten tarkastellaan
korttia, katsotaan if-lauseella, kortin, onkoNainen-metodilla onko kortin henkilö nainen. Jos ei, kortti poistetaan listasta
ja sen taustaväriksi asetetaan pelin taustaväri. Sen jälkeen tutkitaan vaihtoehto, että pelaajan vastaus olisikin ollut kieltävä.
Silloin kutsutaan poistaKysymys-metodia ominaisuudella "mies" ja katsotaan if-lauseella kortilta, onko tämän henkilö nainen, ja
jos on, kortti poistetaan listasta ja sen taustaväri muutetaan. Tämä käydään läpi jokaiselle kysymysnumerolle.
luePelaajanKysymysAlku ja koko perusperiaatekin on melkein sama, kuin edellisessäkin algoritmissa. Kysytään Pelikehykseltä pelaajan kysymys, laitetaan muuttujaan, pilkotaan taulukkoon ja tarkastellaan taas ensimmäistä sanaa, eli kysymysnumeroa. Sitten taas käydään kaikki mahdolliset kysymykset läpi if lauseissa ja niissä kysytään vastustajan omalta mysteerikortilta kysyttyä ominaisuutta ja asetetaan vastaus näytölle Pelikehys luokan metodilla. poistaKysymys
Tässäkin algoritmi on muista poikkeamatta itseään toistava pitkä if-lause jono.
Metodi saa parametrinä jonkun ominaisuuden ja tarkoituksena on poistaa kysymykset joiden kysyminen on ominaisuus
tiedettäessä varmasti turhaa.
3. Kokemukseni projektista3.1 Suunnittelu
Projektisuunnitelmaa tehdessäni olin miettinyt hyvin vähän ohjelman toiminnallista, teknistä puolta. Pohdin oikeastaan vaan
kuvakortteja ja käyttöliittymää ja suurpiirteisesti mitä ominaisuuksia eri luokkien pitäisi sisältää.
Loppujenlopuksi en tainnut tehdä oikeastaan mitään niinkun suunnitelmassa oli sanottu, paitsi pelin perusidea on tottakai sama.
Olen kyllä tyytyväinen siihen, kaikki ratkaisut ovat mielestäni parempia kuin suunnitelmassa mietityt. Ne harvat
joita pohdin siinä siis. mm. pelaaja ei itse kirjoita kysymystä, vaan valitsee, eikä tarvita mitään lukijoita
kysymyksen selvittämiseen, vaan se saadaan melkein suoraan muuttujaan. Myöskään vastausta ei kirjoiteta, vaan
klikataan nappia. Myös pelaaja-luokka puuttuu.
3.2 Virheet
Virheitä- niitä jotka huomasin, oli yllättävän vähän. Niistä tosin sitten riitti päänvaivaa pidemmäksikin aikaa.
Kuten Algoritmiosiossa jo mainitsin, suurin osa aiheutui loppujenlopuksi todella pienistä yksityiskohdista vastustajan
algoritmeissä. Ensimmäinen ongelma oli että vastustaja poisti kortteja aivan kummallisesti. Se johtui siitä että
korttien poistaminen kävi for-loopin sisällä, joka kävi kortit yksitellen läpi. Kuitenkin jos kortti poistettiin, seuraavana
listassa oleva kortti siirtyi sen indeksiin, for loopissa mentiin kuitenkin jo seuraavaan indeksiin, joten oikeasti seuraavana ollutta
korttia ei koskaan tarkasteltu. Ratkaisu ongelmaan ei löytynyt helposti, mutta tuli kuitenkin; kun kortti poistettiin,
indeksiä pienennettiin yhdellä. En keksi miten ongelma olisi voitu välttää muuta kuin keksimällä se etukäteen, mutta onneksi
huomasin sen ensimmäisen algoritmin kohdalla, niin seuraavissa samankaltaisissa siltä vältyttiin.
3.3 Oma työskentely
Aluksi vaikutti siltä etten saisi mitenkään itseäni kasattua ja viemään läpi projektin tekoa.
Suunnittelemani aloituspäivä oli jo mennyt aikoja sitten, mutta projekti oli vain kaukainen ajatus pään takanurkassa.
Vielä joulun tullessa käyttöliittymäkin oli vielä lapsenkengissä. Suunnitelman mukaan olisi oltu projektin puolivälissä.
Olin miettinyt koodaavani keskimäärin 6 tuntia päivässä, muutaman viikon ajan. Loppujenlopuksi koodasinkin viimeisen viikon
10-12 tuntia päivässä. Tosin huomasin myös, että itselleni paremmin sopii uppoutua työhön koko päiväksi kerrallaan, muutaman päivän
putkissa, kuin koodailla 6 tuntia päivässä pidemmällä aikavälillä. Loppujenlopuksi siinä kahdessatoista tunnissakaan ei
saa enempää kuin yhden kokonaisuuden tehtyä, jos sitäkään. Ja koska suunnitelmani oli mitä oli, oli parempi tehdä kokonaisuus
kerralla. Olenkin tyytyväinen siihen, miten lopussa sain itseäni niskasta kiinni ja syventymään projektiin jopa kiitettävällä tarmolla.
4. Yhteenveto
Kaikenkaikkiaan olen tyytyväinen lopputulokseen. On aika mahtavaa nähdä jotain alusta asti itse suunnittelemaansa ja toteuttamaansa
oikeasti pelattavan ja ennenkaikkea sen toimivan. En henkilökohtaisesti ole tietokone- tai pelikone-pelien ystävä, mutta mielestäni
pelistä tuli ihan hauska ja pelattava. Se on riittävästi lautapelimäinen ja lapsellinen jopa. Jos olisi ollut enemmän aikaa, olisin vielä parannellut
vastustajan teköälyä, jotta sitä vastaan olisi haastavampi pelata. Pelin ulkoasuun olen tyytyväinen, siitä en muuttaisi mitään. Ulkoasusta erityisen
ylpeä olen kakkososan ominaisuudesta, jossa voi itse valita taustavärin pelille.
5. Ohjelmakoodi
Täältä voit ladata itsellesi pelin zip -pakattuna: Täältä löytyy ohjeet Java-ympäristön lataamiseen, tarvitset sitä pelataksesi peliä. Tosin kevyempi versio riittää. http://www.cs.hut.fi/Opinnot/T-106.2001/Ohjeet/jdk-asennus.html |