en passant

This commit is contained in:
Romain MURPHY 2025-05-07 13:43:15 +02:00
parent 92ab88893e
commit 94265ccd2f
4 changed files with 20 additions and 15 deletions

View File

@ -70,16 +70,16 @@ public class AutoPlayer {
{ 20, 20, 0, 0, 0, 0, 20, 20},
{ 20, 30, 10, 0, 0, 10, 30, 20}
};
public Move computeBestMove(ArrayList<ArrayList<Piece>> board, boolean isWhiteTurn) {
public Move computeBestMove(ArrayList<ArrayList<Piece>> board, boolean isWhiteTurn, Move lastMove) {
// System.out.println(MAX_DEPTH);
Move bestMove = null;
int bestScore = isWhiteTurn ? Integer.MIN_VALUE : Integer.MAX_VALUE;
ArrayList<Move> allMoves = getAllLegalMoves(board, isWhiteTurn);
ArrayList<Move> allMoves = getAllLegalMoves(board, isWhiteTurn, lastMove);
for (Move move : allMoves) {
ArrayList<ArrayList<Piece>> simulatedBoard = simulateMove(board, move);
int score = minimax(simulatedBoard, MAX_DEPTH - 1, !isWhiteTurn);
int score = minimax(simulatedBoard, MAX_DEPTH - 1, !isWhiteTurn, lastMove);
if (isWhiteTurn && score > bestScore) {
bestScore = score;
@ -92,19 +92,19 @@ public class AutoPlayer {
return bestMove;
}
private int minimax(ArrayList<ArrayList<Piece>> board, int depth, boolean isWhiteTurn) {
private int minimax(ArrayList<ArrayList<Piece>> board, int depth, boolean isWhiteTurn, Move lastMove) {
if (depth == 0) {
return evaluateBoard(board);
}
ArrayList<Move> allMoves = getAllLegalMoves(board, isWhiteTurn);
ArrayList<Move> allMoves = getAllLegalMoves(board, isWhiteTurn, lastMove);
if (allMoves.isEmpty()) return evaluateBoard(board); // checkmate or stalemate
int bestScore = isWhiteTurn ? Integer.MIN_VALUE : Integer.MAX_VALUE;
for (Move move : allMoves) {
ArrayList<ArrayList<Piece>> simulatedBoard = simulateMove(board, move);
int score = minimax(simulatedBoard, depth - 1, !isWhiteTurn);
int score = minimax(simulatedBoard, depth - 1, !isWhiteTurn, lastMove);
if (isWhiteTurn) {
bestScore = Math.max(bestScore, score);
@ -185,13 +185,13 @@ public class AutoPlayer {
return copy;
}
public ArrayList<Move> getAllLegalMoves(ArrayList<ArrayList<Piece>> board, boolean isWhiteTurn) {
public ArrayList<Move> getAllLegalMoves(ArrayList<ArrayList<Piece>> board, boolean isWhiteTurn, Move lastMove) {
ArrayList<Move> legalMoves = new ArrayList<>();
for (ArrayList<Piece> row : board) {
for (Piece p : row) {
if (p != null && p.isWhite() == isWhiteTurn) {
ArrayList<ArrayList<Boolean>> moves = kingCheck.getLegalMoves(p, board);
ArrayList<ArrayList<Boolean>> moves = kingCheck.getLegalMoves(p, board, lastMove);
for (int y = 0; y < 8; y++) {
for (int x = 0; x < 8; x++) {
if (moves.get(y).get(x)) {

View File

@ -210,9 +210,9 @@ public class Board {
this.xm = x;
this.ym = y;
select = true;
possibleMoves = kingCheck.getLegalMoves(board.get(y).get(x), board);
possibleMoves = kingCheck.getLegalMoves(board.get(y).get(x), board,lastMove);
// possibleMoves = board.get(y).get(x).getPossibleMoves(board);
// possibleMoves = board.get(y).get(x).getPossibleMoves(board, lastMove);//same as kingCheck
// possibleMoves = board.get(y).get(x).getPossibleMoves(board, lastMove);//same as kingCheck
}
else if (select == true && this.xm != x || this.ym != y){
@ -382,5 +382,10 @@ public class Board {
return turnColor;
}
public Move getLastMove() {
return lastMove;
}
}
////

View File

@ -48,11 +48,11 @@ public class Game extends Thread {
private void aiPlayerTurn() {
if(isAITurn()) {
if (aiPlayer.getAllLegalMoves(board.getBoard(), board.isTurnWhite()).size() == 0){
if (aiPlayer.getAllLegalMoves(board.getBoard(), board.isTurnWhite(), board.getLastMove()).size() == 0){
mjf.showGameOverMessage("Game Over");
}
else {
board.playMove(aiPlayer.computeBestMove(board.getBoard(),board.isTurnWhite()));
board.playMove(aiPlayer.computeBestMove(board.getBoard(),board.isTurnWhite(),board.getLastMove()));
}
}
}
@ -65,7 +65,7 @@ public class Game extends Thread {
return;
}
if(!isAITurn()) {
if (aiPlayer.getAllLegalMoves(board.getBoard(), board.isTurnWhite()).size() != 0){
if (aiPlayer.getAllLegalMoves(board.getBoard(), board.isTurnWhite(),board.getLastMove()).size() != 0){
board.userTouch(x, y);
}
else {

View File

@ -3,8 +3,8 @@ package backend;
import java.util.ArrayList;
public class KingCheck {
public ArrayList<ArrayList<Boolean>> getLegalMoves(Piece piece, ArrayList<ArrayList<Piece>> board) {
ArrayList<ArrayList<Boolean>> rawMoves = piece.getPossibleMoves(board);
public ArrayList<ArrayList<Boolean>> getLegalMoves(Piece piece, ArrayList<ArrayList<Piece>> board, Move lastMove) {
ArrayList<ArrayList<Boolean>> rawMoves = piece.getPossibleMoves(board,lastMove);
ArrayList<ArrayList<Boolean>> legalMoves = new ArrayList<>();
for (int y = 0; y < 8; y++) {