y'a les bons move et les highlight bien plus style qu'avant
This commit is contained in:
parent
6cdb93e84a
commit
865287dc3d
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Reference in New Issue