AI autoplayer

This commit is contained in:
g.levassor--gentil 2025-05-06 16:30:32 +02:00
parent ccd3dacaed
commit eb25480118
2 changed files with 69 additions and 14 deletions

View File

@ -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) {
return null;
}
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;
}
}

View File

@ -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();