Files
BUT3ProjetJeuGroupe/fr/iut_fbleau/Avalam/ui/InteractionController.java

166 lines
4.8 KiB
Java
Raw Permalink Normal View History

package fr.iut_fbleau.Avalam.ui;
2025-11-25 16:02:23 -05:00
import fr.iut_fbleau.Avalam.AvalamBoard;
import fr.iut_fbleau.Avalam.AvalamPly;
import fr.iut_fbleau.Avalam.Tower;
2025-11-25 16:02:23 -05:00
import fr.iut_fbleau.GameAPI.AbstractPly;
import fr.iut_fbleau.GameAPI.Player;
import java.awt.Point;
import java.util.ArrayList;
2025-11-25 16:02:23 -05:00
import java.util.Iterator;
import java.util.List;
/**
2025-11-25 16:02:23 -05:00
* Le contrôleur gère toute l'interaction entre l'utilisateur et le moteur Avalam.
*
2025-11-25 16:02:23 -05:00
* Son rôle :
* - gérer la sélection dune tour
* - générer les coups légaux via lAPI (iterator)
* - valider un déplacement (isLegal)
* - appliquer un coup (doPly)
* - mettre à jour le plateau (via refresh demandé au BoardView)
*
2025-11-25 16:02:23 -05:00
* IMPORTANT : ce contrôleur naffiche rien. Il envoie les infos à BoardView.
*/
public class InteractionController {
2025-11-25 16:02:23 -05:00
private AvalamBoard board;
2025-11-25 16:02:23 -05:00
/** Position sélectionnée (-1 si aucune) */
private int selectedRow = -1;
private int selectedCol = -1;
2025-11-25 16:02:23 -05:00
/** Liste des coups légaux (en Point) autour de la sélection */
private List<Point> legalMoves = new ArrayList<>();
2025-11-25 16:02:23 -05:00
/** Référence à la vue pour la rafraîchir après déplacements */
private BoardView view;
public InteractionController(AvalamBoard board, BoardView view) {
this.board = board;
this.view = view;
}
2025-11-25 16:02:23 -05:00
/** Retourne les cases jouables (pour HighlightLayer). */
public List<Point> getLegalMoves() {
return legalMoves;
}
/**
2025-11-25 16:02:23 -05:00
* Appelé lorsquun pion est cliqué dans BoardView.
* Gère :
* - sélection dune tour
* - désélection
* - tentative de déplacement (si clique sur un highlight)
*/
public void onPieceClicked(int r, int c) {
2025-11-25 16:02:23 -05:00
// Si on clique la même case ⇒ désélection
if (r == selectedRow && c == selectedCol) {
2025-11-25 16:02:23 -05:00
clearSelection();
view.refresh();
return;
}
2025-11-25 16:02:23 -05:00
// Si aucune sélection : on sélectionne un pion appartenant au joueur courant
Tower t = board.getTowerAt(r, c);
if (t != null && t.getColor().toPlayer() == board.getCurrentPlayer()) {
selectTower(r, c);
view.refresh();
return;
}
2025-11-25 16:02:23 -05:00
// Sinon : tentons de jouer un coup (déplacement)
if (selectedRow != -1 && selectedCol != -1) {
tryMove(r, c);
}
}
/* -------------------------------------------------------------------------
* SÉLECTION DUNE TOUR
* ---------------------------------------------------------------------- */
private void selectTower(int r, int c) {
selectedRow = r;
selectedCol = c;
computeLegalMoves();
}
2025-11-25 16:02:23 -05:00
private void clearSelection() {
selectedRow = -1;
selectedCol = -1;
legalMoves.clear();
}
/**
2025-11-25 16:02:23 -05:00
* Identifie les destinations possibles depuis la tour sélectionnée.
* Utilise lAPI officielle : board.iterator()
*/
private void computeLegalMoves() {
legalMoves.clear();
2025-11-25 16:02:23 -05:00
Iterator<AbstractPly> it = board.iterator();
while (it.hasNext()) {
AbstractPly p = it.next();
if (!(p instanceof AvalamPly)) continue;
AvalamPly ap = (AvalamPly) p;
// On ne garde que les coups dont la source correspond à la sélection
if (ap.getXFrom() == selectedRow && ap.getYFrom() == selectedCol) {
legalMoves.add(new Point(ap.getXTo(), ap.getYTo()));
}
}
}
/* -------------------------------------------------------------------------
* TENTATIVE DE DÉPLACEMENT
* ---------------------------------------------------------------------- */
2025-11-25 16:02:23 -05:00
/**
* Tente dexécuter un déplacement vers (r,c) si cest un coup légal.
*/
private void tryMove(int r, int c) {
// Vérifier si (r,c) est une destination légale
boolean isLegalDest = false;
for (Point p : legalMoves) {
if (p.x == r && p.y == c) {
isLegalDest = true;
break;
}
}
if (!isLegalDest) {
clearSelection(); // clic ailleurs = désélection
view.refresh();
return;
}
2025-11-25 16:02:23 -05:00
// Construire le coup
Player cur = board.getCurrentPlayer();
AvalamPly ply = new AvalamPly(cur, selectedRow, selectedCol, r, c);
2025-11-25 16:02:23 -05:00
// Vérifier via lAPI
if (board.isLegal(ply)) {
2025-11-25 16:02:23 -05:00
// Appliquer via lAPI
board.doPly(ply);
2025-11-25 16:02:23 -05:00
// Réinitialiser la sélection
clearSelection();
2025-11-25 16:02:23 -05:00
// Recalcul du score + joueur courant + fin de partie (handled in window)
view.onBoardUpdated();
2025-11-25 16:02:23 -05:00
} else {
// Coup impossible (rare, mais pour sécurité)
clearSelection();
}
2025-11-25 16:02:23 -05:00
view.refresh();
}
}