From 5ee54d97cd4e6cb0535c1e982f40fa4ce87e0d9b Mon Sep 17 00:00:00 2001 From: "charles.duteil" Date: Sun, 18 May 2025 16:20:46 +0200 Subject: [PATCH] highlight when kingInCheck function working --- OOP_2B1_Project/src/backend/Board.java | 51 ++-- OOP_2B1_Project/src/backend/Game.java | 7 + .../src/windowInterface/JPanelChessBoard.java | 276 ++++++++++-------- 3 files changed, 177 insertions(+), 157 deletions(-) diff --git a/OOP_2B1_Project/src/backend/Board.java b/OOP_2B1_Project/src/backend/Board.java index a4fe703..d788ae2 100644 --- a/OOP_2B1_Project/src/backend/Board.java +++ b/OOP_2B1_Project/src/backend/Board.java @@ -30,6 +30,8 @@ public class Board implements Cloneable { private ArrayList highlightedPositions = new ArrayList<>(); private LinkedList> boardHistory = new LinkedList<>(); + + private int[] kingCheckPos = null; /* ====== AUDIO STATE ====== */ private Clip moveClip; @@ -429,7 +431,7 @@ public class Board implements Cloneable { moveClip = AudioSystem.getClip(); moveClip.open(ais); - soundEnabled = true; // <<< MISSING LINE + soundEnabled = true; System.out.println("Move-sound loaded OK"); } catch (Exception e) { e.printStackTrace(); @@ -500,12 +502,11 @@ public class Board implements Cloneable { } public void highlightKingInCheck() { - + // Clear previous + kingCheckPos = null; boolean isWhiteTurn = isTurnWhite(); - - // Determine the color of the current player - boolean isTurnWhite = isTurnWhite(); - + + // Find the King Piece king = null; for (Piece piece : pieces) { if (piece.getType() == PieceType.King && piece.isWhite() == isWhiteTurn) { @@ -513,37 +514,29 @@ public class Board implements Cloneable { break; } } - for (Piece piece : pieces) { - if (piece.getType() == PieceType.King && piece.isWhite() == isWhiteTurn) { - king = piece; - break; - } - } + if (king == null) { + throw new IllegalStateException("No king found for the current player!"); + } - if (king == null) { - throw new IllegalStateException("No king found for the current player!"); - } - - + // Opponent’s moves ArrayList opponentMoves = getAllLegalMoves(!isWhiteTurn); - + // See if any can capture the King for (Move move : opponentMoves) { if (move.getToCol() == king.getX() && move.getToRow() == king.getY()) { - highlightedPositions.add(new int[]{king.getX(), king.getY()}); - return; + kingCheckPos = new int[]{king.getX(), king.getY()}; + break; } } - - // Check if any opponent move targets the king's position - for (Move move : opponentMoves) { - if (move.getToCol() == king.getX() && move.getToRow() == king.getY()) { - // If the king is in check, highlight its position - highlightedPositions.add(new int[]{king.getX(), king.getY()}); - return; // No need to continue after finding a check - } - } } + + public boolean isKingCheckSquare(int squareX, int squareY) { + return (kingCheckPos != null + && kingCheckPos[0] == squareX + && kingCheckPos[1] == squareY); + } + + } diff --git a/OOP_2B1_Project/src/backend/Game.java b/OOP_2B1_Project/src/backend/Game.java index 94b02c3..d4da752 100644 --- a/OOP_2B1_Project/src/backend/Game.java +++ b/OOP_2B1_Project/src/backend/Game.java @@ -108,5 +108,12 @@ public class Game extends Thread { public void toggleAI(boolean isWhite) { this.activationAIFlags[isWhite?1:0] = !this.activationAIFlags[isWhite?1:0]; } + public void highlightKingInCheck() { + board.highlightKingInCheck(); + } + + public boolean isKingCheckSquare(int squareX, int squareY) { + return board.isKingCheckSquare(squareX, squareY); + } } diff --git a/OOP_2B1_Project/src/windowInterface/JPanelChessBoard.java b/OOP_2B1_Project/src/windowInterface/JPanelChessBoard.java index 78a68de..f33dad5 100644 --- a/OOP_2B1_Project/src/windowInterface/JPanelChessBoard.java +++ b/OOP_2B1_Project/src/windowInterface/JPanelChessBoard.java @@ -22,175 +22,195 @@ public class JPanelChessBoard extends JPanel { private Game myGame; private MyInterface interfaceGlobal; private BufferedImage spriteSheet; - private int PIECE_WIDTH = 16; //in spritesheet - private int PIECE_HEIGHT = 16; //in spritesheet + private int PIECE_WIDTH = 16; // in spritesheet + private int PIECE_HEIGHT = 16; // in spritesheet private int MARGIN = 6; - + private boolean pieceSelectorMode; private boolean selectedPieceIsWhite; private PieceType selectedPieceType; private boolean pieceAdderMode; public JPanelChessBoard(MyInterface itf) { - super(); - myGame = null; - interfaceGlobal = itf; - selectedPieceIsWhite = true; - selectedPieceType = PieceType.Pawn; - pieceSelectorMode = false; - try { - spriteSheet = ImageIO.read(new File("pieces.png")); - } catch (IOException e) { - e.printStackTrace(); - } - pieceSelectorMode = false; - pieceAdderMode = false; - addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent me) { - // System.out.println(me); - if(pieceSelectorMode) { - int x = Math.round(me.getX()/cellWidth()); - selectedPieceType = PieceType.values()[5-x]; - selectedPieceIsWhite = (me.getY() > cellHeight()); - pieceSelectorMode = false; - } else { - if(myGame == null) { - interfaceGlobal.instantiateSimu(); - } - int x = (me.getX()*myGame.getWidth())/getWidth(); - int y = (me.getY()*myGame.getHeight())/getHeight(); - if(pieceAdderMode) { - //TODO - myGame.setPiece(selectedPieceIsWhite,selectedPieceType, x, y); - pieceAdderMode = false; - } else { - myGame.clickCoords(x,y); - } - } - repaint(); - } - }); + super(); + myGame = null; + interfaceGlobal = itf; + selectedPieceIsWhite = true; + selectedPieceType = PieceType.Pawn; + pieceSelectorMode = false; + try { + spriteSheet = ImageIO.read(new File("pieces.png")); + } catch (IOException e) { + e.printStackTrace(); + } + pieceSelectorMode = false; + pieceAdderMode = false; + + addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent me) { + // System.out.println(me); + if(pieceSelectorMode) { + int x = Math.round(me.getX()/cellWidth()); + selectedPieceType = PieceType.values()[5-x]; + selectedPieceIsWhite = (me.getY() > cellHeight()); + pieceSelectorMode = false; + } else { + if(myGame == null) { + interfaceGlobal.instantiateSimu(); + } + int x = (me.getX() * myGame.getWidth()) / getWidth(); + int y = (me.getY() * myGame.getHeight()) / getHeight(); + + if(pieceAdderMode) { + // TODO + myGame.setPiece(selectedPieceIsWhite, selectedPieceType, x, y); + pieceAdderMode = false; + } else { + myGame.clickCoords(x, y); + + myGame.highlightKingInCheck(); + } + repaint(); + } + } + }); } - public void setGame(Game simu) { - myGame = simu; + myGame = simu; } @Override protected void paintComponent(Graphics g) { - super.paintComponent(g); - this.setBackground(Color.black); - if(pieceSelectorMode) { - g.drawImage( - spriteSheet, - 0, - 0, - Math.round(5*cellWidth()), - Math.round(2*cellHeight()), - null - ); - return; - } - if (myGame != null) { - // Draw Interface from state of simulator - float cellWidth = cellWidth(); - float cellHeight = cellHeight(); + super.paintComponent(g); + this.setBackground(Color.black); + if(pieceSelectorMode) { + g.drawImage( + spriteSheet, + 0, + 0, + Math.round(5*cellWidth()), + Math.round(2*cellHeight()), + null + ); + return; + } - g.setColor(Color.white); - for(int x=0; x