Pair Programming ( merci bamba ) CardLayout

This commit is contained in:
Vincent
2024-10-27 18:31:33 +01:00
parent 50d9ee2f58
commit 0fdd38bdae
26 changed files with 292 additions and 161 deletions

View File

@@ -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;
}
}

View File

@@ -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();
}

View File

@@ -0,0 +1,5 @@
package controller;
public interface GameEndListener {
void onGameEnd(int finalScore);
}

View File

@@ -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);
}
}

View File

@@ -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();
}
}
}

View File

@@ -1,10 +0,0 @@
package model;
public class MenuModel {
public MenuModel() {
// rien du tout pour l'instant
}
}

View File

@@ -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);
}
}

View File

@@ -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);
});
}
}

View File

@@ -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;
}
}
}

View File

@@ -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);
}
}