Ohjelmointikierros 5

 

Viidennellä ohjelmointikierroksella hylättiin aikaisempien ohjelmointikierrosten seikkailupelimaailma ja aloitettiin puhtaalta pöydältä uuden projektin parissa. Tällä kertaa aiheena oli luoda kaikille tuttu miinaharavapeli – ihan oikeasti toimiva peli, jota pysty klikkailemaan ja se reagoikin!

 

Ohjelmointikierroksen ideana oli tutustuttaa Swing-luokkakirjaston käyttöön, minkä avulla ohjelmalle luotaisiin graafinen käyttöjärjestelmä. Muutenkin tarkoitus oli tutustuttaa kerroksellisen käyttöjärjestelmän tekemiseen, eli MVC-malliin.

Ohjelmointikierros erosi aikaisemmista myös ohjeistuksen osalta – itse tehtävänanto oli paljon avoimempi kuin aikaisemmat tehtävänannot, joissa kaikki oli annettu metodien nimiä myöten. Tehtävänanto antoi selkeän kuvan siitä, mitä haetaan, muttei rajoittanut käytännössä koodin tekemistä.

 

Jo työn alkumetreillä pääsi ihastelemaan näytölle avautuvia ikkunoita ja nappuloita ja työnsä tulokset pääsi konkreettisesti näkemään jossain muussakin muodossa kuin konsoliprintteinä.

 

Actionlistenereiden ja layout asettelijoiden kanssa oli Google kiihkeässä käytössä, varsinkin kun ohjelma tuuppasi olemaan toimimatta pikkuvirheiden takia. eikä ollut aivan varma mihin kaikkialle niitä sulkeita tuli pistää.

 

Luokan peliruudukko ja peliruutu integrointi uhkasi vakaasti tuottaa harmaita hiuksia, mutta onneksi töppäilyjään pystyi koko ajan tarkistelemaan graafisen puolen kautta – virheet oli helppo löytää, kun pääsi konkreettisesti näkemään, mikä ei toimi ja miten se ei toimi. Vanhat rakkaat For-loopit olivat ahkerassa käytössä ruudukoiden läpikäymisessä.

 

Loppumetreillä ohjelmointi muuttui taas helpommaksi pikkunäpertämisesksi, ja varsinkin viimeisten tuntien aikana bonustehtävien näpertäminen oli varsin mukavaa, vaikka appletin tekeminen ei aivan onnistunutkaan. Kokonaisuudessaan oli mukavaa saada tehdyksi konkreettinen ohjelma GUI:lla niin, että itsekin pääsi sitä napsuttelemaan.

 

 

Ohjelmointikierros 4: Hyvästi seikkailupelit!

Viimeinen seikkailupeliin liittyvä ohjelmointikierros oli myös kaikista vapain. Tämä oli myös viimeinen kierros, kun kaikki edelliskierrosten onnistumiset ja epäonnistumiset kumuloituivat kierroksen tuotokseen. Eräällä tavalla kyseessä oli jopa motivoivin kierros kaikista, kun kierroksen lopussa odotti (ilman bumerangia) ikuinen vapaus seikkailupelistä. Lähtökohdat olivat siis hyvät.

Ohjelmointikierros alkoi omien rajapintaluokkien luomisella, joka tuntui aluksi hyvin vaikeaselkoiselta. Nyt myöhemmin on rajapintaluokkien olemassaolon syyt ja seuraukset selvinneet ja niiden opettelun syy on järkeistynyt. Seikkailupelissä ensimmäinen rajapintaluokka oli Sektorintarkkailija, joka tarkkailee omaa sektoriaan. Käytännössä Sektorintarkkailija toteutettiin esimerkiksi Marsalkka-luokassa, jonka ominaisuutena oli nukkua, heräillä ja hyökätä sektorissa liikkuvien olentojen mukaan.

Sektorintarkkailijoiden jälkeen ohjelmointikierroksessa luotiin toinen rajapintaluokka Vuorollinen, jota hyödynnettiin myös myöhemmin pelissä. Vuorollinen tuntui koodikierroksessa huomattavasti ymmärrettävämmältä kuin Sektorintarkkailija ja kyseinen rajapinta auttoi myös ymmärtämään paljon paremmin koko rajapinnan ideaa. Vuorollisen kautta alkoi koko seikkailupelin tarkoitus ja kaikkien syksyn koodailujen idea vihdoin selvitä.

