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

View File

@ -210,7 +210,7 @@ public class Board {
this.xm = x; this.xm = x;
this.ym = y; this.ym = y;
select = true; 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);
// possibleMoves = board.get(y).get(x).getPossibleMoves(board, lastMove);//same as kingCheck // possibleMoves = board.get(y).get(x).getPossibleMoves(board, lastMove);//same as kingCheck
@ -382,5 +382,10 @@ public class Board {
return turnColor; return turnColor;
} }
public Move getLastMove() {
return lastMove;
} }
}
//// ////

View File

@ -48,11 +48,11 @@ public class Game extends Thread {
private void aiPlayerTurn() { private void aiPlayerTurn() {
if(isAITurn()) { 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"); mjf.showGameOverMessage("Game Over");
} }
else { 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; return;
} }
if(!isAITurn()) { 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); board.userTouch(x, y);
} }
else { else {

View File

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