AI autoplayer
This commit is contained in:
parent
ccd3dacaed
commit
eb25480118
|
|
@ -1,17 +1,72 @@
|
|||
package backend;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class AutoPlayer {
|
||||
|
||||
|
||||
/**
|
||||
* returns the best Move to try on provided board for active player
|
||||
* @param board
|
||||
* @return
|
||||
*/
|
||||
public Move computeBestMove(Board board) {
|
||||
ArrayList<Move> allMoves = new ArrayList<>();
|
||||
boolean isWhite = board.isTurnWhite();
|
||||
|
||||
for (Piece piece : board.getPieces()) {
|
||||
if (piece.isWhite() != isWhite) continue;
|
||||
ArrayList<int[]> legalMoves = getLegalMoves(board, piece);
|
||||
for (int[] move : legalMoves) {
|
||||
Piece target = getPieceAt(board, move[0], move[1]);
|
||||
Move candidate = new Move(
|
||||
piece.getType(), piece.isWhite(),
|
||||
piece.getX(), piece.getY(),
|
||||
move[0], move[1],
|
||||
target
|
||||
);
|
||||
allMoves.add(candidate);
|
||||
}
|
||||
}
|
||||
|
||||
// Evaluate moves
|
||||
Move bestMove = null;
|
||||
int bestScore = Integer.MIN_VALUE;
|
||||
|
||||
for (Move move : allMoves) {
|
||||
int score = evaluateMove(move);
|
||||
if (score > bestScore) {
|
||||
bestScore = score;
|
||||
bestMove = move;
|
||||
}
|
||||
}
|
||||
|
||||
return bestMove;
|
||||
}
|
||||
|
||||
private int evaluateMove(Move move) {
|
||||
if (move.getCapturedPiece() != null) {
|
||||
return pieceValue(move.getCapturedPiece().getType());
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
private int pieceValue(PieceType type) {
|
||||
switch (type) {
|
||||
case Pawn: return 1;
|
||||
case Knight: return 3;
|
||||
case Bishop: return 3;
|
||||
case Rook: return 5;
|
||||
case Queen: return 9;
|
||||
case King: return 100; // just in case
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
private ArrayList<int[]> getLegalMoves(Board board, Piece piece) {
|
||||
// Reuse board's internal method
|
||||
// But we must simulate access: simulate selection, compute, and reset
|
||||
return board.computeLegalMoves(piece);
|
||||
}
|
||||
|
||||
private Piece getPieceAt(Board board, int x, int y) {
|
||||
for (Piece p : board.getPieces()) {
|
||||
if (p.getX() == x && p.getY() == y) return p;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -410,7 +410,7 @@ private boolean isEnemy(int x, int y, boolean isWhite) {
|
|||
return p != null && p.isWhite() != isWhite;
|
||||
}
|
||||
|
||||
private ArrayList<int[]> computeLegalMoves(Piece piece) {
|
||||
public ArrayList<int[]> computeLegalMoves(Piece piece) {
|
||||
ArrayList<int[]> moves = new ArrayList<>();
|
||||
int x = piece.getX();
|
||||
int y = piece.getY();
|
||||
|
|
|
|||
Loading…
Reference in New Issue