package model; public class SpelModel { protected int totaleScoreVoorLevel, totaleTijdVoorLevel, keuzeSnelheid, aantalGetroffenCellen, aantalZetten; protected Speler speler; protected Level level; public void setSpeler(String naam) throws IllegalArgumentException { if (naam != null && naam.length() != 0) { this.speler = new Speler(naam, true); } else { throw new IllegalArgumentException("Ongeldige naam opgegeven bij het aanmaken van de speler."); } } public void setLevel(int level) { this.level = new Level(level); this.totaleScoreVoorLevel = 0; this.totaleTijdVoorLevel = 0; this.keuzeSnelheid = 0; this.aantalGetroffenCellen = 0; this.aantalZetten = 0; } public void doeZet(Kleur gekozenKleur, int keuzeSnelheid) { verwerkVeldMetKleur(gekozenKleur); this.keuzeSnelheid = keuzeSnelheid; this.totaleTijdVoorLevel += keuzeSnelheid; berekenScore(); } //Doe een zet protected void verwerkVeldMetKleur(Kleur gekozenKleur) { this.aantalGetroffenCellen = 0; this.aantalZetten++; boolean matchGevonden; do { matchGevonden = false; for (int i = 0; i < this.level.getSpeelveldGrootte(); i++) { for (int j = 0; j < this.level.getSpeelveldGrootte(); j++) { if (this.level.getSpeelveldCoordinaat(i, j).getKleur().equals(Kleur.X)) { //geinfecteerde cel gevonden if (j != (this.level.getSpeelveldGrootte() - 1) && this.level.getSpeelveldCoordinaat(i, j + 1).getKleur().equals(gekozenKleur)) { //Controleer de cel rechts naast de de besmette cel de gekozen kleur heeft matchGevonden = true; this.level.setSpeelveldCoordinaat(i, j + 1, Kleur.X); aantalGetroffenCellen++; } if (j != 0 && this.level.getSpeelveldCoordinaat(i, j - 1).getKleur().equals(gekozenKleur)) { //Controleer links matchGevonden = true; this.level.setSpeelveldCoordinaat(i, j - 1, Kleur.X); aantalGetroffenCellen++; } if (i != (this.level.getSpeelveldGrootte() - 1) && this.level.getSpeelveldCoordinaat(i + 1, j).getKleur().equals(gekozenKleur)) { //Controleer onder matchGevonden = true; this.level.setSpeelveldCoordinaat(i + 1, j, Kleur.X); aantalGetroffenCellen++; } if (i != 0 && this.level.getSpeelveldCoordinaat(i - 1, j).getKleur().equals(gekozenKleur)) { //Controleer boven matchGevonden = true; this.level.setSpeelveldCoordinaat(i - 1, j, Kleur.X); aantalGetroffenCellen++; } } } } } while (matchGevonden); } private void berekenScore() { /* Hoelang de speler erover doet om een kleur te kiezen en hoeveel getroffen cellen hij doet in 1 zet bepaald de score Per getroffen cel krijg je 1 punt. Dat punt vermindert met 0.1 per seconde hij er langer over heeft gedaan dan 3 seconden Per 5 getroffen cellen in 1 zet krijgt hij een bonuspunt */ double scoreMultiplier = 1; for (int i = 0; i < this.keuzeSnelheid - 3; i++) { scoreMultiplier -= 0.1; if (scoreMultiplier < 0) { scoreMultiplier = 0; } } for (int i = 0; i < this.aantalGetroffenCellen; i++) { this.totaleScoreVoorLevel += 1 * scoreMultiplier; } this.totaleScoreVoorLevel += this.aantalGetroffenCellen / 5; } //Ga het speelveld af en als er ergens nog een kleur in zit dat geen gat is en niet besmet is dan is het spel nog niet gedaan public boolean isLevelComplete() { boolean levelComplete = true; for (int i = 0; i < this.level.getSpeelveldGrootte(); i++) { for (int j = 0; j < this.level.getSpeelveldGrootte(); j++) { if (this.level.getSpeelveldCoordinaat(i, j).getKleur().equals(Kleur.X) || this.level.getSpeelveldCoordinaat(i, j).getKleur().equals(Kleur.N)) { } else { levelComplete = false; } } } if (levelComplete) { this.speler.setScoreVoorLevel(this.level.getLevel(), this.totaleScoreVoorLevel); } return levelComplete; } public boolean isLevelMislukt() { return (!isLevelComplete() && (this.aantalZetten > this.level.getMaximumAantalZetten()) || !isLevelComplete() && (this.totaleTijdVoorLevel > this.level.getMaximumTijd())); } public int getHighscoreVoorLevel() { return this.speler.getHighscoreForLevel(this.level.getLevel()); } public String getHighscoresSpeler() { return this.speler.getHighScores(); } public int getHuidigeScore() { return this.totaleScoreVoorLevel; } public int getTotaleTijdVoorLevel() { return this.totaleTijdVoorLevel; } public int getAantalZetten() { return this.aantalZetten; } public String getSpeelVeldAlsString() { return this.level.toString(); } public Speelveld getSpeelveld() { return this.level.getSpeelveld(); } public Level getLevel() { return this.level; } public Kleur[] getMogelijkeKleuren() { return this.level.getMogelijkeKleuren(); } } /* Created by Mich Van Mooter Date: 2/03/13 */