From bdf56dc2503fc6f9c96b9466e85c15686f852494 Mon Sep 17 00:00:00 2001 From: "g.vancompernolle" Date: Wed, 7 May 2025 15:15:10 +0200 Subject: [PATCH] auto player ia --- src/backend/AutoPlayer.java | 48 +++++++++++++++++++++++++++---------- src/backend/Board.java | 34 +++++++++++++++++++++++++- src/backend/Game.java | 7 +++--- 3 files changed, 72 insertions(+), 17 deletions(-) diff --git a/src/backend/AutoPlayer.java b/src/backend/AutoPlayer.java index a48c0c2..e47e848 100644 --- a/src/backend/AutoPlayer.java +++ b/src/backend/AutoPlayer.java @@ -1,17 +1,39 @@ package backend; +import java.util.ArrayList; +import java.util.Random; + public class AutoPlayer { - - - /** - * returns the best Move to try on provided board for active player - * @param board - * @return - */ - public Move computeBestMove(Board board) { - - return null; - } - - + private Random rand = new Random(); + + public Move computeBestMove(Board board) { + ArrayList possibleMoves = new ArrayList<>(); + boolean whiteTurn = board.isTurnWhite(); + + for (Piece p : board.getPieces()) { + if (p.isWhite() == whiteTurn) { + ArrayList moves = Move.getPossibleMoves(board, p); + for (int[] pos : moves) { + int toX = pos[0]; + int toY = pos[1]; + Piece captured = board.getPieceAt(toX, toY); + Move move = new Move(p, p.getX(), p.getY(), toX, toY, captured); + possibleMoves.add(move); + } + } + } + + // Si aucune possibilité => null + if (possibleMoves.isEmpty()) return null; + + // Cherche un coup qui capture une pièce + for (Move m : possibleMoves) { + if (m.getCapturedPiece() != null) { + return m; + } + } + + // Sinon, retourne un coup aléatoire + return possibleMoves.get(rand.nextInt(possibleMoves.size())); + } } diff --git a/src/backend/Board.java b/src/backend/Board.java index b9f3e07..d357a0b 100644 --- a/src/backend/Board.java +++ b/src/backend/Board.java @@ -255,9 +255,41 @@ public class Board { } public void playMove(Move move) { - //TODO + if (move == null) return; + Piece pieceToMove = getPieceAt(move.getFromX(), move.getFromY()); + if (pieceToMove == null) return; + + // Supprimer la pièce d'origine + pieces.remove(pieceToMove); + + // Supprimer la pièce capturée (si elle existe) + Piece captured = getPieceAt(move.getToX(), move.getToY()); + if (captured != null) { + pieces.remove(captured); + } + + // Ajouter la nouvelle position + Piece newPiece = new Piece( + pieceToMove.getType(), + pieceToMove.isWhite(), + move.getToX(), + move.getToY() + ); + pieces.add(newPiece); + + // Enregistrer dans l'historique pour undo + moveHistory.add(move); + + // Fin de tour + turnNumber++; + + // Désélection et surlignage off + selectedX = -1; + selectedY = -1; + highlightedSquares.clear(); } + public Piece getPieceAt(int x, int y) { for (Piece p : pieces) { diff --git a/src/backend/Game.java b/src/backend/Game.java index a2b79c9..89ce393 100644 --- a/src/backend/Game.java +++ b/src/backend/Game.java @@ -48,9 +48,10 @@ public class Game extends Thread { } private void aiPlayerTurn() { - if(isAITurn()) { - board.playMove(aiPlayer.computeBestMove(new Board(board))); - } + if(isAITurn()) { + Move m = aiPlayer.computeBestMove(board); + board.playMove(m); + } } public void clickCoords(int x, int y) {