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.

Mainokset

Tentti 20.12.

Tentti oli ja meni. Neljäs tehtävä oli ainakin allekirjoittaneen mielestä mielenkiintoinen ja ohessa kyseisen tehtävän koodi:

public class Hissi {
    protected boolean virratPäällä;

    public Hissi(){
        System.out.println("Kone Oyj");
        virratPäällä = true;
    }
    public static void main(String[] args){
        Hissi h1 = new PaterNoster();
        System.out.println("-----");
        Hissi h2 = new Automaattihissi();
        System.out.println("-----");
        h1.liiku();
        System.out.println("-----");
        h2.liiku();
    }
    public void liiku(){
        System.out.println("liiku()");
    }
    public String toString(){
        return "Geneerinen hissi";
    }
    private static class PaterNoster extends Hissi {
        public void liiku(){
            if (this instanceof Object && this.virratPäällä){
                System.out.println("toimii");
            }
            else{
                System.out.println("ei toimi");
            }
            Hissi hissi = this;
            System.out.println(hissi.toString());
            System.out.println(this);
        }
        public String toString(){
            super.toString();
            return "Tervetuloa!";
        }
    }

    private static class Automaattihissi extends Hissi {
        private int kerros;

        public Automaattihissi(){
            super();
            System.out.println("Automatic");
        }
        public void liiku(){
            for (this.alusta(); this.ehto(); this.muuta()){
                System.out.println("Liikutaan");
            }
        }
        private void alusta(){
            this.kerros = 3;
            System.out.println("Lähtökerros: " + this.kerros);
        }
        private boolean ehto(){
            boolean b = this.kerros > 0;
            System.out.println("Jatketaan: " + b);
            return b;
        }
        private void muuta(){
            this.kerros--;
            System.out.println("Seuraava kerros: "+ this.kerros);
        }
    }

}

Allekirjoittaneella meni ainakin väärin :). Tammikuussa nähdään!

Teoria 4 – Perjantai-illan huumaa

Nyt ”kovan” ja ”uuvuttavan” tenttirupeaman välipäivinä on hyvä aika palata muistelemaan hieman vanhoja ja hyviä hetkiä Studio 1:n parissa.

Teoriakierros 4:n tehtävänanto oli seuraava:

”Swing

Laadi essee tai käsitekartta graafisten käyttöliittymien toteutuksesta Swing- komponenttikirjaston avulla. Kannattaa keskittyä oleelliseen ja rajata mukaan otettavia asioita, jottei kokonaisuudesta tule tarpeettoman laajaa. Esimerkiksi kaikkia olemassa olevia komponenttiluokkia ei välttämättä kannata esitellä.”

Päällimmäinen muisto kyseisestä kierroksesta oli tehtävänanto PDF:n ensimmäinen avaus, jossa kummitteli sana Swing, joka ei ainakaan silloin herättänyt mitään suurempia tunteita. Olkkarilla olin kyseisen sanan joskus kuullut, mutta en kovin kiitolliseen sävyyn. Tarinoiden mukaan jokin Processing olis paljon parempi.

Kuitenkin torstai-iltana totesin taas ajan olevan kypsä iki-ihanan CMapin avaamiseen. Jostain kumman syystä perjantaiaamun mennessä oli loistavaan käsitekarttaan ilmestynyt n. 3 palluraa ja jatko näytti hyvin synkältä. Taistelu kuitenkin jatkui pakollisten perjantaitoimien jälkeen ja valmistakin kerkesi kerran tulla ainakin melkein, kunnes CMap päätti kaatua ja kaataa koko tietokoneen. Muutaman Studio1:ä ja Cmapia ylistävän sanan jälkeen muutaman tunnin työ palautettiin tunnissa. Lupasin myös itselleni, että en enää ikinä käyttäisi kyseistä ohjelmaa, mutta lupaus kesti vain seuraavaan teoriatehtävään asti. Kun käsitekartta oli valmis, mieliin palasi odotettavissa oleva elämä tämän kaiken jälkeen. Arvosanaksi tuli 3 ja tuotos oli tämä:

Image

Jotta tämänkin tekstin virallinen osuus täyttyisi, pitäisi hieman kertoa, kuinka tämä teoriatehtävä auttoi todella ”paljon” myöhempää koodaamistani.  Tyydyn kuitenkin vain toteamaan, että pääsin kyllä alkeellisesti sisälle siihen, mitä Swing on, mutta en kyllä pätkääkään hyötynyt siitä, kun itse Swingiä aloin hyödyntämään viimeisellä ohjelmointikierroksella. Jälkikäteen ajateltuna tämä teoria tuntui pakotetulta täytekierrokselta.