import dibo.*; //-------------------------------------------------------------- // Klasse Metamorphose-Spiel (Metamorphose) / Hauptprogramm //-------------------------------------------------------------- public class Metamorphose { // Attribute protected MetamorphoseSpieler spieler_a, spieler_b; protected MetamorphoseBrett brett; protected MetamorphoseRegeln regeln; // Methoden // Konstruktor (Initialisierung eines Spiels) public Metamorphose(MetamorphoseSpieler a, MetamorphoseSpieler b, MetamorphoseBrett brett, MetamorphoseRegeln regeln ) { this.spieler_a = a; this.spieler_b = b; this.brett = brett; this.regeln = regeln; } // Hauptprogramm; // hier startet das Metamorphose-Programm public static void main(String[] args) { MetamorphoseSpieler a = new MetamorphoseSpieler(MetamorphoseSpieler.WEISS); MetamorphoseSpieler b = new MetamorphoseProgramm(MetamorphoseSpieler.SCHWARZ); MetamorphoseBrett brett = new MetamorphoseBrett(); MetamorphoseRegeln regeln = new MetamorphoseRegeln(brett); Metamorphose metamorphose = new Metamorphose(a,b,brett,regeln); metamorphose.spielen(); } // Durchfuehrung eines Spiels public void spielen() { // Spieler A beginnt MetamorphoseSpieler akt_spieler = this.spieler_a; MetamorphoseSpielzug zug = null; // Koenige eingeben: int spalte = this.spieler_a.liefereKoenig(); this.brett.liefereFigur(6, spalte).setzeKoenig(); spalte = this.spieler_b.liefereKoenig(); this.brett.liefereFigur(0, spalte).setzeKoenig(); this.brett.gebeSpielbrettAus(); // abwechselndes Ziehen bis Spielende erreicht ist do { if (akt_spieler == this.spieler_a) System.out.println("Spieler A ist am Zug!"); else System.out.println("Spieler B ist am Zug!"); // legalen Spielzug ermitteln und ausfuehren MetamorphoseSpielzug gegner_zug = zug; zug = akt_spieler.liefereNaechstenSpielzug(gegner_zug); while (!this.regeln.spielzugOK(zug, akt_spieler)) { System.out.println("Ungueltig; neue Eingabe!"); zug = akt_spieler.liefereNaechstenSpielzug(gegner_zug); } this.brett.fuehreSpielzugAus(zug); this.brett.gebeSpielbrettAus(); // der andere Spieler ist nun ab Zug if (akt_spieler == spieler_a) akt_spieler = this.spieler_b; else akt_spieler = this.spieler_a; } while (!this.regeln.spielEnde()); // Spiel ist zuende this.regeln.gebeSiegerBekannt(); } } //----------------------------------------------------- // Klasse Metamorphose-Brett (MetamorphoseBrett) //----------------------------------------------------- class MetamorphoseBrett { // Konstanten public final static int GROESSE = 7; // Attribute protected MetamorphoseFigur[][] brett; // Methoden // Konstruktor (Initialisierung des Metamorphose-Brettes) public MetamorphoseBrett() { // Brett erzeugen this.brett = new MetamorphoseFigur[GROESSE][GROESSE]; // die mittleren Felder sind leer for (int z=1; z<6; z++) for (int s=0; s= MetamorphoseBrett.GROESSE)) return false; if ((von_spalte < 0) || (von_spalte >= MetamorphoseBrett.GROESSE)) return false; if ((nach_zeile < 0) || (nach_zeile >= MetamorphoseBrett.GROESSE)) return false; if ((nach_spalte < 0) || (nach_spalte >= MetamorphoseBrett.GROESSE)) return false; // auf Mauern duerfen keine Figuren gezogen werden if (this.brett.belegtDurchMauer(nach_zeile, nach_spalte)) return false; // es besteht Zugzwang if ((von_zeile == nach_zeile) && (von_spalte == nach_spalte)) return false; MetamorphoseFigur figur = this.brett.liefereFigur(zug.vonWelcherZeile(), zug.vonWelcherSpalte()); if (figur == null) return false; // es duerfen nur eigene Figuren gezogen werden if (figur.istAFigur() != ist_a) return false; // Quadrate duerfen nur horizontal und vertikal bewegt werden // und es duerfen keine Mauern und Figuren uebersprungen werden if (figur.istQuadrat()) { if ((von_zeile != nach_zeile) && (von_spalte != nach_spalte)) return false; if (von_zeile == nach_zeile) { int s_abstand = von_spalte-nach_spalte; for (int i=1; i0)?-i:+i; if ((this.brett.liefereFigur(von_zeile, von_spalte+s) != null) || (this.brett.belegtDurchMauer(von_zeile, von_spalte+s))) return false; } } else { // von_spalte == nach_spalte int z_abstand = von_zeile-nach_zeile; for (int i=1; i0)?-i:+i; if ((this.brett.liefereFigur(von_zeile+z, von_spalte) != null) || (this.brett.belegtDurchMauer(von_zeile+z, von_spalte))) return false; } } } else { // Figur ist Kreis // Kreise duerfen nur diagonal bewegt werden // und es duerfen keine Mauern und Figuren uebersprungen werden int z_abstand = 0; int s_abstand = 0; if (abs(z_abstand=von_zeile-nach_zeile) != abs(s_abstand=von_spalte-nach_spalte)) return false; for (int i=1; i0)?-i:+i; int s = (s_abstand>0)?-i:+i; if ((this.brett.liefereFigur(von_zeile+z, von_spalte+s) != null) || (this.brett.belegtDurchMauer(von_zeile+z, von_spalte+s))) return false; } } this.geschlagene_figur = this.brett.liefereFigur(zug.nachWelcherZeile(), zug.nachWelcherSpalte()); // es duerfen keine eigenen Figuren geschlagen werden if ((this.geschlagene_figur != null) && (this.geschlagene_figur.istAFigur() == ist_a) ) return false; return true; } // Ueberpruefung des Spielendes public boolean spielEnde() { if (!this.zuegeMoeglich(MetamorphoseSpieler.WEISS)) return true; if (!this.zuegeMoeglich(MetamorphoseSpieler.SCHWARZ)) return true; if ((this.geschlagene_figur != null) && this.geschlagene_figur.istKoenig()) return true; int anzahl = 0; for (int z=0; z 0)?(value):(-value); } private boolean zuegeMoeglich(boolean ist_a) { for (int z=0; z= MetamorphoseBrett.GROESSE)) { System.out.println("Ungueltig; neue Eingabe!"); spalte = Terminal.readInt(); } return spalte; } // erfragt und liefert naechsten Spielzug des // Spielers; uebergeben wird der letzte Zug des // Gegners (bzw. null beim ersten Zug) public MetamorphoseSpielzug liefereNaechstenSpielzug (MetamorphoseSpielzug gegner_zug) { return this.erfrageNaechstenSpielzugBeimSpieler(); } // erfragt naechsten Spielzug beim Spieler protected MetamorphoseSpielzug erfrageNaechstenSpielzugBeimSpieler() { System.out.println("von Zeile eingeben (0-6): "); int von_zeile = Terminal.readInt(); System.out.println("von Spalte eingeben (0-6): "); int von_spalte = Terminal.readInt(); System.out.println("nach Zeile eingeben (0-6): "); int nach_zeile = Terminal.readInt(); System.out.println("nach Spalte eingeben (0-6): "); int nach_spalte = Terminal.readInt(); return new MetamorphoseSpielzug(von_zeile, von_spalte, nach_zeile, nach_spalte); } } //----------------------------------------------------- // Klasse Metamorphose-Programm (MetamorphoseProgramm) //----------------------------------------------------- class MetamorphoseProgramm extends MetamorphoseSpieler { // Attribute protected MetamorphoseBrett brett; protected MetamorphoseRegeln regeln; // Methoden // Konstruktor (Initialisierung eines Spielers) public MetamorphoseProgramm(boolean a_oder_b) { super(a_oder_b); this.brett = new MetamorphoseBrett(); this.regeln = new MetamorphoseRegeln(this.brett); } // erfragt die initiale Spaltenposition des Koenigs public int liefereKoenig() { return (java.lang.Math.abs(new java.util.Random().nextInt())) % MetamorphoseBrett.GROESSE; } // erfragt und liefert naechsten Spielzug des // Spielers; uebergeben wird der letzte Zug des // Gegners (bzw. null beim ersten Zug) public MetamorphoseSpielzug liefereNaechstenSpielzug (MetamorphoseSpielzug gegner_zug) { if (gegner_zug != null) this.brett.fuehreSpielzugAus(gegner_zug); MetamorphoseSpielzug eigener_zug = this.ermittleNaechstenSpielzug(); this.brett.fuehreSpielzugAus(eigener_zug); return eigener_zug; } // berechnet naechsten Spielzug // (keine Strategie, nur blindes drauflos spielen) protected MetamorphoseSpielzug ermittleNaechstenSpielzug() { for (int i=0; i