y'a les bons move et les highlight bien plus style qu'avant

This commit is contained in:
Gaspard VANCOMPERNOLLE 2025-04-09 11:42:30 +02:00
parent 6cdb93e84a
commit 865287dc3d
3 changed files with 158 additions and 20 deletions

View File

@ -10,6 +10,10 @@ public class Board {
private int selectedX = -1;
private int selectedY = -1;
private ArrayList<Piece> pieces = new ArrayList<>();
private ArrayList<int[]> highlightedSquares = new ArrayList<>();
public Board(int colNum, int lineNum) {
this.width = colNum;
@ -90,43 +94,67 @@ public class Board {
public void userTouch(int x, int y) {
Piece clickedPiece = getPieceAt(x, y);
// Aucun pion sélectionné
// Aucune sélection active
if (selectedX == -1 && selectedY == -1) {
if (clickedPiece != null && clickedPiece.isWhite() == isTurnWhite()) {
// Sélection de la pièce
selectedX = x;
selectedY = y;
// Calcul des déplacements valides
highlightedSquares = Move.getPossibleMoves(this, clickedPiece);
}
}
// Déjà une sélection
// Une pièce est déjà sélectionnée
else {
// Si on reclique sur la même case, on désélectionne
if (selectedX == x && selectedY == y) {
// Si on clique à nouveau sur la case sélectionnée on annule
if (x == selectedX && y == selectedY) {
selectedX = -1;
selectedY = -1;
} else {
highlightedSquares.clear();
}
// Sinon on tente de bouger la pièce sélectionnée vers (x, y)
else {
Piece selectedPiece = getPieceAt(selectedX, selectedY);
if (selectedPiece != null && selectedPiece.isWhite() == isTurnWhite()) {
// Capture éventuelle
Piece destPiece = getPieceAt(x, y);
if (destPiece != null) {
pieces.remove(destPiece);
// Est-ce une destination valide ?
boolean valid = false;
for (int[] move : highlightedSquares) {
if (move[0] == x && move[1] == y) {
valid = true;
break;
}
}
// Déplacement
pieces.remove(selectedPiece);
pieces.add(new Piece(selectedPiece.getType(), selectedPiece.isWhite(), x, y));
if (valid) {
// Capture éventuelle
Piece destPiece = getPieceAt(x, y);
if (destPiece != null) {
pieces.remove(destPiece);
}
// Fin du tour
turnNumber++;
// Déplacement (création d'une nouvelle pièce)
pieces.remove(selectedPiece);
pieces.add(new Piece(selectedPiece.getType(), selectedPiece.isWhite(), x, y));
// Fin du tour
turnNumber++;
}
// Dans tous les cas, on désélectionne
selectedX = -1;
selectedY = -1;
highlightedSquares.clear();
}
}
}
}
public boolean isSelected(int x, int y) {
return x == selectedX && y == selectedY;
}
@ -148,10 +176,15 @@ public class Board {
/* The following methods require more work ! */
public boolean isHighlighted(int x, int y) {
//TODO
return false;
for (int[] pos : highlightedSquares) {
if (pos[0] == x && pos[1] == y) {
return true;
}
}
return false;
}
public void undoLastMove() {
//TODO
@ -167,7 +200,7 @@ public class Board {
}
private Piece getPieceAt(int x, int y) {
public Piece getPieceAt(int x, int y) {
for (Piece p : pieces) {
if (p.getX() == x && p.getY() == y) {
return p;

View File

@ -1,5 +1,110 @@
package backend;
import java.util.ArrayList;
public class Move {
public static ArrayList<int[]> getPossibleMoves(Board board, Piece piece) {
ArrayList<int[]> moves = new ArrayList<>();
int x = piece.getX();
int y = piece.getY();
switch (piece.getType()) {
case Pawn:
int dir = piece.isWhite() ? -1 : 1;
int ny = y + dir;
if (isInsideBoard(board, x, ny) && board.getPieceAt(x, ny) == null) {
moves.add(new int[]{x, ny});
}
// Capture diagonale
for (int dx : new int[]{-1, 1}) {
int cx = x + dx;
if (isInsideBoard(board, cx, ny)) {
Piece target = board.getPieceAt(cx, ny);
if (target != null && target.isWhite() != piece.isWhite()) {
moves.add(new int[]{cx, ny});
}
}
}
break;
case Rook:
addLinearMoves(board, piece, moves, new int[][]{{1,0},{-1,0},{0,1},{0,-1}});
break;
case Bishop:
addLinearMoves(board, piece, moves, new int[][]{{1,1},{1,-1},{-1,1},{-1,-1}});
break;
case Queen:
addLinearMoves(board, piece, moves, new int[][]{{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}});
break;
case King:
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
if (dx != 0 || dy != 0) {
int nx = x + dx;
int nyk = y + dy;
if (isInsideBoard(board, nx, nyk)) {
Piece p = board.getPieceAt(nx, nyk);
if (p == null || p.isWhite() != piece.isWhite()) {
moves.add(new int[]{nx, nyk});
}
}
}
}
}
break;
case Knight:
int[][] deltas = {{1,2},{2,1},{-1,2},{-2,1},{1,-2},{2,-1},{-1,-2},{-2,-1}};
for (int[] d : deltas) {
int nx = x + d[0];
int nyk = y + d[1];
if (isInsideBoard(board, nx, nyk)) {
Piece p = board.getPieceAt(nx, nyk);
if (p == null || p.isWhite() != piece.isWhite()) {
moves.add(new int[]{nx, nyk});
}
}
}
break;
default:
break;
}
return moves;
}
private static boolean isInsideBoard(Board board, int x, int y) {
return x >= 0 && x < board.getWidth() && y >= 0 && y < board.getHeight();
}
private static void addLinearMoves(Board board, Piece piece, ArrayList<int[]> moves, int[][] directions) {
int x = piece.getX();
int y = piece.getY();
for (int[] dir : directions) {
int dx = dir[0];
int dy = dir[1];
int nx = x + dx;
int ny = y + dy;
while (isInsideBoard(board, nx, ny)) {
Piece p = board.getPieceAt(nx, ny);
if (p == null) {
moves.add(new int[]{nx, ny});
} else {
if (p.isWhite() != piece.isWhite()) {
moves.add(new int[]{nx, ny});
}
break; // stop in case of any piece
}
nx += dx;
ny += dy;
}
}
}
}

View File

@ -103,10 +103,10 @@ public class JPanelChessBoard extends JPanel {
boolean isSelect = myGame.isSelected(x,y);
boolean isHighlight = myGame.isHighlighted(x,y);
if(isSelect) {
g.setColor(Color.blue);
g.setColor(Color.orange);
}
if(isHighlight) {
g.setColor(Color.yellow);
g.setColor(new Color(100, 200, 100));
}
if((x+y)%2==1 || isSelect || isHighlight) {
g.fillRect(