import java.util.*; import dibo.distanz.DistanzSpieler; import dibo.distanz.DistanzSpielzug; //----------------------------------------------------- // Klasse DistanzDibo0 //----------------------------------------------------- final public class DistanzProgramm extends DistanzSpieler { // Attribute private DistanzBrett brett; private Random random = new Random(4711); // Methoden // Initialisierungsmethode public void init(boolean weissOderSchwarz) { super.init(weissOderSchwarz); this.brett = new DistanzBrett(); } // erfragt und liefert naechsten Spielzug des // Spielers; uebergeben wird der letzte Zug des // Gegners public DistanzSpielzug liefereNaechstenSpielzug (DistanzSpielzug gegnerZug) { if (gegnerZug != null) { // nur wenn nicht der Anfangszug this.brett.fuehreSpielzugAus(gegnerZug); } DistanzSpielzug zug = this.ermittleSpielzug(this.brett); this.brett.fuehreSpielzugAus(zug); return zug; } // ermittelt neuen Spielzug private DistanzSpielzug ermittleSpielzug(DistanzBrett brett) { Vector zuege = findeLegaleZuege(brett); if ((zuege == null) || (zuege.size() == 0)) { // eigentlich nicht moeglich! System.err.println("ERROR: kein legaler Zug mehr moeglich!"); return null; } // liefere einen Zug (random) return (DistanzSpielzug)zuege.elementAt(abs(this.random.nextInt()) % zuege.size()); } private Vector findeLegaleZuege(DistanzBrett b) { Vector zuege = new Vector(10); for (int z=0; z= 0 ? zahl : -zahl; } } //----------------------------------------------------- // Klasse DistanzBrett //----------------------------------------------------- final class DistanzBrett { /* gewaehlte Datenstruktur: 0 1 2 3 4 5 6 7 +-+-+-+-+-+-+-+-+ 0 | |h|k| |h|h| | | +-+-+-+-+-+-+-+-+ 1 | | | | | | | | | +-+-+-+-+-+-+-+-+ 2 | | | | | | | | | +-+-+-+-+-+-+-+-+ 3 | | | | | | | | | +-+-+-+-+-+-+-+-+ 4 | | | | | | | | | +-+-+-+-+-+-+-+-+ 5 | | | | | | | | | +-+-+-+-+-+-+-+-+ 6 | | | | | | | | | +-+-+-+-+-+-+-+-+ 7 | | |H|H| |K|H| | +-+-+-+-+-+-+-+-+ repraesentiert als 8 x 8 - Matrix; Schwarze Spielfiguren: h = Helfer k = Koenig g = Gefangener Weisse Spielfiguren: H = Helfer K = Koenig G = Gefangener */ // Konstanten final static int GROESSE = 8; final static int HELFER = 3; final static int UNENDLICH = 1000000; // Attribute DistanzFeld[][] brett; // Methoden // Konstruktor (Initialisierung des Distanz-Brettes) DistanzBrett() { this.brett = new DistanzFeld[GROESSE][GROESSE]; for (int z=0; z= DistanzBrett.GROESSE || zug.vonWelcherSpalte() >= DistanzBrett.GROESSE || zug.inWelcheZeile() < 0 || zug.inWelcheSpalte() < 0 || zug.inWelcheZeile() >= DistanzBrett.GROESSE || zug.inWelcheSpalte() >= DistanzBrett.GROESSE) { return false; } // Figur darf nicht stehenbleiben ! if (zug.vonWelcherZeile() == zug.inWelcheZeile() && zug.vonWelcherSpalte() == zug.inWelcheSpalte() ) { return false; } // steht auf dem angegebenen Feld eine korrekte Figur ? DistanzFeld vonFeld = brett.liefereFeld(zug.vonWelcherZeile(), zug.vonWelcherSpalte()); if (vonFeld.istLeer() || (istWeiss != vonFeld.liefereFigur().istWeiss()) ) { return false; } // Gefangene koennen nicht verschoben werden if (vonFeld.liefereFigur().istGefangen()) { return false; } // stimmt die Distanz ? int zeilenDistanz = abs(zug.vonWelcherZeile() - zug.inWelcheZeile()); int spaltenDistanz = abs(zug.vonWelcherSpalte() - zug.inWelcheSpalte()); DistanzFigur[] figuren = brett.liefereFiguren(istWeiss); boolean distanzOk = false; distanzUeberpruefung: for (int erste=0; erste= 0 ? zahl : -zahl; } }