/** * Methode, die vom Spielstand aufgerufen wird, wenn ein Zug durchgeführt wurde. Es wird * überprüft, ob im Spiel das Attribut „zuEnde“ gesetzt ist; in dem Fall wird spielEnde() zum * Ermitteln des Gewinners durchgeführt. Falls nicht, wird die GUI über den Spielerwechsel * informiert, um den nächsten Spieler zum Zug aufzufordern. Sonst wird das Spielende eingeleitet. * Zusätzlich wird ein boolean-Wert übergeben, der angibt, ob der Spieler an der Reihe die KI ist, * damit die GUI ggf. Buttons sperren kann. Falls der Spieler keine KI ist, ist die Methode hier * beendet. In dem Fall, dass der aktuelle Spieler KI ist und zuletzt kein Redo durchgeführt wurde * (Redo-Flag auf false), wird die Zug-Methode der KI ausgeführt, die einen Spielzug zurückgibt. * Dieser Spielzug wird anschließend mit der „fuehreSpielzugAus“-Methode vom Spiel angewandt. * * @param spielstand Wird durch das Observerpattern beim update der Methode als geupdatetes Objekt * übergeben * @param aktSpieler gibt den aktuellen Spieler an */ public synchronized void update(Observable observable, Object aktSpieler) { if (observable instanceof Spielstand) { // Spielstand update Spieler spieler = (Spieler) aktSpieler; if (spieler == null) { // weil notify nicht vernünftig implementiert wurde ... spieler = this.lnkSpielstand.gibAktuellenSpieler(); } // GUI this.lnkGUI.spiel_redoButtonAktivieren(this.lnkSpielstand.istRedoMoeglich()); this.lnkGUI.spiel_undoButtonAktivieren(this.lnkSpielstand.istUndoMoeglich()); this.lnkGUI.spiel_setzePunkteSpieler1( this.lnkSpielstand.gibPunkte(this.lnkSpielstand.gibSpieler1())); this.lnkGUI.spiel_setzePunkteSpieler2( this.lnkSpielstand.gibPunkte(this.lnkSpielstand.gibSpieler2())); this.lnkGUI.spiel_spielerWechsel(spieler); // KI if (spieler.gibTyp() != SpielerTyp.mensch && !this.kiDarfNichtSetzen && !lnkSpiel.istSpielZuEnde()) { this.lnkKIHaupt.erzeugeSpielzug(); } if (lnkSpiel.istSpielZuEnde()) { this.spielEnde(); } } else if (observable instanceof KI) { // KI update try { this.lnkSpiel.fuehreSpielzugAus(this.lnkKIHaupt.gibSpielzug()); } catch (UngueltigerZugException e) { System.out.println( "Wir haben mist gemacht, die KI kann nicht vernünftig spielen!\n" + e.gibRegelBruch()); } } }
/** * Verarbeitet den Klick auf den Button "speichern" aus der GUI, indem die GUI diese Methode * aufruft. Der Klick wird durch Delegation an die Spielstandklasse aufgelöst. */ @SuppressWarnings("static-access") public void speichern() { if (lnkSpiel.istSpielZuEnde() == true) { if (this.gibSpielausgang(lnkSpielstand.gibSpieler1()) == Spielausgang.sieg) { lnkSpielstand.setzeSpielAusgang(Zustand.schwarz); } else if (this.gibSpielausgang(lnkSpielstand.gibSpieler1()) == Spielausgang.sieg) { lnkSpielstand.setzeSpielAusgang(Zustand.weiss); } else { lnkSpielstand.setzeSpielAusgang(Zustand.frei); } } lnkSpielstand.setzeKommentar(lnkGUI.speichern_gibKommentar()); lnkSpielstand.setzeTitel( lnkSpielstand.gibSpieler1().gibName() + " vs " + lnkSpielstand.gibSpieler2().gibName()); java.util.Date date = new java.util.Date(); java.text.SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); lnkSpielstand.setzeDatum(formatter.format(date)); formatter.applyPattern("yyyy-MM-dd_hh-mm-ss"); try { lnkSpielstand.speichern(this.SPEICHER_ORDNER + formatter.format(date) + ".xml"); this.lnkGUI.speichern_erfolgreich(); } catch (SpeichernException e) { this.lnkGUI.zeigeFehlerAn("Konnte nicht speichern!"); } }