Amélioration du graphique de fin de partie + Modification d'un commentaire dans Options

This commit is contained in:
2024-12-12 16:21:39 +01:00
parent 900b8a176e
commit c132455434
2 changed files with 87 additions and 102 deletions

View File

@@ -93,7 +93,7 @@ public class Options {
public static boolean AUTO_FOCUS = false; public static boolean AUTO_FOCUS = false;
/** /**
* Nombre maximum de tuiles dans le jeu * Nombre maximum de tuiles dans le jeu (tuile initiale comprise)
*/ */
public static final int MAX_TILE_NUMBER = 51; public static final int MAX_TILE_NUMBER = 51;

View File

@@ -9,152 +9,140 @@ import javax.swing.*;
* Un composant graphique Swing pour afficher un histogramme représentant les scores moyens des groupes. * Un composant graphique Swing pour afficher un histogramme représentant les scores moyens des groupes.
* Chaque barre représente un groupe et est colorée différemment en fonction de s'il est mis en surbrillance. * Chaque barre représente un groupe et est colorée différemment en fonction de s'il est mis en surbrillance.
* *
* Les barres sont ombrées et incluent des labels pour indiquer les scores moyens, ainsi que les noms des groupes. * Les barres incluent des labels pour indiquer les scores moyens, ainsi que les noms des groupes.
* *
* @version 1.0 * @version 1.2
* @author Moncef STITI * @author Moncef STITI
*/ */
public class BarChartPanel extends JPanel { public class BarChartPanel extends JPanel {
/** Liste des scores moyens des groupes. */ /**
* Liste des scores moyens des groupes à afficher.
*/
private final List<Integer> groupAverages; private final List<Integer> groupAverages;
/** Indice du groupe mis en surbrillance. */ /**
* Indice du groupe à mettre en surbrillance.
*/
private final int highlightedGroup; private final int highlightedGroup;
/** Couleur de la barre pour le groupe du joueur. */ /**
private static final Color PLAYER_GROUP_COLOR = new Color(204, 0, 0); * Couleur des barres pour le groupe du joueur.
*/
/** Couleur des barres pour les autres groupes. */ private static final Color PLAYER_GROUP_COLOR = new Color(11, 143, 55); // Vert
private static final Color OTHER_GROUP_COLOR = new Color(0, 0, 204);
/** Couleur de l'ombre projetée par les barres. */
private static final Color SHADOW_COLOR = new Color(0, 0, 0, 60);
/** Couleur du texte affiché sur les barres. */
private static final Color TEXT_COLOR = Color.BLACK;
/** Police pour le label "Score moyen". */
private static final Font AVERAGE_FONT = new Font("Arial", Font.ITALIC, 12);
/** Police pour les labels des groupes. */
private static final Font GROUP_LABEL_FONT = new Font("Arial", Font.BOLD, 16);
/** Police pour afficher les scores des groupes. */
private static final Font SCORE_FONT = new Font("Arial", Font.BOLD, 14);
/** Marge autour de l'histogramme. */
private static final int PADDING = 30;
/** Décalage de l'ombre en pixels. */
private static final int SHADOW_OFFSET = 2;
/** /**
* Construit un nouveau panneau d'histogramme. * Couleur des barres pour les autres groupes.
* */
* @param groupAverages Liste des scores moyens des groupes. private static final Color OTHER_GROUP_COLOR = new Color(11, 77, 143); // Bleu
* La taille de cette liste détermine le nombre de barres dans l'histogramme.
* @param highlightedGroup Indice du groupe à mettre en surbrillance. /**
* Si cet indice ne correspond à aucun groupe, aucune barre ne sera mise en surbrillance. * Couleur du texte.
* @throws NullPointerException si {@code groupAverages} est {@code null}. */
private static final Color TEXT_COLOR = Color.BLACK;
/**
* Polices utilisée pour le texte de la moyenne du groupe
*/
private static final Font AVERAGE_FONT = new Font("Arial", Font.ITALIC, 12);
/**
* Police utilisée pour les étiquettes de groupe
*/
private static final Font GROUP_LABEL_FONT = new Font("Arial", Font.BOLD, 16);
/**
* Police utilisée pour les scores
*/
private static final Font SCORE_FONT = new Font("Arial", Font.BOLD, 14);
/**
* Marge intérieure pour les barres.
*/
private static final int PADDING = 30;
/**
* Crée un nouveau panneau d'histogramme avec les scores moyens des groupes et un groupe mis en surbrillance.
* @param groupAverages Liste des scores moyens des groupes
* @param highlightedGroup Indice du groupe à mettre en surbrillance
*/ */
public BarChartPanel(List<Integer> groupAverages, int highlightedGroup) { public BarChartPanel(List<Integer> groupAverages, int highlightedGroup) {
this.groupAverages = Objects.requireNonNull(groupAverages, "Group averages cannot be null"); this.groupAverages = Objects.requireNonNull(groupAverages, "Group averages cannot be null");
this.highlightedGroup = highlightedGroup; this.highlightedGroup = highlightedGroup;
// Configuration du panneau
setOpaque(false); setOpaque(false);
setBackground(new Color(0, 0, 0, 0));
setAlignmentX(Component.CENTER_ALIGNMENT);
} }
/** /**
* Dessine le composant graphique, incluant les barres, les labels et les scores. * Dessine les barres de l'histogramme avec les scores moyens des groupes.
* *
* @param g Le contexte graphique. * @param g Contexte graphique pour dessiner les barres
*/ */
@Override @Override
protected void paintComponent(Graphics g) { protected void paintComponent(Graphics g) {
super.paintComponent(g); super.paintComponent(g);
if (groupAverages.isEmpty()) { if (groupAverages.isEmpty()) {
return; return;
} }
Graphics2D g2d = (Graphics2D) g.create(); Graphics2D g2d = (Graphics2D) g.create();
try { try {
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int width = getWidth(); int width = getWidth();
int height = getHeight(); int height = getHeight();
int barWidth = width / (groupAverages.size() + 1); int barWidth = Math.max(20, width / (groupAverages.size() * 2));
int maxScore = groupAverages.stream() int maxScore = groupAverages.stream().mapToInt(Integer::intValue).max().orElse(1);
.mapToInt(Integer::intValue)
.max()
.orElse(0);
for (int i = 0; i < groupAverages.size(); i++) { for (int i = 0; i < groupAverages.size(); i++) {
int barHeight = calculateBarHeight(maxScore, height, groupAverages.get(i)); int score = groupAverages.get(i);
int xPosition = (i + 1) * barWidth; int barHeight = calculateBarHeight(maxScore, height, score);
int xPosition = PADDING + i * (barWidth * 2);
Color barColor = (i == highlightedGroup) ? PLAYER_GROUP_COLOR : OTHER_GROUP_COLOR; Color barColor = (i == highlightedGroup) ? PLAYER_GROUP_COLOR : OTHER_GROUP_COLOR;
g2d.setColor(SHADOW_COLOR); // Dessiner la barre avec coins arrondis
g2d.fillRect(xPosition + SHADOW_OFFSET, height - barHeight - PADDING + SHADOW_OFFSET, barWidth - 5, barHeight);
g2d.setColor(barColor); g2d.setColor(barColor);
g2d.fillRect(xPosition, height - barHeight - PADDING, barWidth - 5, barHeight); g2d.fillRoundRect(xPosition, height - barHeight - PADDING, barWidth, barHeight, 10, 10);
// Ajustez dynamiquement la position des textes // Ajouter le texte des scores
int textY = height - barHeight - PADDING - 20; // Score position
if (textY < PADDING) {
textY = PADDING - 2; // Éviter le chevauchement au sommet
}
String avgScoreText = String.valueOf(groupAverages.get(i));
g2d.setFont(SCORE_FONT); g2d.setFont(SCORE_FONT);
g2d.setColor(TEXT_COLOR); g2d.setColor(TEXT_COLOR);
drawCenteredString(g2d, avgScoreText, xPosition, barWidth, textY); String scoreText = String.valueOf(score);
drawCenteredString(g2d, scoreText, xPosition, barWidth, height - barHeight - PADDING - 5);
// Position de "Score moyen"
int labelY = textY - 15; // Placer légèrement au-dessus du score
if (labelY < PADDING) {
labelY = PADDING - 17; // Éviter les débordements
}
// Ajouter les labels "Score moyen"
g2d.setFont(AVERAGE_FONT); g2d.setFont(AVERAGE_FONT);
drawCenteredString(g2d, "Score moyen : ", xPosition, barWidth, labelY); drawCenteredString(g2d, "Score moyen", xPosition, barWidth, height - barHeight - PADDING - 20);
// Ajouter les noms des groupes
g2d.setFont(GROUP_LABEL_FONT); g2d.setFont(GROUP_LABEL_FONT);
String groupLabel = "Groupe " + (i + 1); drawCenteredString(g2d, "Groupe " + (i + 1), xPosition, barWidth, height - 5);
drawCenteredString(g2d, groupLabel, xPosition, barWidth, height - 10);
} }
} finally { } finally {
g2d.dispose(); g2d.dispose();
} }
} }
/** /**
* Calcule la hauteur d'une barre proportionnellement au score maximum. * Calcule la hauteur de la barre en fonction du score et de la hauteur du panneau.
* * @param maxScore Score maximum
* @param maxScore Le score maximum parmi tous les groupes * @param height Hauteur du panneau
* @param height La hauteur totale du composant * @param score Score du groupe
* @param score Le score du groupe courant * @return Hauteur de la barre
* @return La hauteur de la barre
*/ */
private int calculateBarHeight(int maxScore, int height, int score) { private int calculateBarHeight(int maxScore, int height, int score) {
return (int) ((double) score / maxScore * (height - 2 * PADDING)); return (int) ((double) score / maxScore * (height - 2 * PADDING));
} }
/** /**
* Dessine une chaîne centrée horizontalement dans une section de la largeur du composant. * Dessine une chaîne de texte centrée horizontalement dans un rectangle.
* * @param g2d Contexte graphique pour dessiner le texte
* @param g2d Le contexte graphique * @param text Texte à dessiner
* @param text Le texte à dessiner * @param xOffset Position X du coin supérieur gauche du rectangle
* @param xOffset La position x de départ de la section * @param sectionWidth Largeur du rectangle
* @param sectionWidth La largeur de la section * @param y Position Y du coin supérieur gauche du rectangle
* @param y La position y où dessiner le texte
*/ */
private void drawCenteredString(Graphics2D g2d, String text, int xOffset, int sectionWidth, int y) { private void drawCenteredString(Graphics2D g2d, String text, int xOffset, int sectionWidth, int y) {
FontMetrics metrics = g2d.getFontMetrics(); FontMetrics metrics = g2d.getFontMetrics();
@@ -165,13 +153,10 @@ protected void paintComponent(Graphics g) {
/** /**
* Retourne la taille préférée du panneau. * Retourne la taille préférée du panneau.
* * @return Taille préférée du panneau
* @return La taille préférée
* @see Dimension
*/ */
@Override @Override
public Dimension getPreferredSize() { public Dimension getPreferredSize() {
// Définir une taille préférée par défaut si non spécifiée return new Dimension(600, 400);
return new Dimension(400, 200);
} }
} }