diff --git a/AllScore.java b/AllScore.java index 52374c5..b0d1af5 100644 --- a/AllScore.java +++ b/AllScore.java @@ -21,7 +21,7 @@ public class AllScore { "jdbc:mariadb://dwarves.iut-fbleau.fr/akagundu", "akagundu", "dersim62Lodek"); try{ - PreparedStatement pst = cnx.prepareStatement("SELECT score from score where id_serie=?;"); + PreparedStatement pst = cnx.prepareStatement("SELECT Score from score where id_serie=?;"); pst.setInt(1, idSerie); ResultSet rs = pst.executeQuery(); while(rs.next()) { diff --git a/SendScore.java b/SendScore.java index 8444015..e5deb18 100644 --- a/SendScore.java +++ b/SendScore.java @@ -1,9 +1,7 @@ import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; -import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; public class SendScore { public void insertscore(int idSerie,int score) { @@ -18,7 +16,7 @@ public class SendScore { "jdbc:mariadb://dwarves.iut-fbleau.fr/akagundu", "akagundu", "dersim62Lodek"); try{ - PreparedStatement pst = cnx.prepareStatement("INSERT INTO score (id_serie, score) VALUES (?, ?);"); + PreparedStatement pst = cnx.prepareStatement("INSERT INTO Score (id_serie, score) VALUES (?, ?);"); pst.setInt(1, idSerie); pst.setInt(2, score); pst.executeUpdate(); diff --git a/bin/controller/AllScore.class b/bin/controller/AllScore.class new file mode 100644 index 0000000..0ec0af2 Binary files /dev/null and b/bin/controller/AllScore.class differ diff --git a/bin/controller/GameController.class b/bin/controller/GameController.class index e1fb7ae..1c15dd9 100644 Binary files a/bin/controller/GameController.class and b/bin/controller/GameController.class differ diff --git a/bin/controller/GameEndListener.class b/bin/controller/GameEndListener.class new file mode 100644 index 0000000..ff8be49 Binary files /dev/null and b/bin/controller/GameEndListener.class differ diff --git a/bin/controller/MenuController.class b/bin/controller/MenuController.class index faf78fb..aaea4ff 100644 Binary files a/bin/controller/MenuController.class and b/bin/controller/MenuController.class differ diff --git a/bin/controller/ResListener.class b/bin/controller/ResListener.class deleted file mode 100644 index aaa8657..0000000 Binary files a/bin/controller/ResListener.class and /dev/null differ diff --git a/bin/controller/SendScore.class b/bin/controller/SendScore.class new file mode 100644 index 0000000..a32bbec Binary files /dev/null and b/bin/controller/SendScore.class differ diff --git a/bin/main/Main.class b/bin/main/Main.class index e9b291c..265d9fe 100644 Binary files a/bin/main/Main.class and b/bin/main/Main.class differ diff --git a/bin/model/MenuModel.class b/bin/model/MenuModel.class deleted file mode 100644 index d332e94..0000000 Binary files a/bin/model/MenuModel.class and /dev/null differ diff --git a/bin/view/App.class b/bin/view/App.class index 5cffaf4..c2a18a7 100644 Binary files a/bin/view/App.class and b/bin/view/App.class differ diff --git a/bin/view/GameView.class b/bin/view/GameView.class index ad40ca6..62c75e7 100644 Binary files a/bin/view/GameView.class and b/bin/view/GameView.class differ diff --git a/bin/view/MenuView.class b/bin/view/MenuView.class index 8fc0679..a276c8a 100644 Binary files a/bin/view/MenuView.class and b/bin/view/MenuView.class differ diff --git a/bin/view/ScoreView$1.class b/bin/view/ScoreView$1.class new file mode 100644 index 0000000..4dd3614 Binary files /dev/null and b/bin/view/ScoreView$1.class differ diff --git a/bin/view/ScoreView.class b/bin/view/ScoreView.class new file mode 100644 index 0000000..1a28735 Binary files /dev/null and b/bin/view/ScoreView.class differ diff --git a/src/main/Main.java b/src/main/Main.java index af0d52f..61e9218 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -1,8 +1,4 @@ package main; - -import model.MenuModel; -import controller.MenuController; -import controller.SeriesSelector; import view.*; import javax.sound.sampled.AudioInputStream; @@ -14,21 +10,9 @@ import java.net.URL; public class Main { public static void main(String[] args) { SwingUtilities.invokeLater(() -> { - MenuModel model = new MenuModel(); - MenuView view = new MenuView(); - - // Initialiser SeriesSelector et le passer à MenuView - SeriesSelector seriesSelector = new SeriesSelector(); - view.setSeriesSelector(seriesSelector); - - // Créer MenuController avec model, view et seriesSelector - new MenuController(model, view, seriesSelector); - - JFrame frame = App.getInstance(); - frame.add(view); - frame.setVisible(true); - - PlayMusic("/Music/audio.wav"); + MenuView menuView = new MenuView(); + App.addView(menuView, App.MENU_VIEW); + App.showView(App.MENU_VIEW); }); } diff --git a/src/main/java/controller/AllScore.java b/src/main/java/controller/AllScore.java new file mode 100644 index 0000000..fe90e0a --- /dev/null +++ b/src/main/java/controller/AllScore.java @@ -0,0 +1,39 @@ +package controller; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; + +public class AllScore { + public static ArrayList<Integer> getScoresForSeries(int idSerie) { + ArrayList<Integer> scores = new ArrayList<>(); + + try { + Class.forName("org.mariadb.jdbc.Driver"); + } catch (ClassNotFoundException e) { + System.err.println("Erreur : pilote JDBC non trouvé"); + System.exit(1); + } + + try (Connection cnx = DriverManager.getConnection( + "jdbc:mariadb://dwarves.iut-fbleau.fr/akagundu", + "akagundu", "dersim62Lodek")) { + try (PreparedStatement pst = cnx.prepareStatement("SELECT score FROM Score WHERE id_serie=? ORDER BY score DESC LIMIT 10")) { + pst.setInt(1, idSerie); + try (ResultSet rs = pst.executeQuery()) { + while (rs.next()) { + scores.add(rs.getInt("score")); + } + } + } + } catch (SQLException e) { + System.err.println("Erreur de connexion ou d'exécution de la requête SQL"); + e.printStackTrace(); + } + + return scores; + } +} diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index 58b7fe6..fb35432 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -1,3 +1,4 @@ +// src/main/java/controller/GameController.java package controller; import model.Tile; @@ -20,22 +21,25 @@ public class GameController implements TilePlacer { private TileDatabaseManager dbManager; private List<Tile> currentTiles; private int tileIndex; - private ScoreGameContext scoreGameContext; // Nouveau contexte pour le score + private ScoreGameContext scoreGameContext; - public GameController(GameContext gameContext, JPanel gridPanel, HexagonTile nextTilePreview, JLabel scoreLabel) { + private int placedTileCount = 0; + private int seriesId; + private GameEndListener gameEndListener; + + public GameController(GameContext gameContext, JPanel gridPanel, HexagonTile nextTilePreview, JLabel scoreLabel, int seriesId, GameEndListener gameEndListener) { + this.seriesId = seriesId; this.gameContext = gameContext; this.gridPanel = gridPanel; this.hexagonMap = gameContext.getHexagonMap(); this.availablePositions = gameContext.getAvailablePositions(); this.nextTilePreview = nextTilePreview; - this.dbManager = new TileDatabaseManager(); this.tileIndex = 0; - - // Initialisation de ScoreGameContext this.scoreGameContext = new ScoreGameContext(gameContext, scoreLabel); + this.gameEndListener = gameEndListener; - loadSeries(1); // Charger la série par défaut (ex. série 1) + loadSeries(seriesId); updatePreview(); } @@ -54,16 +58,12 @@ public class GameController implements TilePlacer { return; } - System.out.println("Placement de la tuile avec ID : " + (nextTile != null ? nextTile.getId() : "null") + " à la position : " + position); - - hexTile.setTile(nextTile); // Place la tuile actuelle + hexTile.setTile(nextTile); gridPanel.revalidate(); gridPanel.repaint(); - availablePositions.remove(position); - Point[] adjacentPositions = getAdjacentPositions(position); - for (Point adj : adjacentPositions) { + for (Point adj : getAdjacentPositions(position)) { if (!hexagonMap.containsKey(adj)) { availablePositions.add(adj); addHexagonTile(adj, gridPanel, 50, null, null); @@ -71,38 +71,43 @@ public class GameController implements TilePlacer { } gameContext.repaintGrid(gridPanel); - generateNextTile(); // Génère la tuile suivante - - // Calcul et mise à jour du score + generateNextTile(); scoreGameContext.calculateScore(); + + placedTileCount++; + if (placedTileCount >= 50) { + endGame(); // Appeler endGame pour terminer la partie + } + } + } + + private void endGame() { + int finalScore = scoreGameContext.getScore(); + + // Enregistrer le score dans la base de données + new SendScore().insertscore(seriesId, finalScore); + + // Notifiez le listener de la fin de la partie + if (gameEndListener != null) { + gameEndListener.onGameEnd(finalScore); } } public void initializeGame(CameraController cameraController) { - generateNextTile(); // Génère la première tuile et assigne une tuile valide à `nextTile` - - Tile initialTile = getNextTile(); // Récupère la tuile générée + generateNextTile(); + Tile initialTile = getNextTile(); if (initialTile == null) { System.out.println("Erreur : aucune tuile initiale générée."); - return; // Arrête l'initialisation si aucune tuile n'a été générée + return; } - - System.out.println("ID de la tuile initiale générée : " + initialTile.getId()); // Affiche l'ID de la tuile initiale - + int centerX = gridPanel.getPreferredSize().width / 2; int centerY = gridPanel.getPreferredSize().height / 2; - - Point initialPosition = new Point(0, 0); - initialPosition.setLocation(centerX / 50, centerY / 50); // Calcule la position centrale - - placeInitialTile(initialPosition, cameraController, initialTile); // Place la première tuile - - // Calculer et mettre à jour le score incluant la première tuile + Point initialPosition = new Point(centerX / 50, centerY / 50); + placeInitialTile(initialPosition, cameraController, initialTile); scoreGameContext.calculateScore(); - - generateNextTile(); // Génère la tuile suivante + generateNextTile(); } - public void placeInitialTile(Point position, CameraController cameraController, Tile tile) { if (tile == null) { @@ -110,16 +115,13 @@ public class GameController implements TilePlacer { return; } - System.out.println("Placement de la tuile initiale avec ID : " + tile.getId() + " à la position : " + position); + addHexagonTile(position, gridPanel, 50, cameraController, tile); + availablePositions.remove(position); - addHexagonTile(position, gridPanel, 50, cameraController, tile); // Place la première tuile - availablePositions.remove(position); // Marque la position comme occupée - - Point[] adjacentPositions = getAdjacentPositions(position); - for (Point adj : adjacentPositions) { + for (Point adj : getAdjacentPositions(position)) { if (!hexagonMap.containsKey(adj)) { availablePositions.add(adj); - addHexagonTile(adj, gridPanel, 50, cameraController, null); // Placeholder vide pour les positions adjacentes + addHexagonTile(adj, gridPanel, 50, cameraController, null); } } } @@ -143,18 +145,15 @@ public class GameController implements TilePlacer { yOffset += (int) (Math.sqrt(3) * hexSize / 2); } - boolean isPlaceholder = (tile == null); // Si tile est null, c'est un placeholder + boolean isPlaceholder = (tile == null); HexagonTile hexTile = new HexagonTile(position, isPlaceholder); if (tile != null) { hexTile.setTile(tile); - } else { - System.out.println("Aucun tile n'a été fourni pour cette position : " + position); } hexTile.setBounds(xOffset, yOffset, hexSize, hexSize); hexTile.addMouseListener(new HexagonMouseListener(hexTile, this, availablePositions)); - hexagonMap.put(position, hexTile); panel.add(hexTile); panel.revalidate(); @@ -164,21 +163,19 @@ public class GameController implements TilePlacer { public void generateNextTile() { if (tileIndex < currentTiles.size()) { nextTile = currentTiles.get(tileIndex++); - System.out.println("Génération de la prochaine tuile avec ID : " + nextTile.getId() + " (index " + tileIndex + ")"); - updatePreview(); // Met à jour l'aperçu de la tuile suivante + updatePreview(); } else { - nextTile = null; // Fin de la série, plus de tuiles à placer - updatePreview(); // Met à jour l'aperçu pour refléter l'absence de prochaine tuile - System.out.println("Fin de la série. Plus de tuiles à placer."); + nextTile = null; + updatePreview(); } } private void updatePreview() { if (nextTilePreview != null) { if (nextTile != null) { - nextTilePreview.setTile(nextTile); // Met à jour avec une tuile valide + nextTilePreview.setTile(nextTile); } else { - nextTilePreview.setTile(null); // Affiche un placeholder ou un message si `nextTile` est null + nextTilePreview.setTile(null); } nextTilePreview.repaint(); } diff --git a/src/main/java/controller/GameEndListener.java b/src/main/java/controller/GameEndListener.java new file mode 100644 index 0000000..2db52b7 --- /dev/null +++ b/src/main/java/controller/GameEndListener.java @@ -0,0 +1,5 @@ +package controller; + +public interface GameEndListener { + void onGameEnd(int finalScore); +} \ No newline at end of file diff --git a/src/main/java/controller/MenuController.java b/src/main/java/controller/MenuController.java deleted file mode 100644 index 998827d..0000000 --- a/src/main/java/controller/MenuController.java +++ /dev/null @@ -1,15 +0,0 @@ -package controller; - -import model.MenuModel; -import view.MenuView; - -public class MenuController { - - public MenuController(MenuModel model, MenuView view, SeriesSelector seriesSelector) { - // Assignation des action listeners aux boutons du menu - view.getQuiButton().addActionListener(new QuiListener()); // Quitte l'application - - // Définir le sélecteur de séries - view.setSeriesSelector(seriesSelector); - } -} diff --git a/src/main/java/controller/SendScore.java b/src/main/java/controller/SendScore.java new file mode 100644 index 0000000..7671b54 --- /dev/null +++ b/src/main/java/controller/SendScore.java @@ -0,0 +1,30 @@ +package controller; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class SendScore { + public void insertscore(int idSerie, int score) { + try { + Class.forName("org.mariadb.jdbc.Driver"); + } catch (ClassNotFoundException e) { + System.err.println("Erreur : pilote JDBC non trouvé"); + System.exit(1); + } + + try (Connection cnx = DriverManager.getConnection( + "jdbc:mariadb://dwarves.iut-fbleau.fr/akagundu", + "akagundu", "dersim62Lodek")) { + try (PreparedStatement pst = cnx.prepareStatement("INSERT INTO Score (id_serie, score) VALUES (?, ?);")) { + pst.setInt(1, idSerie); + pst.setInt(2, score); + pst.executeUpdate(); + } + } catch (SQLException e) { + System.err.println("Erreur de connexion ou d'exécution de la requête SQL"); + e.printStackTrace(); + } + } +} diff --git a/src/main/java/model/MenuModel.java b/src/main/java/model/MenuModel.java deleted file mode 100644 index b0f6aa4..0000000 --- a/src/main/java/model/MenuModel.java +++ /dev/null @@ -1,10 +0,0 @@ -package model; - - -public class MenuModel { - - public MenuModel() { - // rien du tout pour l'instant - } - -} diff --git a/src/main/java/view/App.java b/src/main/java/view/App.java index 666efb2..32b14f2 100644 --- a/src/main/java/view/App.java +++ b/src/main/java/view/App.java @@ -1,17 +1,37 @@ package view; import javax.swing.*; +import java.awt.*; public class App { + public static final String MENU_VIEW = "MenuView"; + public static final String GAME_VIEW = "GameView"; + public static final String SCORE_VIEW = "ScoreView"; + private static JFrame frame; + private static CardLayout cardLayout; + private static JPanel mainPanel; + + static { + frame = new JFrame("Application de Jeu"); + cardLayout = new CardLayout(); + mainPanel = new JPanel(cardLayout); + frame.setContentPane(mainPanel); + frame.setSize(1500, 750); + frame.setLocationRelativeTo(null); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } public static JFrame getInstance() { - if (frame == null) { - frame = new JFrame("Menu"); - frame.setSize(1500, 750); - frame.setLocationRelativeTo(null); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - } return frame; } -} + + public static void addView(JPanel view, String viewName) { + mainPanel.add(view, viewName); + } + + public static void showView(String viewName) { + cardLayout.show(mainPanel, viewName); + frame.setVisible(true); + } +} \ No newline at end of file diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index dea6cc1..fadd2a9 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -1,31 +1,23 @@ +// src/main/java/view/GameView.java package view; -import controller.GameController; -import controller.CameraController; -import controller.GameContext; -import controller.MouseWheelController; +import controller.*; import javax.swing.*; import java.awt.*; -public class GameView extends JFrame { +public class GameView extends JPanel implements GameEndListener { private JPanel gridPanel; private HexagonTile nextTilePreview; private GameController gameController; private CameraController cameraController; private GameContext gameContext; private JLabel scoreLabel; - - // Couleurs pour le style - private final Color hoverColor = new Color(200, 150, 100); // Couleur de hover avec transparence - private final Color normalColor = new Color(243, 171, 115); // Couleur normale avec transparence + private int seriesId; public GameView(int seriesId) { - setTitle("Jeu de Tuiles"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.seriesId = seriesId; setLayout(new BorderLayout()); - setSize(1500, 750); - setLocationRelativeTo(null); gameContext = new GameContext(); gridPanel = createHexagonGrid(); @@ -34,27 +26,39 @@ public class GameView extends JFrame { nextTilePreview = new HexagonTile(null, false); scoreLabel = new JLabel("Score: 0"); - scoreLabel.setForeground(Color.BLACK); // Texte noir pour contraste + scoreLabel.setForeground(Color.BLACK); JPanel controlPanel = createControlPanel(); - controlPanel.setPreferredSize(new Dimension(200, 600)); + controlPanel.setPreferredSize(new Dimension(200, getPreferredSize().height)); add(controlPanel, BorderLayout.EAST); - gameController = new GameController(gameContext, gridPanel, nextTilePreview, scoreLabel); - gameController.loadSeries(seriesId); // Charge la série + gameController = new GameController(gameContext, gridPanel, nextTilePreview, scoreLabel, seriesId, this); + gameController.loadSeries(seriesId); cameraController = new CameraController(gridPanel, gameContext); MouseWheelController wheelController = new MouseWheelController(nextTilePreview, gameController); addMouseWheelListener(wheelController); gameController.initializeGame(cameraController); - setVisible(true); + + JButton backButton = new JButton("Retour"); + backButton.setPreferredSize(new Dimension(100, 40)); + backButton.setBackground(new Color(202, 146, 104)); + backButton.setForeground(Color.BLACK); + backButton.setFocusPainted(false); + backButton.setBorderPainted(false); + + backButton.addActionListener(e -> { + App.showView(App.MENU_VIEW); + }); + + controlPanel.add(backButton); } private JPanel createHexagonGrid() { JPanel panel = new JPanel(); panel.setLayout(null); - panel.setBackground(normalColor); // Couleur de fond de la grille + panel.setBackground(new Color(243, 171, 115)); panel.setPreferredSize(new Dimension(800, 800)); return panel; } @@ -69,16 +73,16 @@ public class GameView extends JFrame { private JPanel createControlPanel() { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); - panel.setBackground(normalColor); // Couleur normale pour le panneau de contrôle + panel.setBackground(new Color(243, 171, 115)); panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); JLabel nextTileLabel = new JLabel("Prochaine tuile : "); - nextTileLabel.setForeground(Color.BLACK); // Texte noir pour contraste + nextTileLabel.setForeground(Color.BLACK); panel.add(nextTileLabel); panel.add(Box.createRigidArea(new Dimension(0, 10))); nextTilePreview.setPreferredSize(new Dimension(150, 150)); - nextTilePreview.setBackground(hoverColor); // Couleur hover pour différencier + nextTilePreview.setBackground(new Color(200, 150, 100)); nextTilePreview.setOpaque(true); panel.add(nextTilePreview); @@ -87,4 +91,13 @@ public class GameView extends JFrame { return panel; } + + @Override + public void onGameEnd(int finalScore) { + SwingUtilities.invokeLater(() -> { + ScoreView scoreView = new ScoreView(seriesId, finalScore); + App.addView(scoreView, App.SCORE_VIEW); + App.showView(App.SCORE_VIEW); + }); + } } diff --git a/src/main/java/view/MenuView.java b/src/main/java/view/MenuView.java index c91e3fe..7e2170e 100644 --- a/src/main/java/view/MenuView.java +++ b/src/main/java/view/MenuView.java @@ -1,10 +1,11 @@ package view; +import controller.SeriesSelector; + import javax.swing.*; import java.awt.*; -import controller.SeriesSelector; -public class MenuView extends JComponent { +public class MenuView extends JPanel { private BtnPerso resumeButton; private BtnPerso newGameButton; @@ -18,7 +19,7 @@ public class MenuView extends JComponent { private Image backgroundImage; private ImageIcon logo; private ImageIcon quit; - private JLabel labelImg; // Déclaration de labelImg + private JLabel labelImg; public MenuView() { initMenu(); @@ -51,68 +52,56 @@ public class MenuView extends JComponent { } private void initMenu() { - // Initialisation du panneau latéral panelCote = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); panelCote.setBackground(new Color(243, 171, 115, 150)); panelCote.setPreferredSize(new Dimension(300, 0)); - // Charger les images backgroundImage = new ImageIcon(getClass().getResource("/java/view/img/bg.png")).getImage(); logo = new ImageIcon(getClass().getResource("/java/view/img/D.png")); quit = new ImageIcon(getClass().getResource("/java/view/img/quit.png")); - // Redimensionnement des images Image quit1 = quit.getImage(); Image lg = logo.getImage(); Image resizedlg = lg.getScaledInstance(300, 300, Image.SCALE_SMOOTH); - labelImg = new JLabel(new ImageIcon(resizedlg)); // Initialisation de labelImg + labelImg = new JLabel(new ImageIcon(resizedlg)); - // Configuration du bouton "Quitter" avec une icône redimensionnée int buttonWidth = 65; int buttonHeight = 40; Image resizedImage = quit1.getScaledInstance(buttonWidth, buttonHeight, Image.SCALE_SMOOTH); ImageIcon resizedIcon = new ImageIcon(resizedImage); - // Boutons resumeButton = new BtnPerso("JOUER"); newGameButton = new BtnPerso("COMMENT JOUER"); quitButton = new JButton(resizedIcon); - // Configurer le bouton "Quitter" pour enlever le fond et la bordure quitButton.setPreferredSize(new Dimension(buttonWidth, buttonHeight)); - quitButton.setBackground(new Color(243, 171, 115, 150)); // Fond transparent similaire - quitButton.setBorderPainted(false); // Enlever la bordure pour un look plus propre - quitButton.setOpaque(true); // Rendre le fond visible - quitButton.setFocusPainted(false); // Enlever le focus autour du bouton + quitButton.setBackground(new Color(243, 171, 115, 150)); + quitButton.setBorderPainted(false); + quitButton.setOpaque(true); + quitButton.setFocusPainted(false); - // Ajout des listeners pour les boutons resumeButton.addActionListener(e -> showSeriesButtons()); newGameButton.addActionListener(e -> toggleHowToPlay()); - // Créer le panneau "Comment jouer" et le panneau de séries howToPlayPanel = createHowToPlayPanel(); howToPlayPanel.setVisible(false); seriesPanel = createSeriesPanel(); seriesPanel.setVisible(false); - // Panneau centré pour le contenu dynamique centeredPanel = new JPanel(new GridBagLayout()); centeredPanel.setOpaque(false); centeredPanel.add(howToPlayPanel); - // Ajout des composants au panneau latéral gbc.fill = GridBagConstraints.HORIZONTAL; gbc.insets = new Insets(10, 10, 10, 10); gbc.weightx = 1.0; gbc.gridx = 0; - // Ajouter l'image de logo gbc.gridy = 0; - panelCote.add(labelImg, gbc); // Ajout de labelImg ici + panelCote.add(labelImg, gbc); - // Ajouter les boutons gbc.gridy = 1; panelCote.add(resumeButton, gbc); @@ -164,6 +153,9 @@ public class MenuView extends JComponent { int seriesId = i; BtnPerso seriesButton = new BtnPerso("Série " + seriesId); seriesButton.addActionListener(e -> { + GameView gameView = new GameView(seriesId); + App.addView(gameView, App.GAME_VIEW); + App.showView(App.GAME_VIEW); if (seriesSelector != null) { seriesSelector.startGameWithSeries(seriesId); } @@ -180,16 +172,4 @@ public class MenuView extends JComponent { super.paintComponent(g); g.drawImage(backgroundImage, 0, 0, getWidth(), getHeight(), this); } - - public BtnPerso getResumeButton() { - return resumeButton; - } - - public BtnPerso getNewGameButton() { - return newGameButton; - } - - public JButton getQuiButton() { - return quitButton; - } -} +} \ No newline at end of file diff --git a/src/main/java/view/ScoreView.java b/src/main/java/view/ScoreView.java new file mode 100644 index 0000000..471db06 --- /dev/null +++ b/src/main/java/view/ScoreView.java @@ -0,0 +1,90 @@ +// src/main/java/view/ScoreView.java +package view; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.Collections; +import controller.AllScore; + +public class ScoreView extends JPanel { + private int seriesId; + private int finalScore; + private final Color hoverColor = new Color(200, 150, 100,150); + private final Color normalColor = new Color(243, 171, 115, 150); // Couleur avec transparence + + public ScoreView(int seriesId, int finalScore) { + this.seriesId = seriesId; + this.finalScore = finalScore; + initScoreView(); + } + + private void initScoreView() { + setLayout(new BorderLayout()); + setBackground(normalColor); + + // Titre de la vue de score + JLabel title = new JLabel("Fin de la Partie", JLabel.CENTER); + title.setFont(new Font("Helvetica", Font.BOLD, 30)); + add(title, BorderLayout.NORTH); + + // Affichage du score actuel de la partie + JLabel scoreLabel = new JLabel("Votre Score : " + finalScore, JLabel.CENTER); + scoreLabel.setFont(new Font("Helvetica", Font.PLAIN, 20)); + add(scoreLabel, BorderLayout.CENTER); + + // Panneau des scores du top 10 + JPanel topScoresPanel = new JPanel(); + topScoresPanel.setLayout(new BoxLayout(topScoresPanel, BoxLayout.Y_AXIS)); + topScoresPanel.setBorder(BorderFactory.createTitledBorder("Top 10 des Scores")); + topScoresPanel.setBackground(normalColor); + + ArrayList<Integer> scores = AllScore.getScoresForSeries(seriesId); + Collections.sort(scores, Collections.reverseOrder()); + scores = new ArrayList<>(scores.subList(0, Math.min(10, scores.size()))); + + for (Integer score : scores) { + JLabel scoreItem = new JLabel(score.toString(), JLabel.CENTER); + scoreItem.setFont(new Font("Helvetica", Font.PLAIN, 18)); + scoreItem.setAlignmentX(Component.CENTER_ALIGNMENT); + + // Marquer le score final en couleur spéciale + if (score == finalScore) { + scoreItem.setForeground(new Color(128, 0, 128)); // Violet pour le score actuel + } else { + scoreItem.setForeground(Color.BLACK); + } + + topScoresPanel.add(scoreItem); + } + + add(topScoresPanel, BorderLayout.CENTER); + + // Bouton de retour au menu + BtnPerso backButton = new BtnPerso("Retour au Menu"); + backButton.addActionListener(e -> App.showView(App.MENU_VIEW)); + backButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseEntered(java.awt.event.MouseEvent evt) { + backButton.setBackground(hoverColor); + } + + public void mouseExited(java.awt.event.MouseEvent evt) { + backButton.setBackground(normalColor); + } + }); + + // Panneau de score actuel + JPanel currentScorePanel = new JPanel(); + currentScorePanel.setBackground(normalColor); + JLabel currentScoreLabel = new JLabel("Score Actuel : " + finalScore); + currentScoreLabel.setFont(new Font("Helvetica", Font.BOLD, 22)); + currentScorePanel.add(currentScoreLabel); + + // Ajouter le panneau de score actuel et le bouton de retour + JPanel southPanel = new JPanel(new BorderLayout()); + southPanel.add(currentScorePanel, BorderLayout.NORTH); + southPanel.add(backButton, BorderLayout.SOUTH); + + add(southPanel, BorderLayout.SOUTH); + } +}