AI autoplayer
This commit is contained in:
parent
ccd3dacaed
commit
eb25480118
|
|
@ -1,17 +1,72 @@
|
||||||
package backend;
|
package backend;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class AutoPlayer {
|
public class AutoPlayer {
|
||||||
|
|
||||||
|
public Move computeBestMove(Board board) {
|
||||||
|
ArrayList<Move> allMoves = new ArrayList<>();
|
||||||
|
boolean isWhite = board.isTurnWhite();
|
||||||
|
|
||||||
/**
|
for (Piece piece : board.getPieces()) {
|
||||||
* returns the best Move to try on provided board for active player
|
if (piece.isWhite() != isWhite) continue;
|
||||||
* @param board
|
ArrayList<int[]> legalMoves = getLegalMoves(board, piece);
|
||||||
* @return
|
for (int[] move : legalMoves) {
|
||||||
*/
|
Piece target = getPieceAt(board, move[0], move[1]);
|
||||||
public Move computeBestMove(Board board) {
|
Move candidate = new Move(
|
||||||
|
piece.getType(), piece.isWhite(),
|
||||||
|
piece.getX(), piece.getY(),
|
||||||
|
move[0], move[1],
|
||||||
|
target
|
||||||
|
);
|
||||||
|
allMoves.add(candidate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
// 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;
|
return p != null && p.isWhite() != isWhite;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ArrayList<int[]> computeLegalMoves(Piece piece) {
|
public ArrayList<int[]> computeLegalMoves(Piece piece) {
|
||||||
ArrayList<int[]> moves = new ArrayList<>();
|
ArrayList<int[]> moves = new ArrayList<>();
|
||||||
int x = piece.getX();
|
int x = piece.getX();
|
||||||
int y = piece.getY();
|
int y = piece.getY();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue