diff --git a/linea_bdd.db b/linea_bdd.db index c89ff8b..45affec 100644 Binary files a/linea_bdd.db and b/linea_bdd.db differ diff --git a/src/GestionnaireFinDePartie.java b/src/GestionnaireFinDePartie.java index 9c5a168..221096f 100644 --- a/src/GestionnaireFinDePartie.java +++ b/src/GestionnaireFinDePartie.java @@ -7,10 +7,12 @@ public class GestionnaireFinDePartie { private boolean estGameOver = false; private JLabel labGameOver; private GestionnaireScore gestionnaireBDD; + private GestionnaireHistorique gestionnaireHistorique; - public GestionnaireFinDePartie(JLabel labGameOver, GestionnaireScore gestionnaireBDD) { + public GestionnaireFinDePartie(JLabel labGameOver, GestionnaireScore gestionnaireBDD, GestionnaireHistorique gestionnaireHistorique) { this.labGameOver = labGameOver; this.gestionnaireBDD = gestionnaireBDD; + this.gestionnaireHistorique = gestionnaireHistorique; } public void declencherGameOver(ZoneDessin ecran, String pseudo, int score) { @@ -18,9 +20,11 @@ public class GestionnaireFinDePartie { ecran.arreter(); labGameOver.setVisible(true); + //sauvegarde dans le top score seulement si ya un pseudo if (pseudo != null && !pseudo.isEmpty()) { gestionnaireBDD.sauvegarderScore(pseudo, score); } + gestionnaireHistorique.sauvegarderPartie(pseudo, score); } public boolean estGameOver() { @@ -31,4 +35,4 @@ public class GestionnaireFinDePartie { estGameOver = false; labGameOver.setVisible(false); } -} +} \ No newline at end of file diff --git a/src/GestionnaireHistorique.java b/src/GestionnaireHistorique.java new file mode 100644 index 0000000..7f991b6 --- /dev/null +++ b/src/GestionnaireHistorique.java @@ -0,0 +1,67 @@ +package linea; + +import java.sql.*; +import java.text.SimpleDateFormat; +import java.util.Date; +import javax.swing.table.DefaultTableModel; + +public class GestionnaireHistorique { + + private static final String URL = "jdbc:sqlite:linea_bdd.db"; + + public GestionnaireHistorique() { + try { + Class.forName("org.sqlite.JDBC"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + + public void sauvegarderPartie(String nom, int points) { + String pseudoFinal = (nom == null || nom.trim().isEmpty()) ? "Anonyme" : nom.trim(); + String dateActuelle = new SimpleDateFormat("dd/MM/yyyy HH:mm").format(new Date()); + String sql = "INSERT INTO historique(nom, points, date_partie) VALUES(?, ?, ?)"; + + try (Connection conn = DriverManager.getConnection(URL); + PreparedStatement pstmt = conn.prepareStatement(sql)) { + + pstmt.setString(1, pseudoFinal); + pstmt.setInt(2, points); + pstmt.setString(3, dateActuelle); + pstmt.executeUpdate(); + + } catch (SQLException e) { + System.err.println("impossible de sauvegarder l historique"); + } + } + + public DefaultTableModel getModeleTableau() { + String[] nomsColonnes = { "Partie N°", "Date", "Pseudo", "Score" }; + DefaultTableModel modele = new DefaultTableModel(nomsColonnes, 0); + String sql = "SELECT id, date_partie, nom, points FROM historique ORDER BY id DESC"; + + try (Connection conn = DriverManager.getConnection(URL); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery(sql)) { + + while (rs.next()) { + String dateRecup = rs.getString("date_partie"); + if (dateRecup == null) + dateRecup = "Inconnue"; + + Object[] ligne = { + rs.getInt("id"), + dateRecup, + rs.getString("nom"), + rs.getInt("points") + }; + modele.addRow(ligne); + } + + } catch (SQLException e) { + System.err.println("erreur lecture historique"); + } + + return modele; + } +} \ No newline at end of file diff --git a/src/Jeu.java b/src/Jeu.java index e17da80..0cae987 100644 --- a/src/Jeu.java +++ b/src/Jeu.java @@ -33,6 +33,9 @@ public class Jeu implements KeyListener, ActionListener, MouseListener { protected GestionnaireScore gestionnaireBDD = new GestionnaireScore(); + // pour gestionnaire historique + protected GestionnaireHistorique gestionnaireHistorique = new GestionnaireHistorique(); + protected GestionnaireFinDePartie gestionnaireFinDePartie; protected int compteurFrames = 0; @@ -59,7 +62,7 @@ public class Jeu implements KeyListener, ActionListener, MouseListener { labGameOver.setVisible(false); ecran.add(labGameOver); - gestionnaireFinDePartie = new GestionnaireFinDePartie(labGameOver, gestionnaireBDD); + gestionnaireFinDePartie = new GestionnaireFinDePartie(labGameOver, gestionnaireBDD, gestionnaireHistorique); ecran.addMouseListener(this); ecran.traiterBoucleAnimation(); @@ -67,15 +70,15 @@ public class Jeu implements KeyListener, ActionListener, MouseListener { private Joueur creerJoueur1() { return new Joueur( - new Color(0.0f, 0.5f, 0.0f), new Color(0.8f, 0.0f, 0.0f), - KeyEvent.VK_UP, KeyEvent.VK_DOWN + new Color(0.0f, 0.5f, 0.0f), new Color(0.8f, 0.0f, 0.0f), + KeyEvent.VK_UP, KeyEvent.VK_DOWN ); } private Joueur creerJoueur2() { return new Joueur( - new Color(0.0f, 0.3f, 0.8f), new Color(0.6f, 0.0f, 0.6f), - KeyEvent.VK_Z, KeyEvent.VK_S + new Color(0.0f, 0.3f, 0.8f), new Color(0.6f, 0.0f, 0.6f), + KeyEvent.VK_Z, KeyEvent.VK_S ); } @@ -257,4 +260,8 @@ public class Jeu implements KeyListener, ActionListener, MouseListener { public GestionnaireScore getGestionnaireBDD() { return gestionnaireBDD; } -} + + public GestionnaireHistorique getGestionnaireHistorique() { + return gestionnaireHistorique; + } +} \ No newline at end of file diff --git a/src/MenuPrincipal.java b/src/MenuPrincipal.java index dccedc3..46f527d 100644 --- a/src/MenuPrincipal.java +++ b/src/MenuPrincipal.java @@ -1,5 +1,6 @@ package linea; +import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; @@ -10,8 +11,11 @@ import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.SwingConstants; +import javax.swing.table.DefaultTableModel; public class MenuPrincipal { @@ -26,7 +30,7 @@ public class MenuPrincipal { public void afficher(String pseudoActuel) { - JPanel panneau = new JPanel(new GridLayout(8, 1, 10, 10)); + JPanel panneau = new JPanel(new GridLayout(9, 1, 10, 10)); JLabel titre = new JLabel("LINEA", SwingConstants.CENTER); champPseudo = new JTextField(pseudoActuel, 15); @@ -34,6 +38,7 @@ public class MenuPrincipal { JButton bouton1Joueur = new JButton("1 Joueur"); JButton bouton2Joueurs = new JButton("2 Joueurs"); JButton boutonClassement = new JButton("Classement"); + JButton boutonHistorique = new JButton("Historique"); JButton boutonQuitter = new JButton("Quitter"); JButton boutonCheat = new JButton("Cheat Mode : OFF"); @@ -59,6 +64,28 @@ public class MenuPrincipal { } }); + boutonHistorique.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + // pour le modele de tableau + DefaultTableModel modele = jeu.getGestionnaireHistorique().getModeleTableau(); + + JTable tableau = new JTable(modele); + + // pour ne pas pouvoir modifier le tableau + tableau.setDefaultEditor(Object.class, null); + // pour ne pas faire bouger les collones + tableau.getTableHeader().setReorderingAllowed(false); + + // pour le scroll + JScrollPane scrollPane = new JScrollPane(tableau); + scrollPane.setPreferredSize(new Dimension(400, 300)); + + // afficher la fenetre pop up + JOptionPane.showMessageDialog(fenetre, scrollPane, "Historique des parties", JOptionPane.PLAIN_MESSAGE); + } + }); + boutonQuitter.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -79,14 +106,15 @@ public class MenuPrincipal { panneau.add(bouton1Joueur); panneau.add(bouton2Joueurs); panneau.add(boutonClassement); + panneau.add(boutonHistorique); panneau.add(boutonCheat); panneau.add(boutonQuitter); - JPanel conteneur = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 130)); + JPanel conteneur = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 110)); conteneur.add(panneau); fenetre.setContentPane(conteneur); fenetre.revalidate(); fenetre.repaint(); } -} +} \ No newline at end of file