Gapper onkin minulle pelinä uusi tuttavuus, mutta vaikuttaa mielenkiintoiselta ja varmasti haastavalta projektilta. :)
Ensimmäisenä minulle tuli mieleen, että pakkausrakenne voisi olla tarkempi. Esim. Liikkuja, Gapper ja Seeker voisivat olla pakkauksessa ohmi23.supergapper.logiikka.domain.liikkuja ja luokat Kentta sekä Tronviiva pakkauksessa ohmi23.supergapper.logiikka.domain.kentta. En tiedä onko ortodoksista, mutta auttaa minua hahmottamaan paremmin eri osien suhteet. :)
Itse lähtisin ehkä rakentamaan projektia siten, että tekisin ensin konsolissa toimivan tekstipohjaisen version, joka ottaisi yhden näppäinkomennon kerrallaan (esim. siirry yksi askel oikealle, jonka jälkeen Seeker siirtyy yhden askeleen) ja piirtäisi tilanteen yksinkertaisena kenttänä konsoliin. Näin pääsisi testaamaan sovelluslogiikan toimivuuden törmäyksissä, pisteiden laskussa jne. ennen kuin lähtisi toteuttamaan käyttöliittymää.
Käyttöliittymän ja sovelluslogiikan erottamiseksi kannattaa harkita Observer-rajapinnan käyttöä, jolloin sovelluslogiikan ei tarvitse olla riippuvainen käyttöliittymästä. Siitä olikin juttua ohjelmistotekniikan menetelmät kurssilla ja ainakin itse olin aivan pähkinöinä ja yritän toteuttaa Observer-rajapinnan omaan laivanupotus-projektiini.
Jos enumiin Suunta liittää konstruktorin, jossa jokaiselle suunnalle antaa kokonaislukumuuttujat, jotka määrittävät kuinka paljon liikuttaminen kyseiseen suuntaan muuttaa x ja y arvoa, esim.
public enum Suunta {
YLOS(0, -1),
OIKEA(1, 0),
ALAS(0, 1),
VASEN(-1, 0),
TYHJA(0, 0);
private int dx;
private int dy;
private Suunta(int dx, int dy) {
this.dx = dx;
this.dy = dy;
}
}
Näille kun tekee vielä getterit niin enumeja pystyy käyttämään liikuttamiseen ilman että Liikkujan liiku-metodiin tarvitsee kirjoittaa if - else if - else if - else viidakkoa.
Itse taivuin tekemään lopulta Sijainti-luokan erikseen sen sijaan, että tallentaisin esim. laivojen tai kentän osien paloihin oliomuuttujiksi x:ää ja y:tä, en tiedä voisiko palvella sinuakin. Javassa taitaa olla jokin omakin luokka valmiiksi sille, mutta kivahan se on aina itse säätää. Näin saa myös tehtyä luokan olioille oman vertailun toteuttamalla Comparable-rajapinnan.
public class Sijainti implements Comparable<Sijainti> {
private int x;
private int y;
public Sijainti(int x, int y) {
this.x = x;
this.y = y;
}
// getterit Sijainnille, x:lle ja y:lle
@Override
public int compareTo(Sijainti sijainti) {
// koodi jolla vertailla ja palautetaan joko -1, 0 tai 1
}
}
Mutta tsemppiä koodin vääntämiseen! Välillä hieman turhauttavaa mutta aina palkitsevaa ongelmanratkaisua. :)
Projekti ladattu: 20.9.2014 klo 12:17
Gapper onkin minulle pelinä uusi tuttavuus, mutta vaikuttaa mielenkiintoiselta ja varmasti haastavalta projektilta. :)
Ensimmäisenä minulle tuli mieleen, että pakkausrakenne voisi olla tarkempi. Esim. Liikkuja, Gapper ja Seeker voisivat olla pakkauksessa ohmi23.supergapper.logiikka.domain.liikkuja ja luokat Kentta sekä Tronviiva pakkauksessa ohmi23.supergapper.logiikka.domain.kentta. En tiedä onko ortodoksista, mutta auttaa minua hahmottamaan paremmin eri osien suhteet. :)
Itse lähtisin ehkä rakentamaan projektia siten, että tekisin ensin konsolissa toimivan tekstipohjaisen version, joka ottaisi yhden näppäinkomennon kerrallaan (esim. siirry yksi askel oikealle, jonka jälkeen Seeker siirtyy yhden askeleen) ja piirtäisi tilanteen yksinkertaisena kenttänä konsoliin. Näin pääsisi testaamaan sovelluslogiikan toimivuuden törmäyksissä, pisteiden laskussa jne. ennen kuin lähtisi toteuttamaan käyttöliittymää.
Käyttöliittymän ja sovelluslogiikan erottamiseksi kannattaa harkita Observer-rajapinnan käyttöä, jolloin sovelluslogiikan ei tarvitse olla riippuvainen käyttöliittymästä. Siitä olikin juttua ohjelmistotekniikan menetelmät kurssilla ja ainakin itse olin aivan pähkinöinä ja yritän toteuttaa Observer-rajapinnan omaan laivanupotus-projektiini.
Jos enumiin Suunta liittää konstruktorin, jossa jokaiselle suunnalle antaa kokonaislukumuuttujat, jotka määrittävät kuinka paljon liikuttaminen kyseiseen suuntaan muuttaa x ja y arvoa, esim.
Näille kun tekee vielä getterit niin enumeja pystyy käyttämään liikuttamiseen ilman että Liikkujan liiku-metodiin tarvitsee kirjoittaa if - else if - else if - else viidakkoa.
Itse taivuin tekemään lopulta Sijainti-luokan erikseen sen sijaan, että tallentaisin esim. laivojen tai kentän osien paloihin oliomuuttujiksi x:ää ja y:tä, en tiedä voisiko palvella sinuakin. Javassa taitaa olla jokin omakin luokka valmiiksi sille, mutta kivahan se on aina itse säätää. Näin saa myös tehtyä luokan olioille oman vertailun toteuttamalla Comparable-rajapinnan.
Mutta tsemppiä koodin vääntämiseen! Välillä hieman turhauttavaa mutta aina palkitsevaa ongelmanratkaisua. :)