Studio 1 Projektin Loppuraportti


Tiia Suomalainen
Syksy 2005

Sisällysluettelo

1. Ohjelman kuvaus

2. Tekninen toteutus 3. Kokemukseni projektista 4. Yhteenveto
5. Ohjelmakoodi Javadoc- kommentoituna

1. Ohjelman kuvaus


1.1 Yleiskuvaus

Projektina 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.
Vastustajan vuoro kulkee pääpiirteissään samoja linjoja. Kone arpoo itselleen kysymyksen, joka esitetään näytöllä. Pelaaja vastaa kysymykseen klikkaamalla Kyllä- tai Ei- nappia. Vastauksen perusteella kone poistaa itseltään kortteja. Pelaaja voi seurata koneen korttien tilannetta näytöllä. Kortit ovat esillä taustapuoli ylöspäin ja poistuvat sitä mukaan kun kone niitä poistaa.Koneen poistettua kortteja, on taas pelaajan vuoro.
Vuorollaan voi toki myös arvata vastustajan "mysteerikorttia". Arvaus kuluttaa aina yhden vuoron. Pelaaja voi arvata klikkaamalla epäilemäänsä korttia hiiren oikealla näppäimellä. Koneen vastaus arvaukseen tulee samaan paikkaan kun vastaus kysymykseenkin. Jos pelaaja on vuorollaan jo valinnut kysymyksen, hiiren oikean napin painamisesta ei enää tapahdu mitään. Kone ei voi lähteä veikkailemaan kortteja yhtä holtittomasti kuin pelaaja halutessaan. Se voi arvata vain, kun sillä on enää maksimissaan kolme korttia jäljellä.
Pelin toimiessa kuten toimii, jätetään pelaajalle mahdollisuus myös huijata tai tehdä virheitä. Jos koneen viimeinen kortti ei täsmää pelaajan korttiin, pelaaja voittaa, muttei saa siitä kunniaa, vaan myös kerrotaan että tämä on joko huijannut tai tehnyt virheen, koska koneen tekoäly ei anna tämäm poistaa vääriä kortteja. Pelaajan on täytynyt tällöin vastata kysymyksiin/ kysymykseen väärin.
Huolimatta siitä kuinka peli päättyy, pelin loputtua näytölle ilmestyy napit joista pelin voi aloittaa alusta tai siirtyä toiselle tasolle, ykköseltä kakkoselle ja toisinpäin.

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.
Pelinäkymä ei eroa eri pelitasoissa muuten, paitsi kakkostasossa pelaaja saa itse ennen pelin alkua valita pelin taustavärin. Tällöin koko pelin värimaailma muuttuu.

kuva pelistä

2. Tekninen toteutus


