diff --git a/OOP_2B1_Project/src/backend/AutoPlayer.java b/OOP_2B1_Project/src/backend/AutoPlayer.java index fb995bc..f29d72c 100644 --- a/OOP_2B1_Project/src/backend/AutoPlayer.java +++ b/OOP_2B1_Project/src/backend/AutoPlayer.java @@ -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> board, boolean isWhiteTurn) { + public Move computeBestMove(ArrayList> board, boolean isWhiteTurn, Move lastMove) { // System.out.println(MAX_DEPTH); Move bestMove = null; int bestScore = isWhiteTurn ? Integer.MIN_VALUE : Integer.MAX_VALUE; - ArrayList allMoves = getAllLegalMoves(board, isWhiteTurn); + ArrayList allMoves = getAllLegalMoves(board, isWhiteTurn, lastMove); for (Move move : allMoves) { ArrayList> 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> board, int depth, boolean isWhiteTurn) { + private int minimax(ArrayList> board, int depth, boolean isWhiteTurn, Move lastMove) { if (depth == 0) { return evaluateBoard(board); } - ArrayList allMoves = getAllLegalMoves(board, isWhiteTurn); + ArrayList 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> 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 getAllLegalMoves(ArrayList> board, boolean isWhiteTurn) { + public ArrayList getAllLegalMoves(ArrayList> board, boolean isWhiteTurn, Move lastMove) { ArrayList legalMoves = new ArrayList<>(); for (ArrayList row : board) { for (Piece p : row) { if (p != null && p.isWhite() == isWhiteTurn) { - ArrayList> moves = kingCheck.getLegalMoves(p, board); + ArrayList> 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)) { diff --git a/OOP_2B1_Project/src/backend/Board.java b/OOP_2B1_Project/src/backend/Board.java index 42abe91..7c50e9c 100644 --- a/OOP_2B1_Project/src/backend/Board.java +++ b/OOP_2B1_Project/src/backend/Board.java @@ -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; + } + } + //// diff --git a/OOP_2B1_Project/src/backend/Game.java b/OOP_2B1_Project/src/backend/Game.java index 1818e95..f239dfd 100644 --- a/OOP_2B1_Project/src/backend/Game.java +++ b/OOP_2B1_Project/src/backend/Game.java @@ -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 { diff --git a/OOP_2B1_Project/src/backend/KingCheck.java b/OOP_2B1_Project/src/backend/KingCheck.java index d9f65c1..b9501bf 100644 --- a/OOP_2B1_Project/src/backend/KingCheck.java +++ b/OOP_2B1_Project/src/backend/KingCheck.java @@ -3,8 +3,8 @@ package backend; import java.util.ArrayList; public class KingCheck { - public ArrayList> getLegalMoves(Piece piece, ArrayList> board) { - ArrayList> rawMoves = piece.getPossibleMoves(board); + public ArrayList> getLegalMoves(Piece piece, ArrayList> board, Move lastMove) { + ArrayList> rawMoves = piece.getPossibleMoves(board,lastMove); ArrayList> legalMoves = new ArrayList<>(); for (int y = 0; y < 8; y++) {