190 lines
9.5 KiB
Java
190 lines
9.5 KiB
Java
import java.sql.Connection;
|
|
import java.sql.DriverManager;
|
|
import java.sql.PreparedStatement;
|
|
import java.sql.ResultSet;
|
|
import java.sql.SQLException;
|
|
import java.sql.Statement;
|
|
|
|
|
|
// Cette classe est celle qui gère la connexion à la base de données Niveaux.db
|
|
public class NiveauxDataConnect {
|
|
//Création d'une variable de connexion à la base de données
|
|
private static final String url = "jdbc:sqlite:Niveaux.db";
|
|
private static boolean tablesCreees = false; // Variable pour vérifier si les tables ont été créées
|
|
private static NiveauxDataConnect instance; // Instance unique de la classe NiveauDataConnect
|
|
private static Connection maConnexion; // Objet connexion à partager
|
|
|
|
|
|
|
|
// ------------- Constructeur de la classe ------------------------
|
|
// Il initialise la connexion à la base de données
|
|
// Il crée la table niveau si elle n'existe pas déjà
|
|
// Il insérer les niveaux dans la table niveau directement
|
|
// Pour éviter à le faire à chaque fois que le jeu est lancé
|
|
// NB : Le fichier de la base de donnée est dans le .jar
|
|
// Il est nécessaire de l'initialiser afin de pouvoir le lire et écrire dessus
|
|
// Car dans la .jar il est en lecture seule
|
|
// Il faut donc le copier dans un endroit où il peut être modifié, par exemple dans le dossier du projet
|
|
// Mon constructeur est en privé car personne ne doit pouvoir faire new NiveauDataConnect
|
|
// ----------------------------------------------------------------
|
|
private NiveauxDataConnect() throws ClassNotFoundException, SQLException {
|
|
// Initialisation de la connexion à la base de données
|
|
maConnexion = getConnection();
|
|
if (maConnexion != null) {
|
|
System.out.println("Instance du singleton créée et connexion prête.");
|
|
} else {
|
|
System.out.println("Connexion échouée !");
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Point d'accès global pour obtenir l'instance du singleton
|
|
// On utilise synchronized pour éviter les problèmes si deux threads appellent
|
|
// la méthode au démarrage en même temps
|
|
//--------------------------------------------------------------------------
|
|
public static synchronized NiveauxDataConnect getInstance(){
|
|
try{
|
|
if(instance == null){
|
|
instance = new NiveauxDataConnect();
|
|
}
|
|
return instance;
|
|
}catch(Exception e){
|
|
e.printStackTrace();
|
|
}
|
|
return instance;
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Méthode de connexion à la base de données Niveaux.db
|
|
// -------------------------------------------------------------------------
|
|
public static Connection getConnection() throws SQLException{
|
|
// On vérifie si ma connexion, singleton existe déjà et à déjà une valeur
|
|
// Ou si elle a été fermé
|
|
if(maConnexion == null || maConnexion.isClosed()){
|
|
// On vérifiera si la BDD est déjà créé et possède déjà des données à l'intérieur
|
|
// On devra ainsi l'extraire depuis le .jar
|
|
boolean baseExiste = bddInit.init();
|
|
try{
|
|
maConnexion = DriverManager.getConnection(url);
|
|
System.out.println("Connexion à la base de données réussie !");
|
|
if(!baseExiste){
|
|
// Vérifier si les tables ont déjà été créées pour éviter de les recréer à chaque connexion
|
|
if (!tablesCreees) {
|
|
// Créer la table niveau si elle n'existe pas déjà
|
|
CreerTableNiveaux(maConnexion);
|
|
tablesCreees = true; // Marquer les tables comme créées
|
|
// Insérer les niveaux dans la table niveau
|
|
insererNiveau(maConnexion);
|
|
}
|
|
}
|
|
|
|
return maConnexion;
|
|
}catch(Exception e){
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
return maConnexion;
|
|
}
|
|
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Méthode pour créer la table Niveaux si elle n'existe pas déjà
|
|
// -------------------------------------------------------------------------
|
|
private static void CreerTableNiveaux(Connection conn) {
|
|
|
|
String sql = "CREATE TABLE IF NOT EXISTS niveau( "
|
|
+ "id INTEGER PRIMARY KEY AUTOINCREMENT, "
|
|
+ "nom TEXT NOT NULL, " /*nom du niveau*/
|
|
+ "vitesse_ligne INTEGER NOT NULL, " /*vitesse de la ligne*/
|
|
+ "nb_segments INTEGER NOT NULL, " /*nombre de segments à faire passer au joueur pour réussir le niveau*/
|
|
+ "image TEXT NOT NULL, " /*image du niveau*/
|
|
+ "multiplicateur_score INTEGER, " /*multiplier le score en fonction du niveau*/
|
|
+ "couleur_cercle TEXT NOT NULL " /*Couleur du cercle en fonctiond du niveau */
|
|
+");" ;
|
|
|
|
try (Statement stmt = conn.createStatement()) {
|
|
stmt.execute(sql);
|
|
stmt.close();
|
|
} catch (SQLException e) {
|
|
System.err.println("Erreur lors de la création de la table Niveaux : " + e.getMessage());
|
|
System.out.println("Connexion échouée !");
|
|
e.printStackTrace();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Méthode pour insérer les niveaux dans la base de données
|
|
// Les niveaux sont connus à l'avance et sont insérés directement
|
|
// dans la base de données pour éviter de les insérer à chaque fois que
|
|
// le jeu est lancé
|
|
// Pour corser le jeu, on utilisera l'id du niveau qui nous servira de difficulté
|
|
// --------------------------------Niveau 1 --------------------------------
|
|
// nom = "Facile", vitesse_ligne = 5, nb_segments = 50, image = "images\ciel.jpeg", multiplicateur_score = 1, couleur_cercle = "bleu"
|
|
// --------------------------------Niveau 2 --------------------------------
|
|
// nom = "intermédaire", vitesse_ligne = 7, nb_segments = 100, image = "images\montagnes.jpg", multiplicateur_score = 2, couleur_cercle = "gris"
|
|
// --------------------------------Niveau 3 --------------------------------
|
|
// nom = "Difficile", vitesse_ligne = 9, nb_segments = 100, image = "images\volcan.jpg", multiplicateur_score = 3, couleur_cercle = "marron"
|
|
// --------------------------------Niveau 4 --------------------------------
|
|
// nom = "Ultime", vitesse_ligne = 10, nb_segments = 150, image = "images\espace.jpg", multiplicateur_score = 4, couleur_cercle = "violet"
|
|
// -------------------------------------------------------------------------
|
|
public static void insererNiveau(Connection conn) {
|
|
String query1 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle) "
|
|
+ "VALUES('Facile', 5, 50, 'images/ciel.jpeg', 1, '#0000FF');";
|
|
|
|
String query2 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle) "
|
|
+ "VALUES('Intermédiaire', 7, 100, 'images/montagnes.jpg', 2, '#808080');";
|
|
String query3 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle) "
|
|
+ "VALUES('Difficile', 9, 100, 'images/volcan.jpg', 3, '#8B4513');";
|
|
String query4 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle) "
|
|
+ "VALUES('Ultime', 10, 150, 'images/espace.jpg', 4, '#9400D3');";
|
|
|
|
try (Statement stmt = conn.createStatement()) {
|
|
stmt.execute(query1);
|
|
stmt.execute(query2);
|
|
stmt.execute(query3);
|
|
stmt.execute(query4);
|
|
tablesCreees = true ;
|
|
stmt.close();
|
|
} catch (SQLException e) {
|
|
System.err.println("Erreur lors de l'insertion des niveaux : " + e.getMessage());
|
|
}
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Méthode pour récupérer les niveaux depuis la base de données
|
|
// Elle retourne un niveau en fonction de son id
|
|
// -------------------------------------------------------------------------
|
|
public static Niveau recupererNiveau(Connection conn, int id) {
|
|
Niveau niveauRecup = null;
|
|
String sql = "SELECT * FROM niveau WHERE id = ?;";
|
|
|
|
try (PreparedStatement pstmt = conn.prepareStatement(sql)){
|
|
pstmt.setInt(1, id); // On remplace le 1er ? par l'id
|
|
|
|
try(ResultSet rs = pstmt.executeQuery()) {
|
|
while (rs.next()) {
|
|
int id1 = rs.getInt("id");
|
|
String nom = rs.getString("nom");
|
|
int vitesse_ligne = rs.getInt("vitesse_ligne");
|
|
int nb_segments = rs.getInt("nb_segments");
|
|
String image = rs.getString("image");
|
|
int multiplicateur_score = rs.getInt("multiplicateur_score");
|
|
String couleur_cercle = rs.getString("couleur_cercle");
|
|
niveauRecup = new Niveau(id1, nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle);
|
|
}
|
|
}
|
|
|
|
} catch (SQLException e) {
|
|
System.err.println("Erreur lors de la récupération des niveaux : " + e.getMessage());
|
|
}
|
|
return niveauRecup;
|
|
}
|
|
|
|
|
|
}
|