Ajout d'un chartPanel + modifications de la BDD
This commit is contained in:
90399
SQL_DATABASE.sql
90399
SQL_DATABASE.sql
File diff suppressed because it is too large
Load Diff
72
src/fr/monkhanny/dorfromantik/game/BarChartPanel.java
Normal file
72
src/fr/monkhanny/dorfromantik/game/BarChartPanel.java
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
package fr.monkhanny.dorfromantik.game;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.swing.*;
|
||||||
|
|
||||||
|
public class BarChartPanel extends JPanel {
|
||||||
|
private List<Integer> groupAverages;
|
||||||
|
private int highlightedGroup;
|
||||||
|
private JPanel mainPanel; // Store reference to mainPanel
|
||||||
|
|
||||||
|
public BarChartPanel(List<Integer> groupAverages, int highlightedGroup, JPanel mainPanel) {
|
||||||
|
this.groupAverages = groupAverages;
|
||||||
|
this.highlightedGroup = highlightedGroup;
|
||||||
|
this.mainPanel = mainPanel;
|
||||||
|
|
||||||
|
// Rendre le fond transparent et ajouter une bordure noire
|
||||||
|
setBackground(new Color(0, 0, 0, 0)); // Fond transparent
|
||||||
|
setAlignmentX(Component.CENTER_ALIGNMENT); // Centrer horizontalement
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void paintComponent(Graphics g) {
|
||||||
|
super.paintComponent(g);
|
||||||
|
int width = getWidth();
|
||||||
|
int height = getHeight();
|
||||||
|
int barWidth = width / (groupAverages.size() + 1); // Espacement entre les groupes
|
||||||
|
int maxScore = groupAverages.stream().max(Integer::compare).orElse(0);
|
||||||
|
|
||||||
|
// Dessiner les barres et leurs étiquettes (moyennes des scores)
|
||||||
|
for (int i = 0; i < groupAverages.size(); i++) {
|
||||||
|
int barHeight = (int) ((double) groupAverages.get(i) / maxScore * (height - 50)); // Ajuster la hauteur des barres
|
||||||
|
int xPosition = (i + 1) * barWidth; // Espacement entre les groupes
|
||||||
|
|
||||||
|
// Appliquer une couleur de barre (mettre en évidence le groupe du joueur en rouge, les autres en bleu)
|
||||||
|
if (i == highlightedGroup) {
|
||||||
|
g.setColor(new Color(255, 69, 0)); // Couleur rouge pour le groupe du joueur
|
||||||
|
} else {
|
||||||
|
g.setColor(new Color(70, 130, 180)); // Bleu pour les autres groupes
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ajouter des ombres à la barre pour un effet 3D
|
||||||
|
g.fillRect(xPosition, height - barHeight - 30, barWidth - 5, barHeight);
|
||||||
|
g.setColor(new Color(0, 0, 0, 60)); // Ombre
|
||||||
|
g.fillRect(xPosition + 2, height - barHeight - 28, barWidth - 5, barHeight);
|
||||||
|
|
||||||
|
// Dessiner le texte (moyenne) au-dessus de chaque barre
|
||||||
|
String avgScoreText = String.valueOf(groupAverages.get(i));
|
||||||
|
FontMetrics metrics = g.getFontMetrics();
|
||||||
|
int textWidth = metrics.stringWidth(avgScoreText);
|
||||||
|
int textX = xPosition + (barWidth - textWidth) / 2; // Centrer le texte
|
||||||
|
int textY = height - barHeight - 35; // Placer le texte juste au-dessus de la barre
|
||||||
|
|
||||||
|
g.setColor(Color.BLACK); // Couleur du texte
|
||||||
|
g.drawString(avgScoreText, textX, textY);
|
||||||
|
|
||||||
|
// Ajouter un label pour préciser que c'est la "moyenne"
|
||||||
|
g.setFont(new Font("Arial", Font.ITALIC, 12)); // Police italique plus petite pour le label "Moyenne"
|
||||||
|
String label = "Score moyen : ";
|
||||||
|
int labelWidth = metrics.stringWidth(label);
|
||||||
|
g.drawString(label, xPosition + (barWidth - labelWidth) / 2, textY - 15); // Placer "Moyenne" au-dessus du score
|
||||||
|
|
||||||
|
// Dessiner l'étiquette de groupe (Groupe 1, Groupe 2, ...)
|
||||||
|
String groupLabel = "Groupe " + (i + 1);
|
||||||
|
g.setColor(Color.BLACK);
|
||||||
|
g.setFont(new Font("Arial", Font.PLAIN, 14)); // Police plus petite pour les étiquettes
|
||||||
|
int groupLabelWidth = g.getFontMetrics().stringWidth(groupLabel);
|
||||||
|
g.drawString(groupLabel, xPosition + (barWidth - groupLabelWidth) / 2, height - 10); // Positionner l'étiquette sous la barre
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -12,6 +12,7 @@ import java.awt.event.ActionEvent;
|
|||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class GameOver extends JPanel {
|
public class GameOver extends JPanel {
|
||||||
private JFrame gameFrame;
|
private JFrame gameFrame;
|
||||||
@@ -21,6 +22,7 @@ public class GameOver extends JPanel {
|
|||||||
|
|
||||||
public GameOver(JFrame gameFrame, int finalScore, Database database, MainMenu mainMenu) {
|
public GameOver(JFrame gameFrame, int finalScore, Database database, MainMenu mainMenu) {
|
||||||
this.gameFrame = gameFrame;
|
this.gameFrame = gameFrame;
|
||||||
|
this.gameFrame.setTitle("Partie terminée - Dorfromantik");
|
||||||
this.mainMenu = mainMenu;
|
this.mainMenu = mainMenu;
|
||||||
this.finalScore = finalScore;
|
this.finalScore = finalScore;
|
||||||
this.database = database;
|
this.database = database;
|
||||||
@@ -67,42 +69,33 @@ public class GameOver extends JPanel {
|
|||||||
database.addScore(seriesId, finalScore);
|
database.addScore(seriesId, finalScore);
|
||||||
List<Integer> allScores = database.getScoresBySeriesId(seriesId);
|
List<Integer> allScores = database.getScoresBySeriesId(seriesId);
|
||||||
|
|
||||||
// Calculate the groups
|
// Check if there are enough players to form groups
|
||||||
int totalPlayers = allScores.size();
|
int totalPlayers = allScores.size();
|
||||||
int groupSize = totalPlayers / 10;
|
if (totalPlayers >= 100) {
|
||||||
int playerGroup = 0;
|
int groupSize = totalPlayers / 10;
|
||||||
|
int playerGroup = 0;
|
||||||
|
|
||||||
// Check if there are less than 20 players
|
// Group data for bar chart
|
||||||
String funnyQuote = "";
|
List<Integer> groupAverages = new ArrayList<>();
|
||||||
if (totalPlayers < 20) {
|
|
||||||
// Only show the funny quote if there are less than 20 players
|
|
||||||
if(totalPlayers == 0){
|
|
||||||
funnyQuote = "Vous êtes le premier joueur à jouer à cette partie personalisée...";
|
|
||||||
}
|
|
||||||
|
|
||||||
if(totalPlayers == 1){
|
// Calculate which group the player's score falls into and the average score for each group
|
||||||
funnyQuote = "Vous êtes le deuxième joueur à jouer à cette partie personalisée...";
|
for (int i = 0; i < 10; i++) {
|
||||||
}
|
int startIdx = i * groupSize;
|
||||||
|
int endIdx = Math.min((i + 1) * groupSize, totalPlayers);
|
||||||
if(totalPlayers > 1){
|
if (startIdx < totalPlayers) {
|
||||||
funnyQuote = "À part vous, il y a " + totalPlayers + " joueurs qui à joué à cette partie personalisée...";
|
List<Integer> groupScores = allScores.subList(startIdx, endIdx);
|
||||||
}
|
int groupSum = 0;
|
||||||
// Display the funny quote directly
|
for (int score : groupScores) {
|
||||||
JLabel quoteLabel = new JLabel(funnyQuote);
|
groupSum += score;
|
||||||
quoteLabel.setFont(Fonts.SCORE.getFont(24));
|
}
|
||||||
quoteLabel.setForeground(Color.WHITE);
|
groupAverages.add(groupSum / groupScores.size());
|
||||||
quoteLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
if (scoreInGroup(allScores, finalScore, startIdx, endIdx)) {
|
||||||
mainPanel.add(quoteLabel);
|
playerGroup = i + 1;
|
||||||
} else {
|
}
|
||||||
// Calculate which group the player's score falls into
|
|
||||||
for (int i = 0; i < totalPlayers; i++) {
|
|
||||||
if (allScores.get(i) <= finalScore) {
|
|
||||||
playerGroup = i / groupSize + 1;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Group information
|
// Group information panel
|
||||||
JPanel groupPanel = new JPanel();
|
JPanel groupPanel = new JPanel();
|
||||||
groupPanel.setOpaque(false);
|
groupPanel.setOpaque(false);
|
||||||
groupPanel.setLayout(new BoxLayout(groupPanel, BoxLayout.Y_AXIS));
|
groupPanel.setLayout(new BoxLayout(groupPanel, BoxLayout.Y_AXIS));
|
||||||
@@ -113,14 +106,21 @@ public class GameOver extends JPanel {
|
|||||||
groupTitleLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
groupTitleLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
||||||
groupPanel.add(groupTitleLabel);
|
groupPanel.add(groupTitleLabel);
|
||||||
|
|
||||||
JLabel groupSizeLabel = new JLabel("Il y a " + groupSize + " joueurs dans ce groupe.");
|
BarChartPanel barChartPanel = new BarChartPanel(groupAverages, playerGroup - 1, mainPanel);
|
||||||
|
barChartPanel.setPreferredSize(new Dimension(700, 400));
|
||||||
|
barChartPanel.setAlignmentX(Component.CENTER_ALIGNMENT); // Centrer horizontalement
|
||||||
|
groupPanel.add(barChartPanel);
|
||||||
|
|
||||||
|
groupPanel.add(Box.createVerticalStrut(30));
|
||||||
|
|
||||||
|
JLabel groupSizeLabel = new JLabel("Il y a " + groupSize + " joueurs dans votre groupe.");
|
||||||
groupSizeLabel.setFont(Fonts.SCORE.getFont(24));
|
groupSizeLabel.setFont(Fonts.SCORE.getFont(24));
|
||||||
groupSizeLabel.setForeground(Color.WHITE);
|
groupSizeLabel.setForeground(Color.WHITE);
|
||||||
groupSizeLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
groupSizeLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
||||||
groupPanel.add(groupSizeLabel);
|
groupPanel.add(groupSizeLabel);
|
||||||
|
|
||||||
// Show a funny quote based on the group
|
// Show a funny quote based on the group
|
||||||
funnyQuote = getFunnyQuote(playerGroup);
|
String funnyQuote = getFunnyQuote(playerGroup);
|
||||||
JLabel quoteLabel = new JLabel(funnyQuote);
|
JLabel quoteLabel = new JLabel(funnyQuote);
|
||||||
quoteLabel.setFont(Fonts.SCORE.getFont(24));
|
quoteLabel.setFont(Fonts.SCORE.getFont(24));
|
||||||
quoteLabel.setForeground(Color.WHITE);
|
quoteLabel.setForeground(Color.WHITE);
|
||||||
@@ -129,9 +129,13 @@ public class GameOver extends JPanel {
|
|||||||
|
|
||||||
// Add group information panel
|
// Add group information panel
|
||||||
mainPanel.add(groupPanel);
|
mainPanel.add(groupPanel);
|
||||||
|
} else {
|
||||||
// Spacer
|
// No groups, display a simple message instead
|
||||||
mainPanel.add(Box.createVerticalStrut(30));
|
JLabel noGroupsLabel = new JLabel("Pas mal !");
|
||||||
|
noGroupsLabel.setFont(Fonts.SCORE.getFont(24));
|
||||||
|
noGroupsLabel.setForeground(Color.WHITE);
|
||||||
|
noGroupsLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
||||||
|
mainPanel.add(noGroupsLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
@@ -155,11 +159,18 @@ public class GameOver extends JPanel {
|
|||||||
|
|
||||||
// Ajouter le bouton au panneau principal
|
// Ajouter le bouton au panneau principal
|
||||||
mainPanel.add(returnButton);
|
mainPanel.add(returnButton);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private boolean scoreInGroup(List<Integer> allScores, int finalScore, int startIdx, int endIdx) {
|
||||||
|
for (int i = startIdx; i < endIdx; i++) {
|
||||||
|
if (allScores.get(i) == finalScore) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private String getFunnyQuote(int playerGroup) {
|
private String getFunnyQuote(int playerGroup) {
|
||||||
// A list of funny and motivational quotes based on the group
|
// A list of funny and motivational quotes based on the group
|
||||||
switch (playerGroup) {
|
switch (playerGroup) {
|
||||||
|
Reference in New Issue
Block a user