en passant c'est good
This commit is contained in:
parent
2b3ebc3ef1
commit
d818b7d313
|
|
@ -15,7 +15,6 @@ public class Board {
|
||||||
private boolean isCheck = false;
|
private boolean isCheck = false;
|
||||||
private boolean isWhiteInCheck = false;
|
private boolean isWhiteInCheck = false;
|
||||||
|
|
||||||
|
|
||||||
public Board(int colNum, int lineNum) {
|
public Board(int colNum, int lineNum) {
|
||||||
this.width = colNum;
|
this.width = colNum;
|
||||||
this.height = lineNum;
|
this.height = lineNum;
|
||||||
|
|
@ -103,66 +102,80 @@ public class Board {
|
||||||
public void userTouch(int x, int y) {
|
public void userTouch(int x, int y) {
|
||||||
Piece clickedPiece = getPieceAt(x, y);
|
Piece clickedPiece = getPieceAt(x, y);
|
||||||
|
|
||||||
// Aucune sélection active
|
// Step 1: No selection active → select a piece
|
||||||
if (selectedX == -1 && selectedY == -1) {
|
if (selectedX == -1 && selectedY == -1) {
|
||||||
if (clickedPiece != null && clickedPiece.isWhite() == isTurnWhite()) {
|
if (clickedPiece != null && clickedPiece.isWhite() == isTurnWhite()) {
|
||||||
// Sélection de la pièce
|
|
||||||
selectedX = x;
|
selectedX = x;
|
||||||
selectedY = y;
|
selectedY = y;
|
||||||
|
|
||||||
// Calcul des déplacements valides
|
|
||||||
highlightedSquares = Move.getPossibleMoves(this, clickedPiece);
|
highlightedSquares = Move.getPossibleMoves(this, clickedPiece);
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Une pièce est déjà sélectionnée
|
// Step 2: Clicking again on selected square → cancel selection
|
||||||
else {
|
if (x == selectedX && y == selectedY) {
|
||||||
// Si on clique à nouveau sur la case sélectionnée => on annule
|
selectedX = -1;
|
||||||
if (x == selectedX && y == selectedY) {
|
selectedY = -1;
|
||||||
selectedX = -1;
|
highlightedSquares.clear();
|
||||||
selectedY = -1;
|
return;
|
||||||
highlightedSquares.clear();
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Sinon on tente de bouger la pièce sélectionnée vers (x, y)
|
// Step 3: Try to move selected piece to (x, y)
|
||||||
else {
|
Piece selectedPiece = getPieceAt(selectedX, selectedY);
|
||||||
Piece selectedPiece = getPieceAt(selectedX, selectedY);
|
if (selectedPiece != null && selectedPiece.isWhite() == isTurnWhite()) {
|
||||||
|
|
||||||
if (selectedPiece != null && selectedPiece.isWhite() == isTurnWhite()) {
|
// Check if destination is valid
|
||||||
// Est-ce une destination valide ?
|
boolean valid = false;
|
||||||
boolean valid = false;
|
for (int[] move : highlightedSquares) {
|
||||||
for (int[] move : highlightedSquares) {
|
if (move[0] == x && move[1] == y) {
|
||||||
if (move[0] == x && move[1] == y) {
|
valid = true;
|
||||||
valid = true;
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (valid) {
|
|
||||||
Piece destPiece = getPieceAt(x, y);
|
|
||||||
|
|
||||||
// Enregistrer le coup dans l'historique
|
|
||||||
Move move = new Move(selectedPiece, selectedX, selectedY, x, y, destPiece);
|
|
||||||
moveHistory.add(move);
|
|
||||||
|
|
||||||
// Appliquer le déplacement
|
|
||||||
pieces.remove(selectedPiece);
|
|
||||||
if (destPiece != null) pieces.remove(destPiece);
|
|
||||||
pieces.add(new Piece(selectedPiece.getType(), selectedPiece.isWhite(), x, y));
|
|
||||||
|
|
||||||
turnNumber++;
|
|
||||||
|
|
||||||
//Mise à jour du statut d’échec après le coup
|
|
||||||
isWhiteInCheck = isInCheck(isTurnWhite());
|
|
||||||
isCheck = isWhiteInCheck;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dans tous les cas, on désélectionne
|
|
||||||
selectedX = -1;
|
|
||||||
selectedY = -1;
|
|
||||||
highlightedSquares.clear();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (valid) {
|
||||||
|
Piece destPiece = getPieceAt(x, y);
|
||||||
|
Move move = new Move(selectedPiece, selectedX, selectedY, x, y, destPiece);
|
||||||
|
|
||||||
|
// 🔍 En Passant Detection
|
||||||
|
if (selectedPiece.getType() == PieceType.Pawn && destPiece == null) {
|
||||||
|
if (selectedX != x && selectedY != y) {
|
||||||
|
Move last = getLastMove();
|
||||||
|
if (last != null && last.getMovedPiece().getType() == PieceType.Pawn
|
||||||
|
&& Math.abs(last.getFromY() - last.getToY()) == 2
|
||||||
|
&& last.getToX() == x && last.getToY() == selectedY) {
|
||||||
|
move.setEnPassant(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Record move
|
||||||
|
moveHistory.add(move);
|
||||||
|
|
||||||
|
// Apply move
|
||||||
|
pieces.remove(selectedPiece);
|
||||||
|
if (move.isEnPassant()) {
|
||||||
|
int dir = selectedPiece.isWhite() ? 1 : -1;
|
||||||
|
Piece capturedPawn = getPieceAt(x, y + dir);
|
||||||
|
if (capturedPawn != null) {
|
||||||
|
pieces.remove(capturedPawn);
|
||||||
|
}
|
||||||
|
} else if (destPiece != null) {
|
||||||
|
pieces.remove(destPiece);
|
||||||
|
}
|
||||||
|
pieces.add(new Piece(selectedPiece.getType(), selectedPiece.isWhite(), x, y));
|
||||||
|
|
||||||
|
turnNumber++;
|
||||||
|
|
||||||
|
// Update check status
|
||||||
|
isWhiteInCheck = isInCheck(isTurnWhite());
|
||||||
|
isCheck = isWhiteInCheck;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deselect in all cases
|
||||||
|
selectedX = -1;
|
||||||
|
selectedY = -1;
|
||||||
|
highlightedSquares.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -282,13 +295,21 @@ public class Board {
|
||||||
public void playMove(Move move) {
|
public void playMove(Move move) {
|
||||||
if (move == null) return;
|
if (move == null) return;
|
||||||
|
|
||||||
|
if (move.isEnPassant()) {
|
||||||
|
int direction = move.getMovedPiece().isWhite() ? 1 : -1;
|
||||||
|
Piece capturedPawn = getPieceAt(move.getToX(), move.getToY() + direction);
|
||||||
|
if (capturedPawn != null) {
|
||||||
|
pieces.remove(capturedPawn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Piece pieceToMove = getPieceAt(move.getFromX(), move.getFromY());
|
Piece pieceToMove = getPieceAt(move.getFromX(), move.getFromY());
|
||||||
if (pieceToMove == null) return;
|
if (pieceToMove == null) return;
|
||||||
|
|
||||||
// Supprimer la pièce d'origine
|
// Supprimer la pi<EFBFBD>ce d'origine
|
||||||
pieces.remove(pieceToMove);
|
pieces.remove(pieceToMove);
|
||||||
|
|
||||||
// Supprimer la pièce capturée (si elle existe)
|
// Supprimer la pi<EFBFBD>ce captur<EFBFBD>e (si elle existe)
|
||||||
Piece captured = getPieceAt(move.getToX(), move.getToY());
|
Piece captured = getPieceAt(move.getToX(), move.getToY());
|
||||||
if (captured != null) {
|
if (captured != null) {
|
||||||
pieces.remove(captured);
|
pieces.remove(captured);
|
||||||
|
|
@ -309,14 +330,15 @@ public class Board {
|
||||||
// Fin de tour
|
// Fin de tour
|
||||||
turnNumber++;
|
turnNumber++;
|
||||||
|
|
||||||
// Désélection et surlignage off
|
// D<EFBFBD>s<EFBFBD>lection et surlignage off
|
||||||
selectedX = -1;
|
selectedX = -1;
|
||||||
selectedY = -1;
|
selectedY = -1;
|
||||||
highlightedSquares.clear();
|
highlightedSquares.clear();
|
||||||
|
|
||||||
//Mise à jour du statut d’échec après le coup
|
//Mise <EFBFBD> jour du statut d<EFBFBD><EFBFBD>chec apr<EFBFBD>s le coup
|
||||||
isWhiteInCheck = isInCheck(isTurnWhite());
|
isWhiteInCheck = isInCheck(isTurnWhite());
|
||||||
isCheck = isWhiteInCheck;
|
isCheck = isWhiteInCheck;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -375,11 +397,11 @@ public class Board {
|
||||||
if (p.isWhite() == whiteToPlay) {
|
if (p.isWhite() == whiteToPlay) {
|
||||||
ArrayList<int[]> legalMoves = Move.getPossibleMoves(this, p);
|
ArrayList<int[]> legalMoves = Move.getPossibleMoves(this, p);
|
||||||
if (!legalMoves.isEmpty()) {
|
if (!legalMoves.isEmpty()) {
|
||||||
return false; // Au moins un coup légal = pas mat
|
return false; // Au moins un coup l<EFBFBD>gal = pas mat
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true; // Roi en échec et aucun coup possible
|
return true; // Roi en <EFBFBD>chec et aucun coup possible
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ public class Move {
|
||||||
private int fromX, fromY;
|
private int fromX, fromY;
|
||||||
private int toX, toY;
|
private int toX, toY;
|
||||||
private Piece capturedPiece;
|
private Piece capturedPiece;
|
||||||
|
private boolean enPassant;
|
||||||
|
|
||||||
public Move(Piece movedPiece, int fromX, int fromY, int toX, int toY, Piece capturedPiece) {
|
public Move(Piece movedPiece, int fromX, int fromY, int toX, int toY, Piece capturedPiece) {
|
||||||
this.movedPiece = movedPiece;
|
this.movedPiece = movedPiece;
|
||||||
|
|
@ -15,6 +16,14 @@ public class Move {
|
||||||
this.toX = toX;
|
this.toX = toX;
|
||||||
this.toY = toY;
|
this.toY = toY;
|
||||||
this.capturedPiece = capturedPiece;
|
this.capturedPiece = capturedPiece;
|
||||||
|
this.enPassant = false; // default
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEnPassant() {
|
||||||
|
return enPassant;
|
||||||
|
}
|
||||||
|
public void setEnPassant(boolean enPassant) {
|
||||||
|
this.enPassant = enPassant;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Piece getMovedPiece() { return movedPiece; }
|
public Piece getMovedPiece() { return movedPiece; }
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue