bot alpha-beta + correctif + debut bot divin
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
package fr.iut_fbleau.Avalam;
|
||||
|
||||
import fr.iut_fbleau.Bot.AlphaBetaBot;
|
||||
// A FAIRE PLUS TARD (PVGOD)
|
||||
// import fr.iut_fbleau.Bot.DivineBot;
|
||||
import fr.iut_fbleau.Bot.IdiotBot;
|
||||
import fr.iut_fbleau.GameAPI.AbstractPly;
|
||||
import fr.iut_fbleau.GameAPI.Player;
|
||||
@@ -9,24 +12,25 @@ import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
/**
|
||||
* La classe <code>AvalamWindow</code>
|
||||
*
|
||||
* Fenêtre principale (interface graphique) du jeu Avalam.
|
||||
* Elle contient :
|
||||
* - le plateau (BoardView)
|
||||
* - l’affichage du score (ScoreView)
|
||||
* - l’affichage du joueur courant (TurnView)
|
||||
*
|
||||
* Elle pilote un objet <code>AvalamBoard</code> (moteur du jeu).
|
||||
* Elle peut fonctionner en mode :
|
||||
* - joueur vs joueur
|
||||
* - joueur vs bot idiot (aléatoire)
|
||||
* - joueur vs bot alpha (préparé)
|
||||
*
|
||||
* @version 1.0
|
||||
* Date :
|
||||
* Licence :
|
||||
*/
|
||||
* La classe <code>AvalamWindow</code>
|
||||
*
|
||||
* Fenêtre principale (interface graphique) du jeu Avalam.
|
||||
* Elle contient :
|
||||
* - le plateau (BoardView)
|
||||
* - l’affichage du score (ScoreView)
|
||||
* - l’affichage du joueur courant (TurnView)
|
||||
*
|
||||
* Elle pilote un objet <code>AvalamBoard</code> (moteur du jeu).
|
||||
* Elle peut fonctionner en mode :
|
||||
* - joueur vs joueur
|
||||
* - joueur vs bot idiot (aléatoire)
|
||||
* - joueur vs bot alpha (cut-off)
|
||||
* - joueur vs bot divin (PVGOD)
|
||||
*
|
||||
* @version 1.0
|
||||
* Date :
|
||||
* Licence :
|
||||
*/
|
||||
public class AvalamWindow extends JFrame {
|
||||
|
||||
//Attributs
|
||||
@@ -52,29 +56,62 @@ public class AvalamWindow extends JFrame {
|
||||
/** Bot idiot (utilisé si mode PVBOT). */
|
||||
private final IdiotBot idiotBot;
|
||||
|
||||
/** Bot Alpha-Beta (utilisé si mode PVALPHA). */
|
||||
private final AlphaBetaBot alphaBot;
|
||||
|
||||
// A FAIRE PLUS TARD (PVGOD)
|
||||
// /** Bot Divin (utilisé si mode PVGOD). */
|
||||
// private final DivineBot divineBot;
|
||||
|
||||
/**
|
||||
* A FAIRE PLUS TARD (PVGOD)
|
||||
* On garde l'attribut à null pour ne pas casser la compilation,
|
||||
* mais toute la logique PVGOD est désactivée/commentée.
|
||||
*/
|
||||
private final Object divineBot = null;
|
||||
|
||||
/** Indique si une animation de tour de bot est en cours. */
|
||||
private boolean botAnimating = false;
|
||||
|
||||
//Constructeur
|
||||
|
||||
/**
|
||||
* Construit la fenêtre en mode joueur vs joueur.
|
||||
*/
|
||||
* Construit la fenêtre en mode joueur vs joueur.
|
||||
*/
|
||||
public AvalamWindow() {
|
||||
this(GameMode.PVP);
|
||||
this(GameMode.PVP, 4);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construit la fenêtre en fonction du mode choisi.
|
||||
*
|
||||
* @param mode mode de jeu
|
||||
*/
|
||||
* Construit la fenêtre en fonction du mode choisi.
|
||||
* Pour PVALPHA/PVGOD, la profondeur par défaut est 4.
|
||||
*
|
||||
* @param mode mode de jeu
|
||||
*/
|
||||
public AvalamWindow(GameMode mode) {
|
||||
this(mode, 4);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construit la fenêtre en fonction du mode choisi.
|
||||
* Si le mode est PVALPHA ou PVGOD, la profondeur est utilisée comme cut-off.
|
||||
*
|
||||
* @param mode mode de jeu
|
||||
* @param alphaDepth profondeur de recherche pour Alpha-Beta / Bot Divin
|
||||
*/
|
||||
public AvalamWindow(GameMode mode, int alphaDepth) {
|
||||
super("Avalam");
|
||||
|
||||
this.mode = mode;
|
||||
|
||||
this.idiotBot = (mode == GameMode.PVBOT) ? new IdiotBot(botPlayer) : null;
|
||||
|
||||
int depth = Math.max(1, alphaDepth);
|
||||
this.alphaBot = (mode == GameMode.PVALPHA) ? new AlphaBetaBot(botPlayer, depth) : null;
|
||||
|
||||
// A FAIRE PLUS TARD (PVGOD)
|
||||
// this.divineBot = (mode == GameMode.PVGOD) ? new DivineBot(botPlayer, depth) : null;
|
||||
|
||||
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
setLayout(new BorderLayout());
|
||||
|
||||
@@ -109,16 +146,16 @@ public class AvalamWindow extends JFrame {
|
||||
setLocationRelativeTo(null);
|
||||
setVisible(true);
|
||||
|
||||
// Si un jour le bot doit commencer, on peut déclencher ici.
|
||||
// Si un jour le bot devait commencer (pas le cas ici), on le ferait jouer ici.
|
||||
maybePlayBotTurn();
|
||||
}
|
||||
|
||||
//Méthodes
|
||||
|
||||
/**
|
||||
* Appelée après chaque coup (humain ou bot).
|
||||
* Met à jour score, tour, et affiche la fin de partie.
|
||||
*/
|
||||
* Appelée après chaque coup (humain ou bot).
|
||||
* Met à jour score, tour, et affiche la fin de partie.
|
||||
*/
|
||||
public void onBoardUpdated() {
|
||||
|
||||
scoreView.updateScores(
|
||||
@@ -161,27 +198,51 @@ public class AvalamWindow extends JFrame {
|
||||
}
|
||||
|
||||
/**
|
||||
* Fait jouer le bot en deux étapes visibles :
|
||||
* 1) sélection de la tour (affiche les coups légaux)
|
||||
* 2) attente 1 seconde
|
||||
* 3) déplacement vers la destination
|
||||
*
|
||||
* Le tout sans bloquer l'interface (Timer Swing).
|
||||
*/
|
||||
* Fait jouer le bot (idiot / alpha / divin) en deux étapes visibles :
|
||||
* 1) sélection de la tour (affiche les coups légaux)
|
||||
* 2) attente 1 seconde
|
||||
* 3) déplacement vers la destination
|
||||
*
|
||||
* Le tout sans bloquer l'interface (Timer Swing).
|
||||
*/
|
||||
private void maybePlayBotTurn() {
|
||||
|
||||
if (mode != GameMode.PVBOT) return;
|
||||
// Mode joueur vs joueur : aucun bot
|
||||
if (mode == GameMode.PVP) return;
|
||||
|
||||
// Sécurité
|
||||
if (board.isGameOver()) return;
|
||||
if (board.getCurrentPlayer() != botPlayer) return;
|
||||
if (botAnimating) return;
|
||||
|
||||
// Vérifier qu'on a bien le bot correspondant
|
||||
if (mode == GameMode.PVBOT && idiotBot == null) return;
|
||||
if (mode == GameMode.PVALPHA && alphaBot == null) return;
|
||||
|
||||
// A FAIRE PLUS TARD (PVGOD)
|
||||
// if (mode == GameMode.PVGOD && divineBot == null) return;
|
||||
|
||||
// A FAIRE PLUS TARD (PVGOD)
|
||||
// Pour l'instant, si PVGOD est sélectionné, on ne joue pas de coup bot.
|
||||
if (mode == GameMode.PVGOD) return;
|
||||
|
||||
botAnimating = true;
|
||||
|
||||
// Désactiver les interactions du joueur pendant le tour du bot.
|
||||
boardView.setInteractionEnabled(false);
|
||||
|
||||
// Choix d’un coup sur une copie sûre
|
||||
AbstractPly botMove = idiotBot.giveYourMove(board.safeCopy());
|
||||
AbstractPly botMove;
|
||||
if (mode == GameMode.PVBOT) {
|
||||
botMove = idiotBot.giveYourMove(board.safeCopy());
|
||||
} else if (mode == GameMode.PVALPHA) {
|
||||
botMove = alphaBot.giveYourMove(board.safeCopy());
|
||||
} else {
|
||||
// A FAIRE PLUS TARD (PVGOD)
|
||||
// botMove = divineBot.giveYourMove(board.safeCopy());
|
||||
botMove = null;
|
||||
}
|
||||
|
||||
if (botMove == null) {
|
||||
botAnimating = false;
|
||||
boardView.setInteractionEnabled(true);
|
||||
@@ -226,11 +287,11 @@ public class AvalamWindow extends JFrame {
|
||||
}
|
||||
|
||||
/**
|
||||
* Calcule le score d'une couleur : nombre de tours contrôlées.
|
||||
*
|
||||
* @param c couleur à compter
|
||||
* @return nombre de tours appartenant à la couleur c
|
||||
*/
|
||||
* Calcule le score d'une couleur : nombre de tours contrôlées.
|
||||
*
|
||||
* @param c couleur à compter
|
||||
* @return nombre de tours appartenant à la couleur c
|
||||
*/
|
||||
private int computeScore(Color c) {
|
||||
int score = 0;
|
||||
for (int r = 0; r < AvalamBoard.SIZE; r++) {
|
||||
@@ -245,10 +306,10 @@ public class AvalamWindow extends JFrame {
|
||||
}
|
||||
|
||||
/**
|
||||
* Retourne le message affiché pour le joueur courant.
|
||||
*
|
||||
* @return message du tour
|
||||
*/
|
||||
* Retourne le message affiché pour le joueur courant.
|
||||
*
|
||||
* @return message du tour
|
||||
*/
|
||||
private String turnMessage() {
|
||||
return "Tour du joueur : " +
|
||||
(board.getCurrentPlayer() == Player.PLAYER1 ? "Jaune" : "Rouge");
|
||||
|
||||
Reference in New Issue
Block a user