en passant
This commit is contained in:
parent
92ab88893e
commit
94265ccd2f
|
|
@ -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)) {
|
||||||
|
|
|
||||||
|
|
@ -210,9 +210,9 @@ 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
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (select == true && this.xm != x || this.ym != y){
|
else if (select == true && this.xm != x || this.ym != y){
|
||||||
|
|
@ -382,5 +382,10 @@ public class Board {
|
||||||
return turnColor;
|
return turnColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Move getLastMove() {
|
||||||
|
return lastMove;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////
|
////
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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++) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue