diff --git a/src/linea/FondAutoroute.java b/src/linea/FondAutoroute.java
index 81fc97b..8ed3bf4 100644
--- a/src/linea/FondAutoroute.java
+++ b/src/linea/FondAutoroute.java
@@ -6,13 +6,18 @@ import java.awt.Graphics;
public class FondAutoroute extends ObjetGraphique {
private double decalage = 0;
+ // On ajoute une variable pour mémoriser la vitesse
+ private double vitesseDefilement;
- public FondAutoroute() {
+ // On modifie le constructeur pour accepter la vitesse
+ public FondAutoroute(double vitesse) {
super();
+ this.vitesseDefilement = vitesse;
}
@Override
void Afficher(Graphics g) {
+ // ... (Garde exactement ton code d'affichage actuel avec les couleurs et les boucles for) ...
// Ciel de nuit urbaine
g.setColor(new Color(20, 20, 45));
g.fillRect(0, 0, 800, 50);
@@ -34,9 +39,11 @@ public class FondAutoroute extends ObjetGraphique {
@Override
void Animer() {
- decalage += 5.0;
+ // On utilise la vitesse dynamique au lieu du 5.0 fixe
+ decalage += vitesseDefilement;
+
if (decalage >= 120) {
- decalage = 0; // Boucle infinie
+ decalage = 0;
}
}
}
\ No newline at end of file
diff --git a/src/linea/GestionnaireBDD.java b/src/linea/GestionnaireBDD.java
new file mode 100644
index 0000000..110798c
--- /dev/null
+++ b/src/linea/GestionnaireBDD.java
@@ -0,0 +1,95 @@
+package linea;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+public class GestionnaireBDD {
+
+ private Connection conn = null;
+ private static final String DB_FILE = "linea_scores.db";
+
+ /**
+ * Le constructeur établit la connexion et crée la table si elle n'existe pas.
+ */
+ public GestionnaireBDD() {
+ try {
+ // URL de connexion pour SQLite
+ String url = "jdbc:sqlite:" + DB_FILE;
+ // Établir la connexion
+ conn = DriverManager.getConnection(url);
+ System.out.println("Connexion à la base de données SQLite établie.");
+ // S'assurer que la table pour les scores existe
+ creerTableSiNecessaire();
+ } catch (SQLException e) {
+ System.err.println("Erreur de connexion à la base de données : " + e.getMessage());
+ }
+ }
+
+ /**
+ * Crée la table 'parties' si elle n'est pas déjà présente dans la base de données.
+ */
+ private void creerTableSiNecessaire() {
+ String sql = "CREATE TABLE IF NOT EXISTS parties (\n"
+ + " id INTEGER PRIMARY KEY AUTOINCREMENT,\n"
+ + " duree_secondes INTEGER NOT NULL,\n"
+ + " campagne_id INTEGER NOT NULL,\n"
+ + " difficulte_id INTEGER NOT NULL,\n"
+ + " score INTEGER NOT NULL,\n"
+ + " date_partie TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n"
+ + ");";
+
+ // 'try-with-resources' assure que le Statement est bien fermé
+ try (Statement stmt = conn.createStatement()) {
+ stmt.execute(sql);
+ } catch (SQLException e) {
+ System.err.println("Erreur lors de la création de la table : " + e.getMessage());
+ }
+ }
+
+ /**
+ * Enregistre les informations d'une partie terminée dans la base de données.
+ * Utilise un PreparedStatement pour la sécurité et la performance.
+ *
+ * @param dureePartie Durée du jeu en secondes.
+ * @param idCampagne ID de la campagne jouée.
+ * @param idDifficulte ID de la difficulté choisie.
+ * @param score Score final du joueur.
+ */
+ public void enregistrerPartie(int dureePartie, int idCampagne, int idDifficulte, int score) {
+ if (conn == null) {
+ System.err.println("Impossible d'enregistrer la partie : pas de connexion à la BDD.");
+ return;
+ }
+
+ String sql = "INSERT INTO parties(duree_secondes, campagne_id, difficulte_id, score) VALUES(?,?,?,?)";
+
+ try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
+ pstmt.setInt(1, dureePartie);
+ pstmt.setInt(2, idCampagne);
+ pstmt.setInt(3, idDifficulte);
+ pstmt.setInt(4, score);
+ pstmt.executeUpdate();
+ System.out.println("Partie enregistrée avec succès ! Score : " + score);
+ } catch (SQLException e) {
+ System.err.println("Erreur lors de l'enregistrement de la partie : " + e.getMessage());
+ }
+ }
+
+ /**
+ * Ferme la connexion à la base de données.
+ * Il est important d'appeler cette méthode à la fermeture de l'application.
+ */
+ public void fermerConnexion() {
+ try {
+ if (conn != null && !conn.isClosed()) {
+ conn.close();
+ System.out.println("Connexion à la base de données fermée.");
+ }
+ } catch (SQLException ex) {
+ System.err.println("Erreur lors de la fermeture de la connexion BDD : " + ex.getMessage());
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/linea/Jeu.java b/src/linea/Jeu.java
index 2808b0d..39415b8 100644
--- a/src/linea/Jeu.java
+++ b/src/linea/Jeu.java
@@ -22,6 +22,12 @@ public class Jeu implements KeyListener, ActionListener {
protected JLabel labScore;
protected int score;
+ //base de données
+ protected GestionnaireBDD bdd = new GestionnaireBDD();
+
+ public int idCampagneActive = 0; // Retient la campagne (1 = Autoroute, etc.)
+ public int difficulteActive = 0; // Retient la difficulté (1=Facile, 2=Moyen, 3=Difficile)
+
public Jeu(){
score = 0;
labScore = new JLabel("
score : 0
");
@@ -59,6 +65,16 @@ public class Jeu implements KeyListener, ActionListener {
fenetre.pack();
fenetre.setLocationRelativeTo(null);
fenetre.setVisible(true);
+
+ // Ajout d'un écouteur pour fermer la connexion BDD en quittant
+ fenetre.addWindowListener(new java.awt.event.WindowAdapter() {
+ @Override
+ public void windowClosing(java.awt.event.WindowEvent windowEvent) {
+ System.out.println("Fermeture de l'application, fermeture de la connexion BDD.");
+ bdd.fermerConnexion();
+ }
+ });
+
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@@ -71,9 +87,15 @@ public class Jeu implements KeyListener, ActionListener {
}
public void lancerNiveau(int numeroNiveau) {
- System.out.println("Lancement du niveau " + numeroNiveau);
- // Ici tu pourras configurer la difficulté selon le niveau
- lancerPartie();
+ this.difficulteActive = numeroNiveau;
+
+ if (idCampagneActive == 1) {
+ CampagneAutoroute campagne = new CampagneAutoroute(this);
+ campagne.lancerNiveau(numeroNiveau);
+ }
+ else {
+ lancerPartie(); // Partie classique par défaut
+ }
}
public void lancerPartie() {
@@ -137,6 +159,12 @@ public class Jeu implements KeyListener, ActionListener {
public void gameOver() {
horloge.stop();
ecran.setGameOver(true); // Affiche "Game Over" et le bouton Retour
+
+ int dureePartie = score / 25; // Exemple : 25 frames par seconde
+
+ // On utilise nos deux variables pour la sauvegarde !
+ // L'appel est maintenant plus robuste grâce au nouveau GestionnaireBDD
+ bdd.enregistrerPartie(dureePartie, idCampagneActive, difficulteActive, score);
}
// Gestion touches...
diff --git a/src/linea/Ligne.java b/src/linea/Ligne.java
index ceea564..2f35099 100644
--- a/src/linea/Ligne.java
+++ b/src/linea/Ligne.java
@@ -11,8 +11,11 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique
//-------------------------------------------------------------------------
// PROPRIETES
- //-------------------------------------------------------------------------
-
+ //-------------------------------------------------------------------------
+
+ protected double vitesseDefilement = 5.0;
+
+
// nb de Segments qui composent la ligne
protected int nbSegments = 400;
@@ -34,25 +37,25 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique
//-------------------------------------------------------------------------
// Constructeur de la classe
- //-------------------------------------------------------------------------
- public Ligne(){
- // Valeurs initiales pour la position de la Ligne
+ //-------------------------------------------------------------------------
+ public Ligne() {
+ // Par défaut, si on ne précise rien, on met vitesse 5 et pente 30
+ this(5.0, 30.0);
+ }
+
+ public Ligne(double vitesse, double penteMax) {
+ this.vitesseDefilement = vitesse;
+ this.inclinaisonMax = penteMax;
+
double x = 400;
double y = 200;
+ double dx = 0, dy = 0;
- double xCourant = x;
- double yCourant = y;
- double dx = 0,dy=0;
+ Segment s = new Segment(x, y, dx, dy);
+ listSegments.add(s);
-
- // Création de la liste de segments qui composent la ligne
- Segment s = new Segment(xCourant,yCourant,dx,dy);
-
-
- for (int i=0; i 600) {
@@ -61,7 +64,7 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique
s = new Segment(x,y,dx,dy);
s.setCouleur(new Color(0.2f,0.2f,0.2f));
-
+
x+=dx;
y+=dy;
listSegments.add(s);
@@ -100,17 +103,13 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique
//-------------------------------------------------------------------------
@Override
void Animer() {
- // On déplace chaque segment vers la gauche (vitesse arbitraire de 5)
- double vitesseDefilement = 5.0;
-
- // On met à jour le x de la ligne (utilisé pour le calcul de position)
this.x -= vitesseDefilement;
- // On répercute sur chaque segment
for (Segment s : listSegments) {
s.setX(s.getX() - vitesseDefilement);
}
}
+
public double getHauteurLigneA(double xCercle) {
for (Segment s : listSegments) {
// Si le segment couvre la position X du cercle
diff --git a/src/linea/MenuCampagne.java b/src/linea/MenuCampagne.java
index e412a01..d9ec272 100644
--- a/src/linea/MenuCampagne.java
+++ b/src/linea/MenuCampagne.java
@@ -73,10 +73,20 @@ public class MenuCampagne extends JPanel {
btnRetour.addActionListener(e -> jeu.afficherMenuPrincipal());
- java.awt.event.ActionListener ouvrirNiveaux = e -> cartes.show(panneauCartes, "NIVEAUX");
- btnC1.addActionListener(ouvrirNiveaux);
- btnC2.addActionListener(ouvrirNiveaux);
- btnC3.addActionListener(ouvrirNiveaux);
+ btnC1.addActionListener(e -> {
+ jeu.idCampagneActive = 1; // On retient qu'on joue à la campagne 1 (Autoroute)
+ cartes.show(panneauCartes, "NIVEAUX"); // On affiche Facile/Moyen/Difficile
+ });
+
+ btnC2.addActionListener(e -> {
+ jeu.idCampagneActive = 2;
+ cartes.show(panneauCartes, "NIVEAUX");
+ });
+
+ btnC3.addActionListener(e -> {
+ jeu.idCampagneActive = 3;
+ cartes.show(panneauCartes, "NIVEAUX");
+ });
btnRetourCampagnes.addActionListener(e -> cartes.show(panneauCartes, "LISTE"));