Kun Vuorollinen rajapinta oli luotu ja Olento laitettu toteuttamaan se, oli vuorossa oman Avatarin luominen ja itse Pelimoottorin suunnittelu. Kierroksen samalla mukavin ja hankalin vaihe alkoi tästä. Vihdoin sai tähän järjettömyyteen alkaa tuoda myös omia näkemyksiä. Oman pelini ideaksi tuli hyvin yksinkertainen. Pelaajan oli tarkoitus tappaa muita olentoja maastosta ja saada niistä pisteitä. Tietyn pistemäärän jälkeen peli loppui. Eri olioista sai eri määrän pisteitä sen mukaan kuinka helppoja ne olivat tappaa ja kuinka hanakasti ne hyökkäsivät olennon päälle.

Tämän kierroksen opettavin osuus oli luultavasti erilaisten komentojen luku ja syöttö käyttäjän antamasta syötteestä. Myös luokkien main metodin ”String[] args”-parametri sai vihdoin järjellisen merkityksen. Käyttäjän antamien komentojen parsiminen oli mielenkiintoista ja vääränlaisten komentojen käsittelyn toteuttaminen mielenkiintoista. Jälkikäteen ajateltuna kuitenkin esimerkiksi oma toteutukseni oli hyvin purkkainen.

Lopulliseksi arvosanaksi sain tästä kierroksesta 3, joka tuntui riittävältä. Pääasia oli, että alusta alkaen vihaamani seikkailupeli oli takana. Sen sijaan edessä odottanut miinaharava oli ensimmäinen koodikierros, jonka tehtävänantoa olin odottanut koko kurssin alkamisesta lähtien. Seikkailupeli tulee kuitenkin jäämään aina mieliini ohjelmana, joka opetti minut rakastamaan ja vihaaman java samanaikaisesti mihin vuorokauden aikaan tahansa.

Ohjelmointi 2

Toinen ohjelmointikierros koitti ensimmäisen kierroksen jälkeen ja nopeasti koittikin. Ennen kuin oli ehtinyt sisäistää ensimmäisenkään kierroksen asioita oli otettava käyttöön liuta uusia Javan ominaisuuksia ja suunniteltava kompleksisia loogisia rakenteita. Tehtävä oli tuntui haastavalta ja välillä hyvin hajottavaltakin, mutta lopulta siitä selvittiin.

Toinen ohjelmointikierros erosi ensimmäisestä kierroksesta tehtävän haastavuuden lisäksi ajankäytöllisissä asioissa. Nyt kuvaan nousivat luotujen luokkien testaukset ja niistä seuranneet virheiden etsinnät. Omalla kohdallani virhettä etsittiin Sektoritestissä monta tuntia Sektori-luokasta kunnes vihdoin huomattiin, että isoin virhe olikin Karttaruudussa. Tätä ennen oltiin kuitenkin ehditty korjata monta virhettä Sektoristakin. Monen tunnin kuluminen yhden luokan koodin korjaamiseen tuli itselleni yllätyksenä, johon en ollut ymmärtänyt varautua, ja tästä johtuen opinkin Studio 1:stä selviytymisen kannalta elintärkeän asian: kierrosta ei koodata yhdessä päivässä.

Kierroksessa palkitsevaa oli omien logiikoiden laatiminen. Varsinkin sitten kun ne toimivat. Aluksi metodin logiikan kehittäminen vaikutti saavuttamattomalta määränpäältä. Tähän oli kaksi syytä. Ensinnäkin tilani perjantaina oli melko mielenkiintoinen. Olin jännittänyt tulevan päivän koitosta ja nukkunut huonosti, ruokailuista oli monta tuntia ja koodia oli tullut tuijotettua liian monta tuntia putkeen ilman happihyppelyä. Toisaalta logiikkaa on vaikea hahmottaa selittämättä sitä itselleen toisin sanoin. Tämän tajuaminen oli koodini syntymisen kannalta ensiluokkaisen tärkeää havaita. Näin ollen ennen kuin edes yritin luoda Eclipseen riviä toisen perään koodia otin lyijykynän ja paperia ja aloin hahmotella metodin ehtoja ranskalaisin viivoin.

Kierroksen lopun generoinnin laatiminen ja testaaminen oli ehdottomasti koko kierroksen hauskin vaihe. Oli virkistävää katsella maastotyyppien syntymistä maailmaan väreinä monen tunnin tekstin tuijottamisen jälkeen, ja oli hienoa huomata, että syntyvän maailman logiikkaa vastasi sitä, mitä oli paperilla luonnostellut.

Toinen kierros oli opettavaisempi kuin ensimmäinen kierros kuten odottaa saattoi. Oli kuitenkin hyvä, että nollaharkka ja ensimmäinen kierros olivat pohjana. Muuten mistään ei olisi tullut mitään. Koodaamista auttoi myös itseä taitavampien kurssitovereiden tuki. Kaksi päätä oli todellakin enemmän kuin yksi. Parhaiten löysi omat virheet ja koodin tai logiikan puutteet, kun oli kaveri kyseenalaistamassa omia ratkaisuja ja esittämässä kysymyksiä rivi riviltä. Projektia varten pitää kyllä hankkia kumiankka.

