Java Game Toolkit Jeroen Donkers
Doelstelling Class Game –Chess –Kalah –FourRow –Loa Class Player –Minimax –AlphaBeta –MTD(f) –OM Search –PrOM Search
Doelstelling Het ontwerpen en testen van zoekalgoritmen Stricte scheiding van spelafhankelijke en spelonafhankelijke aspecten van zoekalgoritmen Snelheid is geen doelstelling
Game (1) Interface Game –Zet-generator –Zet-executie (levert een positie op) doMove / undoMove –Evaluator –Opening positie –(History-Heuristic tabel) Class AbstractGame
Game (2) Per spel definieer: –Zet-representatie (1 short per zet) –Zet-generator (Move-enumerator) –Position (bord-representatie) Inner class Startpositie –Evaluator Inner class Meerdere evaluatoren mogelijk –Legale zetten
Game (3) Interface Position –isEnded: terminale positie? –getHashvalue: levert een double op –clonePosition: deep copy Interface Evaluator –Short Evaluate(Node n, int depth) Class Node: knoop in zoekboom
Game (4) Zetgenerator produceert een instantie van de interface MoveEnumerator –Short getMove() – eerste zet –Short nextMove() – volgende zet –Player.NOMOVE == geen zet meer Gebruik bijvoorbeeld: –Class MoveSet (gebaseerd op Vector)
Class Node Representeert een knoop in de zoekboom –getType(): MIN, MAX, NAT, UNKNOWN –getPosition(): spelpositie in die knoop –isTerminal(): terminale knoop? –flipType(): MAX->MIN, MIN->MAX –nextTurn(): is het type van de knoop verdanderd?
Player De abstracte class Player heeft veel voorzieningen: –Log-voorziening –Timer –Teller voor het aantal evaluaties –Pointer naar spel: getGame() Per speler verschilt de routine: –SearchResult NextMove(Position pos);
Transpositietabel Interface TTable – int putEntry(long hashvalue, short move, short score, byte flag, byte ply) Class SimpleTT - spelonafhankelijk –Geef het aantal bits voor de grootte van de key en de tabel, de rest van de hashcode wordt voor collision-detectie gebruikt. –Geheugengebruik: 6 short (12 bytes) per entry –Vervangingsschema: “replace”
Koppelen Om een spel te spelen heb je nodig: –FourRow k = new FourRow(); –AlphaBetaPlayer p = new AlphaBetaPlayer(k,depth); Dan de opening: –Position m = k.getStartPosition(); Vervolgens het spelen zelf: –SearchResult r = p.nextMove(m); –m = k.setMove(m,r.move);