package me.desht.chesscraft.chess.ai;
import fr.free.jchecs.ai.Engine;
import fr.free.jchecs.ai.EngineFactory;
import fr.free.jchecs.core.*;
import me.desht.chesscraft.ChessCraft;
import me.desht.chesscraft.Messages;
import me.desht.chesscraft.chess.ChessGame;
import me.desht.chesscraft.chess.TimeControl;
import me.desht.chesscraft.exceptions.ChessException;
import org.bukkit.configuration.ConfigurationSection;
/**
* @author des
*
*/
public class JChecsAI extends ChessAI {
private final Game jChecsGame;
public JChecsAI(String name, ChessGame chessCraftGame, Boolean isWhite, ConfigurationSection params) {
super(name, chessCraftGame, isWhite, params);
jChecsGame = initGame();
setReady();
}
/**
* Initialise the jChecs Game object.
*
* @return
*/
private Game initGame() {
Game jChecsGame = new Game();
Player human = jChecsGame.getPlayer(!isWhite());
human.setName(Messages.getString("ChessAI.human"));
human.setEngine(null);
Player ai = jChecsGame.getPlayer(isWhite());
ai.setName(Messages.getString("ChessAI.computer"));
String engine = "jChecs." + params.getString("engine", "MiniMax");
Engine moteur = EngineFactory.newInstance(engine);
if (moteur == null) {
throw new ChessException("unknown jChecs engine: " + engine);
}
int searchDepth = params.getInt("depth", 1);
moteur.setSearchDepthLimit(searchDepth);
moteur.setOpeningsEnabled(ChessCraft.getInstance().getConfig().getBoolean("ai.use_opening_book", false));
ai.setEngine(moteur);
return jChecsGame;
}
/* (non-Javadoc)
* @see me.desht.chesscraft.chess.ai.AbstractAI#shutdown()
*/
@Override
public void shutdown() {
jChecsGame.getPlayer(isWhite()).setEngine(null);
}
/* (non-Javadoc)
* @see me.desht.chesscraft.chess.ai.AbstractAI#run()
*/
@Override
public void run() {
try {
final MoveGenerator plateau = jChecsGame.getBoard();
final Engine engine = jChecsGame.getPlayer(isWhite()).getEngine();
final fr.free.jchecs.core.Move m = engine.getMoveFor(plateau);
aiHasMoved(m.getFrom().getIndex(), m.getTo().getIndex());
} catch (Exception e) {
aiHasFailed(e);
}
}
/* (non-Javadoc)
* @see me.desht.chesscraft.chess.ai.AbstractAI#undoLastMove()
*/
@Override
public void undoLastMove() {
jChecsGame.goPrevious();
if (!toMove())
jChecsGame.goPrevious();
}
/* (non-Javadoc)
* @see me.desht.chesscraft.chess.ai.AbstractAI#movePiece(int, int)
*/
@Override
protected void movePiece(int fromSqi, int toSqi, boolean otherPlayer) {
// conveniently, Chesspresso & jChecs use the same row/column/sqi conventions
Square from = Square.valueOf(fromSqi);
Square to = Square.valueOf(toSqi);
Move m = new Move(jChecsGame.getBoard().getPieceAt(from), from, to);
jChecsGame.moveFromCurrent(m);
}
@Override
public void notifyTimeControl(TimeControl timeControl) {
// do nothing here... JChecs doesn't support time controls
}
}