Ohjelmointitehtävä 1 – Olipa kerran olio

Kun pari viikkoa orientoitumista oli takana, uudet kaverit oli hankittu ja tapahtumia riitti, ajattelin mielessäni: ”Eihän tämä ole ollenkaan hassumpaa”. Sitten se iski kuin märkä rätti vasten kasvoja – Ohjelmointitehtävä numero uno.

En ollut suinkaan ainoa, joka ei osannut odottaa, puhumattakaan arvostaa tulevia perjantai-iltoja (ja öitä) koulun hikisessä tietokoneluokassa muiden kohtalotoverien kanssa. Työmäärä javanoviiseille oli valtaisa, eikä yksikään rivi tullut kirjoitetuksi oikein ilman kerta toisensa jälkeen epätoivoisempaa huutoa: ”Assariiiiii…!”. Pitkät illat tutkittiin luokkien ja olioiden mystistä maailmaa, luotiin attribuutteja, metodeja ja ties mitä noittuutta. Vähemmästäkin lähtee järki ja terveys.

Ymmärsin siis tulevan syksyni tarkoittavan epätoivoista koodaamista yömyöhään ja heitin hyvästit ajatukselle rennoista illoista kavereiden kanssa tummien lagerien äärellä. ”Ei auta” – ajattelin, ja aloitin lukea tehtävänantoa. Loimme kuin tyhjästä esineitä ja olentoja, jotka saivat puukkoja ja tökkivät tynnyreitä ja toisiaan. ”Tämähän on kivaa!”, kuulin erään Jaakko Taskisen huutavan monasti upouuden MacBookinsa äärellä silmät loistaen, mutta itse en voi sanoa samanarvoista valaistusta kokeneeni tämän tehtävän aikana.

Koodaaminen oli pakko keskittää niin kutsuttuihin paniikkeihin, sillä muuten ei yksinkertaisesti ollut mahdollista edetä, sillä assarit olivat ainoa keino saada koodia eteenpäin. Kateellisena katselimme niitä, jotka jo kaukaa viisaana olivat tutustuneet Java-ohjelmointiin. Pian päätään nostivat ne uljaat ja avuliaat, jotka auttelivat avuttomia phukseja omalla kallisarvoisella vapaa-ajallaan, ja osaltaan tekivät sen mahdolliseksi, että suuri osa sai kuin saikin koodinsa valmiiksi määräaikaan mennessä.

Tehtävä itsessään tutustutti tekijänsä javan perusominaisuuksiin, kuten operaattoreihin ja if-lauseeseen. Vaikka jälkeenpäin nämä kaikki tuntuvat suhteellisen helpolta, muistan elävästi, kuinka epätoivo hiipi taikajuoman herkullisuutta määritellessä samassa mittakaavassa kuin pahimpina asepalveluksen märkinä maastoaamuina viikon pituisen leirin toisena aamuna.

Pikku hiljaa alkoi onnistua itsenäinenkin työskentely, eikä assaria tarvinnut pitää kädestä. Google oli ystävä, ja sieltä saikin usein paljon helpommin ja paremmin vastauksen kuin kurssin oppikirjoista. Siinä vaiheessa kun konsoliin sai tulostettua eeppisen taistelun oikein, sydämen valtasi lämmin tunne, että tämä on ohi, luojan kiitos. Mutta ilo oli ennenaikaista, sillä jo maanantaina silmien edessä odotti uusi tehtävä, joka oli taas naamioitu hauskan kuuloiseksi. Seikkailupeli ja taisteluja – pakkohan sen on olla nyt kivaa. Vai onko..? No eipä ollut ei.

Ohjelmointi 3 – Syvillä vesillä

Tällä ohjelmointikierroksella ei tullut niin paljon isoja uusia asioita, kuin aikaisemmilla kierroksilla. Uusina asioina tulivat kuitenkin abstraktit luokat ja metodit, iteraattori ja poikkeukset. OLO-session kuudennella kierroksella käsiteltiin rekursiota, ja nyt siihen päästiin tutustumaan koodin muodossa, kun Olento-luokan asetaSijainti ja Sektori-luokan sijoitaOlento -metodit aiheuttivat päättymättömän rekursion. Tämä johti lopulta StackOverflowErroriin, koska resurssit loppuvat aikanaan kesken, jos metodi kutsuu toista metodia, joka taas kutsuu kutsuvaa metodia jne., jolloin syntyy ikuinen luuppi. Kun metodit sai toimimaan niin, että ne kutsuivat toisiaan vain tarvittaessa, päästiin virheistä eroon ja ohjelma toimi taas kuin unelma.

Lue loppuun