/** * Tarkistetaan maailmassa hengailevat mahdolliset yksinäiset kuplat, eli sellaiset, jotka eivät * ole mitään kautta kiinni katossa. Jos sellaisia löytyy, asetetaan ne putoaviksi. */ public void tarkistaYksinaiset() { ArrayList<Kupla> pysyvat = new ArrayList<Kupla>(); /* * Käydään läpi kaikki maailman kuplat. Jos kupla on ylärivissä, * lisätään se pysyvien listaan kutsumalla metodia lisaaPysyva, joka * lisää listaan myös kaikki kuplan naapurin naapurit. */ for (int i = 0; i < this.kuplat.size(); i++) { Kupla tutkittava = this.kuplat.get(i); if (tutkittava.annaY() == 50 && tutkittava.onEhja()) { this.lisaaPysyva(tutkittava, pysyvat); } } /* * Nyt kun on tallennettu pysyvien listaan kaikki ne maailman kuplat, * jotka ovat naapureidensa kautta kiinni katossa, asetetaan putoaviksi * kaikki listan ulkopuolelle jääneet. */ for (int i = 0; i < this.kuplat.size(); i++) { if (!pysyvat.contains(this.kuplat.get(i)) && this.kuplat.get(i).onEhja()) { this.kuplat.get(i).asetaPutoavaksi(); } } }
/** * Metodi pudottaa kaikki maailman putoaviksi asetetut kuplat eli käynnistää niiden putoamisen * käyttäen apunaan nykyisen hetken ja edellisen hetken välistä erotusta (joka annetaan * ohjaaja-luokassa). * * @param muutos jonka arvolla kuplaa liikutetaan */ public void pudota(long muutos) { for (int i = 0; i < this.kuplat.size(); i++) { Kupla tutkittava = this.kuplat.get(i); if (tutkittava.onPutoava() && tutkittava.onEhja()) { tutkittava.putoa(muutos); } } }
/** Tutkitaan maailman kuplat ja selvitetään, ovatko ne ehjiä. */ public void tutkiEhjat() { this.ehjat = new ArrayList<Kupla>(); Iterator<Kupla> iteraattori = this.kuplaiteraattori(); while (iteraattori.hasNext()) { Kupla tutkittava = iteraattori.next(); if (tutkittava.onEhja()) { ehjat.add(tutkittava); } } }
/** * Kertoo, onko maailmassa jäljellä enää vain putoavia kuplia. Tätä tarvitaan, kun lisätään kuplia * maailmaan tai arvotaan uusi - ei haluta enempää kuplia, jos maailman viimeiset kuplat ovat * juuri putoamassa. * * @return true, jos maailmassa on jäljellä vain putoavia kuplia, ja false, jos on jäljellä * muitakin. */ public boolean onVainPutoavia() { ArrayList<Kupla> putoavat = new ArrayList<Kupla>(); for (int i = 0; i < this.ehjat.size(); i++) { Kupla putoava = this.ehjat.get(i); if (putoava.onPutoava()) { putoavat.add(putoava); } } if (putoavat.size() == this.ehjat.size()) { return true; } return false; }
/** * Metodi palauttaa listan maailman kuplien väreistä. * * @return lista kuplien väreistä */ public ArrayList<Vari> annaKuplienVarit() { ArrayList<Vari> kuplienVarit = new ArrayList<Vari>(); Iterator<Kupla> iteraattori = this.kuplaiteraattori(); while (iteraattori.hasNext()) { Kupla tutkittava = iteraattori.next(); /* Kukin väri lisätään vain kerran listaan. */ if (tutkittava.onEhja() && !kuplienVarit.contains(tutkittava.annaVari())) { kuplienVarit.add(tutkittava.annaVari()); } } return kuplienVarit; }
/** * Metodi lisää parametrina annettuun listaan kaikki parametrina annetun kuplan naapurit rekursion * avulla. * * @param kupla lisättävä kupla * @param pysyvat lista niistä kuplista, joita ei ole tarkoitus pudottaa */ public void lisaaPysyva(Kupla kupla, ArrayList<Kupla> pysyvat) { /* * Jos lista ei jo sisällä kyseistä kuplaa, lisätään kupla listaan. */ if (!pysyvat.contains(kupla)) { pysyvat.add(kupla); ArrayList<Kupla> naapurit = kupla.annaNaapurit(); /* * Lisätään kaikki kuplan naapurin naapurit listaan rekursiolla. */ for (int i = 0; i < naapurit.size(); i++) { this.lisaaPysyva(naapurit.get(i), pysyvat); } } }
/** * Metodi lisää kuplia maailmaan joka kymmenennen ampumiskerran jälkeen. Aluksi pudotetaan kaikkia * maailman kuplia ja pisteitä yhden rivin verran alaspäin. Sitten luodaan yläriviin uudet kuplat * ja pisteet joka toisella kerralla limittäin ja joka toisella suoraan. Uudet pisteet täytyy * luoda, jotta kuplat asettuisivat oikein, kun niitä ammutaan uuteen yläriviin. */ public void lisaaKuplia() { this.tutkiEhjat(); /* Kuplia lisätään vain, jos maailmassa on ehjiä kuplia.*/ if (!this.ehjat.isEmpty() && !this.onVainPutoavia()) { /* Kuplia lisätään tiettyjen ampumiskertojen välein. */ if (this.ampumiskerrat % 10 == 0) { /* * Käydään läpi maailman pisteet ja pudotetaan niitä yhden * rivin verran alaspäin. */ Iterator<Piste> iteraattori = this.pisteiteraattori(); while (iteraattori.hasNext()) { Piste pudotettava = iteraattori.next(); pudotettava.asetaSijainti(pudotettava.annaX(), pudotettava.annaY() + 45); } /* Pudotetaan myös kuplia yhden rivin verran alaspäin. */ for (int i = 0; i < this.kuplat.size(); i++) { Kupla pudotettava = this.kuplat.get(i); pudotettava.asetaSijainti(pudotettava.annaX(), pudotettava.annaY() + 45); /* * Jos pudotettavat kuplat putoavat maailman alareunan * yli (tai siis ali hehheh), niin peli hävitään. */ if (pudotettava.onEhja() && pudotettava.annaY() >= 450) { this.pelimaailma.lopetaPeli(false); } } /* * Joka toisella kerralla kuplat luodaan limittäin ja joka * toisella "suoraan". Aloitetaan limittäin luomisesta, koska * alempi rivi on tehty "suoraan". * */ if (this.lisaamiskerrat % 2 == 0) { /* Luodaan uudet pisteet (8) yläreunaan. */ for (int a = 0; a < 8; a++) { Piste uusi = new Piste(this.alkupiste_x + 45 + (a * 45), this.alkupiste_y + 22.5); this.pisteet.add(uusi); } /* Luodaan rivin verran (8) kuplia yläreunaan. */ for (int b = 0; b < 8; b++) { Kupla uusi = new Kupla(this.alkupiste_x + 22.5 + (b * 45), this.alkupiste_y, this); this.kuplat.push(uusi); } this.lisaamiskerrat++; /* Nyt luodaan uudet pisteet ja kuplat "suoraan". */ } else { /* Luodaan uudet pisteet (9) yläreunaan. */ for (int a = 0; a < 9; a++) { Piste uusi = new Piste(this.alkupiste_x + 22.5 + (a * 45), this.alkupiste_y + 22.5); this.pisteet.add(uusi); } /* Luodaan rivin verran (9) kuplia yläreunaan. */ for (int b = 0; b < 9; b++) { Kupla uusi = new Kupla(this.alkupiste_x + (b * 45), this.alkupiste_y, this); this.kuplat.push(uusi); } this.lisaamiskerrat++; } } /* Jos maailmassa ei ole enää ehjiä kuplia, peli on voitettu. */ } else { this.peliLoppunut = true; this.pelimaailma.lopetaPeli(true); } }