2.1 Toteutuksen yleisperiaatteet

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ä.
Erityisen ylpeä olen kuvakorttien kuvista. Niistä en kuitenkaan vastaa itse vaan ne ovat Roosa Heikkilän-11v. (allekirjoittaneen serkku) käsialaa. Kakkoskehyksen piirroshahmot on poimittu lelukatologi soft-toy.co.uk: sta lainattuja. Paitsi kivikauden asukit jotka ovat sivustolta www.fiftiesweb.com .

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.
Pelikehys ja vastustaja luokat viestittävät toisilleen vuoron vaihdot. Kun pelaaja on valinnut kysymyksensä JComboBoxista, kuuntelijsta kutsutaan Vastustajan metodia joka vastaa kysymykseen. Kun kysymykseen on vastattu, aktovoidaan vastausmetodin lopussa Pelaajan Valmis-nappula,jota pelaaja painaa poistettuaan kortteja. Kortit ovat aktiivisia koko pelin ajan(vasemmalle hiiren napille), koska niiden klikkailu ei vaikuta vuorojen kulkuun. Valmis nappia painalluksesta, kuuntelija kutsuu metodia joka aloittaa vastustajan vuoron, eli kysyy kysymyksen. Kysymyksen valitsevan metodin lopusta annetaan vastauvuoro pelaajalle aktivoimalla Kyllä- ja Ei-napit. Näiden nappien painamisesta kuuntelija taas kutsuu Vastustajalle metodia joka poistaa turhia kortteja vastauksen perusteella, vastaus annetaan metodille parametrinä. Tämän metodin lopusta taas siirretään vuoro pelaajalle aktivoimalla JComboBox ja kortit reagoimaan myös oikean hiirennapin painallukseen(eli arvaukseen). Oheinen kaavio visualisoi tapahtumaketjun.


  • Vuorojen kulku

  • 2.4 Ohjelman luokat


    Pelikehys - Kakkoskehys

    Pelikehys 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 - Vastapeluri

    Luokat 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 - Kakkoskortti

    Luokka 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.


  • Havainnollistava kartta luokista

  • Javadoc- kommentit
  • 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.
    Ohjelmassa on käytetty jonkun verran ArrayListejä, mm. kuvakortteja ja kysymyksiä säilytetään niissä, ja taulukoita joihin on esimerkiksi sijoitettu kysymyksiä vastustajan algoritmeissä, joista kerrotaan alla. ArrayListit sopivat tarkoituksiini mielestäni listoista parhaiten, koska niistä saa helposti haettua alkioita indekseillä. Taulukot taas olivat käytännöllisiä, koska tarvitsin erotella kysymyksistä sanoja ja tutkia niitä yksittäin, mikä käy taulukkoon asettamalla mukavasti.


    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.
    Kun numerot on käyty läpi, katsotaan if-lauseella, josko ensimmäinen sana olisikin "Onko". Jos on, katsotaan taas vastausta, jos se on kyllä, kutsutaan metodia vastustajaVoitti ja returnia, koska vastustaja on arvannut pelaajan mysteerikortin ja peli on loppu eikä vuoroa enää tarvitse siirtää pelaajalle. Jos vastaus taas on ei, katsotaan ensin if-lauseella jos kortteja on jäljellä enää 1, jos on, katsotaan laskurista ollaanko forissa ensimmäisellä kierroksella, jos ollaan niin peli päättyy, koska viimeinen jäljelle jäänyt kortti on väärä. Kutsutaan pelaajaBluffasi-metodia ja returnia. Jos kortteja on jäljellä enemmän kuin yksi, poistetaan arvattu kortti.

    luePelaajanKysymys

    Alku 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.
    Kaikki jäljellä olevat kysymykset käydään for-loopissa läpi ja asetetaan taulukkoon ja sijoitetaan kysymyksen ensimmäinen sana eli numero muuttujaan. Käydään if-lauseilla läpi kaikki ominaisuudet joilla metodia kutsutaan ja kunkin kohdalla poistetaan tietyt kysymykset. Kysymyksen poistamiseen mennään kahdella tavalla. Jos poistettavia kysymyksiä on alle puolet kaikista kysymyksistä, poistamiseen johtavan if- lauseen ehtona on että kysymyksen ensimmäinen sana on joku mainituista (eli käytetään ehdollista taita). Jos poistettavia kysymyksiä taas on yli puolet, ehtona on että jos kysymyksen ensimmäinen sana ei ole mikään mainituista, se poistetaan.

    3. Kokemukseni projektista


    3.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.
    Aloitin projektin kuvakorttien ja peliruudun tekemisellä, vasta kun ne olivat valmiit aloin miettiä pelin teknistä toiminnallisuutta. Järjestys ei ollut kaikista fiksuin, vaikkei se vaikutakkaan pelin toimivuuteen, alusta asti suunnittelemalla olisi kuitenkin varmaan saanut järkevämmän luokkajaon. Peliruudun tehtyäni jämähdin kuitenkin muutamaksi päiväksi paikalleen järkevän suunnitelman puuttuessa, väsäilin jotain enemmän tai vähemmän epämääräistä, kunnes ymmärsin alkaa tekemään suunnitelmaa. Sekään ei kuitenkaan sujunut aivan ongelmitta, en ollut aikaisemmin miettinyt vuorojen jakamista ja kulkua lainkaan ja siihen olikin oletettua vaikeampaa keksiä ratkaisua. Ensimmäisessä tekemässäni suunnitelmassa vuorot jakoi Pelimoottori joka antoi niitä Pelaaja ja Vastustaja luokille. Suunnitelmia kuitenkin tuli matkan varrella useita. Jouduin tekemään uuden, tarkemman melkein päivittäin kun huomasin että olin unohtanut joitain seikkoja kokonaan tai en vaan ollut ajatellut kaikkea. Uskon että on jopa hyödyllistä pohtia asioita uusiksi kesken projektin ja tarkentaa suunnitelmia, miettiä myös toisenlaisia ratkaisumalleja mitä alunperin on ajatellut. Kuitenkin edes suuntaa antavan kokonaisvaltaisen suunnitelman tekeminen jo ennen aloittamista olisi eheyttänyt prosessia. Kun sitä ei ollut, en ollut joinain päivinä varma mitä olin jo saanut aikaiseksi edellisinä, ja joskus en edes ollut varma mihin olin joillain toimillani tähdännyt, mm. mihin käyttöön joitan metodeita olin tarkoittanut. Tähän olisi tietenkin auttanut myös projektipäiväkirjan pitäminen. Lopputulokseen en kuitenkaan usko näiden asioiden vaikuttavan, muuta kuin luokkajakoon. Aluksi olin hyvinkin tyytymätön siihen että Pelikehys luokasta tuli niin laaja ja jokaiselle uudelle pelille avataan uusi ikkuna, siis uusi peli aloitetaan luomalla uusi pelikehys. Kuitenkin koska kakkososan valikostakin joidenkin viime hetken lisäominaisuuksien ansiosta tuli erilainen, siihen olisi joka tapauksessa pitänyt tehdä uusi ikkuna, eli kokonaan eri Pelikehys metodi, en ole ratkaisuun enää niin tyytymätön. Toki vielä parempi ratkasu olisi ollut jakaa molempiin tasoihin Pelikehys luokka kahtia, eli uusi ikkuna olisi avattu vain tasosta toiseen siirryttäessä, muuten uusi peli aloitettu samassa ikkunassa.

    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.
    Toisen, samaan algoritmiin, el korttien poistamiseen liittyvän ongelman huomasin vasta lopussa, kun peli oli valmis. Aina välillä vastustajalle jäi väärä kortti viimeiseksi. Luulin ongelman olevan kortin ominaisuuksissa, eli tekstitiedostossa tai sitten poistamisalgoritmin poistavan vääriä kortteja. Kummastakaan kuitenkaan ei löytynyt mitään vikaa. Useiden tulostuksien laittamisen, vielä useampiin paikkoihin, jälkeen huomasin että jo jäljellä oli kaksi korttia ja vastustaja arvasi niistä jommankumman mysteerikortiksi ja arvaus oli väärä, molemmat kortit poistetiin, jos se jota ei arvattu oli listassa ensimmäisenä. Koska algoritmissä jos vastustajalla on enää yksi kortti ja arvaus on ollut väärä, peli päättyy. Kun toinen korteista on poistettu, eli ollaan for-lopissa toisella kierroksella, kortteja on enää yksi, vaikka niitä alunperin olikin kaksi. Ratkaisu ongelmaan löytyi onneksi kuitenkin helposti, laskurilla joka kertoo montako kierrosta foria ollaan menty.
    Pahin algoritmeihin liittymätön ongelma oli Kakkoskehys luokassa. Aloita alusta metodi ei luonut uutta kakkoskehystä, vaan uuden ykköskehyksen. Tämän kanssa meni monta päivää, ja aloin jo epäillä jäisikö peli sellaiseksi. Mutta taas, lukuisien tulostusten, ja kaiken muun mahdollisen jälkeen huomasin että actionListener metodissa siirrytään suoritetaan molempien kehysten luontimetodit, vaikka ne olivat toisensa poissulkevissa if-lauseissa. Syy tähän oli yksi ylimääräinen ; -merkki väärässä paikassa. Aina virheen ei tarvitse olla suuri kun se on oikeassa paikassa.
    Muitakin pienempiä ongelmia oli, mutta suurin osa oli onneksi helposti ratkaistavissa, ja löydettävissä ennen kaikkea.

    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.
    Aikaakin ohjelman tekoon meni suunniteltua enemmän, yli 90 tuntia. Siitä suuri osa on kuitenkin suunnittelua ja pohtimista, tosin myös mekaaninen kirjoittaminen vei oman aikansa, koska metodit ovat niin pitkiä ja tekstitiedostot työläitä. Ennalta suunnittelu olisi varmaankin myös pienentänyt tuntimäärää. Seuraavalla kerralla tekisin ajankäyttösuunnitelman paremmin omille tavoilleni sopivaksi, mutta suunnittelisin huolellisemmin etukäteen.

    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.
    Eniten projektin ansiosta ehkä opin omista työskentelytavoistani. Mikä minulle sopii, mikä ei, ja mitä minulla on parannettavaa. En saanut aloitettua ajoissa, vaan jätin kaiken viimetinkaan ja ennakkosuunnittelu ja panostus oli olematonta. Toisaalta kun pääsen vauhtiin, työskentelen mielelläni asian parissa niin pitkään että saan jotain valmiiksi ja panoudun siihen kerralla kunnolla.
    Itse ohjelmoinnista en oppinut merkittävän paljon uutta, mutta mielestäni ymmärrän asiat paljon paremmin nyt, jouduttuani miettimään itse miten asioita voi ja kannattaa toteuttaa ja missä tilanteissa mitäkin Javan valmiita tietorakenteita ja metodeita on järkevä käyttää. Ylipäänsä juuri toteutuksen kokonaan itse suunnittelu oli vaikein ja oppimisen kannalta hyödyllisin osa. Osaan nyt myös paljon paremmin hyödyntää ja etsiä tietoja JavaAPI:sta. Itsenäisen tiedonhankinnan opettelu on tottakai aina hyödyllistä.

    5. Ohjelmakoodi

  • Ohjelmakoodi javadoc-kommentoituna

  • Täältä voit ladata itsellesi pelin zip -pakattuna:
  • Ohjelmakoodi zip-paketissa

  • 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