package dev.kske.chess.game.ai; import java.util.List; import java.util.concurrent.Callable; import dev.kske.chess.board.Board; import dev.kske.chess.board.Move; import dev.kske.chess.board.Piece.Color; /** * Project: Chess
* File: MoveProcessor.java
* Created: 08.07.2019
* Author: Kai S. K. Engelbart */ public class MoveProcessor implements Callable { private final Board board; private final List rootMoves; private final Color color; private final int maxDepth; private final int alphaBetaThreshold; private Move bestMove; public MoveProcessor(Board board, List rootMoves, Color color, int maxDepth, int alphaBetaThreshold) { this.board = board; this.rootMoves = rootMoves; this.color = color; this.maxDepth = maxDepth; this.alphaBetaThreshold = alphaBetaThreshold; } @Override public ProcessingResult call() throws Exception { int score = miniMax(board, rootMoves, color, 0); return new ProcessingResult(bestMove, score); } private int miniMax(Board board, List moves, Color color, int depth) { int bestValue = Integer.MIN_VALUE; for (Move move : moves) { board.move(move); int teamValue = board.evaluate(color); int enemyValue = board.evaluate(color.opposite()); int valueChange = teamValue - enemyValue; if (depth < maxDepth && valueChange >= alphaBetaThreshold) valueChange -= miniMax(board, board.getMoves(color.opposite()), color.opposite(), depth + 1); if (valueChange > bestValue) { bestValue = valueChange; if (depth == 0) bestMove = move; } board.revert(); } return bestValue; } }