diff --git a/projet_linea/Niveaux.db b/projet_linea/Niveaux.db index 38c8221..909dd82 100644 Binary files a/projet_linea/Niveaux.db and b/projet_linea/Niveaux.db differ diff --git a/projet_linea/bin/CadreDeConnexion.class b/projet_linea/bin/CadreDeConnexion.class index 61efa2f..b8af445 100644 Binary files a/projet_linea/bin/CadreDeConnexion.class and b/projet_linea/bin/CadreDeConnexion.class differ diff --git a/projet_linea/bin/Cercle.class b/projet_linea/bin/Cercle.class index bfdf302..9899856 100644 Binary files a/projet_linea/bin/Cercle.class and b/projet_linea/bin/Cercle.class differ diff --git a/projet_linea/bin/Jeu.class b/projet_linea/bin/Jeu.class index 7590d7a..64be96d 100644 Binary files a/projet_linea/bin/Jeu.class and b/projet_linea/bin/Jeu.class differ diff --git a/projet_linea/bin/Ligne.class b/projet_linea/bin/Ligne.class index e8f88fd..5eaa11e 100644 Binary files a/projet_linea/bin/Ligne.class and b/projet_linea/bin/Ligne.class differ diff --git a/projet_linea/bin/MenuPrincipal.class b/projet_linea/bin/MenuPrincipal.class new file mode 100644 index 0000000..2bee24a Binary files /dev/null and b/projet_linea/bin/MenuPrincipal.class differ diff --git a/projet_linea/bin/NiveauxDataConnect.class b/projet_linea/bin/NiveauxDataConnect.class index b36948e..b76b836 100644 Binary files a/projet_linea/bin/NiveauxDataConnect.class and b/projet_linea/bin/NiveauxDataConnect.class differ diff --git a/projet_linea/bin/Segment.class b/projet_linea/bin/Segment.class index 4a55c2a..d0718db 100644 Binary files a/projet_linea/bin/Segment.class and b/projet_linea/bin/Segment.class differ diff --git a/projet_linea/bin/images/icone.png b/projet_linea/bin/images/icone.png new file mode 100644 index 0000000..d728eca Binary files /dev/null and b/projet_linea/bin/images/icone.png differ diff --git a/projet_linea/src/CadreDeConnexion.java b/projet_linea/src/CadreDeConnexion.java index 501567c..2f0f505 100644 --- a/projet_linea/src/CadreDeConnexion.java +++ b/projet_linea/src/CadreDeConnexion.java @@ -1,24 +1,58 @@ import java.awt.*; +import java.net.URL; +import javax.imageio.ImageIO; import javax.swing.*; public class CadreDeConnexion extends JFrame { + + + //-------------------------------------------------------------------------- + // Méthode peremttant de charger(récupérer) l'image îcone depuis Ressources + // ------------------------------------------------------------------------- + private Image chargerImageDepuisRessource(String cheminRessource) { + // Cette méthode doit seulement charger l'image, pas rappeler elle-même. + try { + URL url = getClass().getResource(cheminRessource); + if (url != null) { + return ImageIO.read(url); + } + System.err.println("Ressource introuvable : " + cheminRessource); + } catch (Exception e) { + System.err.println("Erreur chargement image : " + e.getMessage()); + } + return null; + } public CadreDeConnexion() { - // 1. Configuration de base - setTitle("Connexion Linea"); + + // Image de fond de la page de connexion + Background panelBackground = null; + + // 1. On change l'icône de CETTE fenêtre (this) + Image imageConnexion = chargerImageDepuisRessource("/images/icone.png"); + if (imageConnexion != null) { + // On applique la même image comme icône de la fenêtre + this.setIconImage(imageConnexion); + // On prépare aussi le fond pour le panneau de connexion + panelBackground = new Background(imageConnexion); + } + + // 2. Configuration de base + setTitle("ZENITH FLUX"); setSize(800, 600); setDefaultCloseOperation(EXIT_ON_CLOSE); setLocationRelativeTo(null); // Centre la fenêtre - // 2. Style du panneau principal (noir ) - JPanel panel = new JPanel(new GridBagLayout()); - panel.setBackground(new Color(30, 30, 30)); - add(panel); + // 2. Style du panneau principal (Gris foncé) + // On utilise ZoneDessin pour pouvoir dessiner l'image en fond + JPanel panel = new ZoneDessin(panelBackground); + panel.setLayout(new GridBagLayout()); + setContentPane(panel); // Conteneur pour les éléments (pour les empiler verticalement) Box box = Box.createVerticalBox(); - // 3. Création des composants + // 4. Création des composants JLabel titre = new JLabel("CONNEXION"); titre.setForeground(Color.WHITE); titre.setFont(new Font("Arial", Font.BOLD, 24)); @@ -32,7 +66,7 @@ public class CadreDeConnexion extends JFrame { JButton loginBtn = BoutonsManager.creerBoutonConnexion(userField, passField, this); - // 4. Ajout des composants avec des espaces (Struts) + // 5. Ajout des composants avec des espaces (Struts) box.add(titre); box.add(Box.createVerticalStrut(30)); // Espace box.add(new JLabel("Utilisateur :")); @@ -49,6 +83,92 @@ public class CadreDeConnexion extends JFrame { panel.add(box); // Ajoute la boîte au centre du GridBagLayout + // 5. Logique du bouton + loginBtn.addActionListener(e -> { + String user = userField.getText(); + String pass = new String(passField.getPassword()); + int userId = GestionBDD.verifierConnexion(user, pass); + + if (userId != -1) { + dispose(); + Jeu jeu = new Jeu(userId); + jeu.demarrer(); + } else { + JOptionPane.showMessageDialog(this, "Acces refuse"); + } + }); + + createBtn.addActionListener(evt -> { + JFrame createFrame = new JFrame("Creation de compte"); + createFrame.setSize(800, 600); + createFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + createFrame.setLocationRelativeTo(null); + + // On recharge la même image pour la fenêtre de création de compte + // afin de lui donner à la fois l'icône et le fond d'écran. + Background panelBackgroundCreation = null; + Image imageCreation = chargerImageDepuisRessource("/images/icone.png"); + if (imageCreation != null) { + createFrame.setIconImage(imageCreation); + panelBackgroundCreation = new Background(imageCreation); + } + + // Même principe que pour la page de connexion : le fond est dessiné par ZoneDessin + JPanel createPanel = new ZoneDessin(panelBackgroundCreation); + createPanel.setLayout(new GridBagLayout()); + createFrame.setContentPane(createPanel); + + Box createBox = Box.createVerticalBox(); + + JLabel createTitre = new JLabel("CREATION DE COMPTE"); + createTitre.setForeground(Color.WHITE); + createTitre.setFont(new Font("Arial", Font.BOLD, 24)); + createTitre.setAlignmentX(Component.CENTER_ALIGNMENT); + + JTextField newUserField = new JTextField(15); + newUserField.setMaximumSize(new Dimension(250, 30)); + + JPasswordField newPassField = new JPasswordField(15); + newPassField.setMaximumSize(new Dimension(250, 30)); + + JButton createAccountBtn = new JButton("Créer"); + createAccountBtn.setBackground(new Color(70, 130, 180)); + createAccountBtn.setForeground(Color.WHITE); + createAccountBtn.setFocusPainted(false); + createAccountBtn.setAlignmentX(Component.CENTER_ALIGNMENT); + + createBox.add(createTitre); + createBox.add(Box.createVerticalStrut(30)); + createBox.add(new JLabel("Nouvel utilisateur :")); + createBox.add(newUserField); + createBox.add(Box.createVerticalStrut(15)); + createBox.add(new JLabel("Mot de passe :")); + createBox.add(newPassField); + createBox.add(Box.createVerticalStrut(30)); + createBox.add(createAccountBtn); + + createPanel.add(createBox); + + createAccountBtn.addActionListener(e -> { + String u = newUserField.getText().trim(); + String p = new String(newPassField.getPassword()); + if (u.isEmpty() || p.isEmpty()) { + JOptionPane.showMessageDialog(createFrame, "Utilisateur et mot de passe requis"); + return; + } + + boolean ok = GestionBDD.creerUtilisateur(u, p); + if (ok) { + JOptionPane.showMessageDialog(createFrame, "Compte cree avec succes."); + createFrame.dispose(); + } else { + JOptionPane.showMessageDialog(createFrame, "Échec : le nom d'utilisateur existe deja ou erreur."); + } + }); + + createFrame.setVisible(true); + }); + setVisible(true); } } diff --git a/projet_linea/src/Cercle.java b/projet_linea/src/Cercle.java index 2d45f36..fd5e8bd 100644 --- a/projet_linea/src/Cercle.java +++ b/projet_linea/src/Cercle.java @@ -10,7 +10,8 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl //------------------------------------------------------------------------- // PROPRIETES - //------------------------------------------------------------------------- + //------------------------------------------------------------------------- + private double gravite = 10.0; protected double rayon = 30; protected double depY = 0; // déplacement @@ -77,6 +78,12 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl return y; } + //------------------------------------------------------------------------- + // Méthode pour mettre à jour la gravité du cercle depuis la classe + //------------------------------------------------------------------------- + public void setGravite(double nouvelleGravite) { + this.gravite = nouvelleGravite; + } //------------------------------------------------------------------------- // Méthode qui note que up a été appuyée // -> le booléen permet de ne plus être tributaire @@ -118,17 +125,15 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl void Animer() { // pas est à prendre comme un "delta t" - if (!modeTriche) { - // chute libre - vitesse = vitesse + 9.81 * pas; - } + // chute libre + vitesse = vitesse + gravite * pas; // impulsion (toujours appliquée, même en triche ?) if (montee==true) { vitesse = vitesse - impulsion *pas; } - depY = 1/2 * 9.81 + vitesse * pas; + depY = 1/2 * gravite + vitesse * pas; if (depY<-10) { depY=-10; @@ -144,7 +149,7 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl // Méthode pour mettre un plafond et un sol au cercle public void verification_cercle_out(){ if(y < plafond || (y + rayon) >= sol ) { - vitesse = -vitesse; + vitesse =-vitesse; } } diff --git a/projet_linea/src/Jeu.java b/projet_linea/src/Jeu.java index b5a2e0c..9780be2 100644 --- a/projet_linea/src/Jeu.java +++ b/projet_linea/src/Jeu.java @@ -14,7 +14,7 @@ public class Jeu implements KeyListener, ActionListener{ //------------------------------------------------------------------------- // Ecran : instance de ZoneDessin, qui contiendra tous les objets graphiques - // On ne vapas créer directement l'écran car ça va créer un flash + // On ne va pas créer directement l'écran car ça va créer un flash // Dès le lancement du jeu avec l'image de fond par défaut et l'imga du niveau // et les animera protected ZoneDessin ecran; @@ -96,13 +96,14 @@ public class Jeu implements KeyListener, ActionListener{ if( n1 != null ){ try { - // On charge l'mage du niveau 1 + // On charge l'image du niveau 1 java.net.URL url = Jeu.class.getResource("/" + n1.getImage()); if(url != null){ java.awt.Image img = javax.imageio.ImageIO.read(url); premierFond = new Background(img); } } catch (Exception e) { + e.printStackTrace(); } } @@ -268,6 +269,18 @@ public class Jeu implements KeyListener, ActionListener{ this.dernierSegmentValide = null; this.ecran.partiePerdue = false; + // Formule : Gravité de base - (Niveau * incrément) + // Niveau 1 : 10.0 + (1 * 1.50) = 8.5 (poids normal) + // Niveau 4 : 10.0 + (4 * 1.50) = 4.0 (Très léger et plane) + double graviteNiveau = 10.0 - (this.niveauEnCours.getId() * 1.5); + // Sécurité: La gravité du niveau ne doit pas descendre en dessous de 2 + // Sinon le cercle ne retomberait plus jamais + if(graviteNiveau < 2.0){ + graviteNiveau = 2.0; + } + this.demiCercleAvant.setGravite(graviteNiveau); + this.demiCercleArriere.setGravite(graviteNiveau); + // On corse le jeu avec son ID //On applique les paramètres aux options de jeu @@ -302,7 +315,7 @@ public class Jeu implements KeyListener, ActionListener{ // Petite pause avec un message horloge.stop(); - JOptionPane.showMessageDialog(fenetre, "Niveau terminé ! Préparez-vous pour le niveau suivant ;)"); + JOptionPane.showMessageDialog(fenetre, "Niveau terminé ! Préparez-vous pour le niveau suivant 😉 OU PERDEZ 😈"); chargerNiveau(idNiveauActuel); horloge.start(); @@ -323,11 +336,14 @@ public class Jeu implements KeyListener, ActionListener{ itemCourant.y = this.laLigne.getYSurLigne(itemCourant.x) - 40; } - // Mode triche : centrer le cercle sur le milieu du segment courant + // Mode triche : Le cercle suit la ligne + // On utilisera le calcul pour déterminer si la ligne traverse le cercle if (modeTriche && this.laLigne.getSegCourant() != null) { - double milieuY = this.laLigne.getSegCourant().getMilieuY(); - this.demiCercleAvant.y = milieuY; - this.demiCercleArriere.y = milieuY; + // double yPoint = this.getSegCourant().y + (this.SegCourant.yLong / this.SegCourant.xLong) * (this.xCercle - this.SegCourant.x); + double yPointTricheArrire = this.laLigne.getSegCourant().getY() + (this.laLigne.getSegCourant().getYLong() / this.laLigne.getSegCourant().getXLong()) * (this.demiCercleArriere.getX() - this.laLigne.getSegCourant().getX()); + double yPointTricheAvant = this.laLigne.getSegCourant().getY() + (this.laLigne.getSegCourant().getYLong() / this.laLigne.getSegCourant().getXLong()) * (this.demiCercleAvant.getX() - this.laLigne.getSegCourant().getX()); + this.demiCercleAvant.y = yPointTricheArrire ; + this.demiCercleArriere.y = yPointTricheAvant; } if (itemCourant.estTouche(demiCercleAvant)) { diff --git a/projet_linea/src/Ligne.java b/projet_linea/src/Ligne.java index 78c8f8e..e4545ce 100644 --- a/projet_linea/src/Ligne.java +++ b/projet_linea/src/Ligne.java @@ -173,6 +173,7 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique } return dansCercle; } + public Segment getSegCourant() { return this.SegCourant; } diff --git a/projet_linea/src/MenuPrincipal.java b/projet_linea/src/MenuPrincipal.java new file mode 100644 index 0000000..73a9cb5 --- /dev/null +++ b/projet_linea/src/MenuPrincipal.java @@ -0,0 +1,113 @@ +import javax.swing.*; +import java.awt.*; + +// ★★★ CLASSE CREEE PAR L'UTILISATEUR ★★★ +// Fichier : MenuPrincipal.java (nouveau fichier) +// Objectif : afficher un menu d'accueil APRES la connexion réussie +// Remplace : l'ancien démarrage direct du jeu après connexion +// Fonctionnalités : 2 boutons (Lancer le jeu / Voir mes scores) + +// Fenêtre du menu principal affichée après la connexion +public class MenuPrincipal extends JFrame { + + // ID de l'utilisateur connecté + private final int utilisateurId; + + // Constructeur du menu principal + // Affiche un écran d'accueil avec deux options : "Lancer le jeu" et "Voir mes scores" + // ★★★ CONSTRUCTEUR CREE PAR L'UTILISATEUR ★★★ + // Nouveau : il n'existait pas avant, crée le menu principal + public MenuPrincipal(int utilisateurId, String userName) { + // Sauvegarde l'ID pour l'utiliser lors des appels à la base de données + this.utilisateurId = utilisateurId; + + // Configuration de la fenêtre + setTitle("Menu Principal - Linea"); // Titre de la fenêtre + setSize(800, 600); // Dimensions de la fenêtre + setDefaultCloseOperation(EXIT_ON_CLOSE); // Quitter l'app à la fermeture + setLocationRelativeTo(null); // Centre la fenêtre + + // Crée le panneau principal avec un fond sombre + JPanel panel = new JPanel(new GridBagLayout()); // GridBagLayout pour centrage + panel.setBackground(new Color(30, 30, 30)); // Fond gris très foncé + add(panel); + + // Crée une boîte verticale pour disposer les éléments de haut en bas + Box box = Box.createVerticalBox(); // Disposition verticale + box.setAlignmentX(Component.CENTER_ALIGNMENT); // Centré horizontalement + + // Crée un titre de bienvenue personalisé avec le nom de l'utilisateur + JLabel titre = new JLabel("Bienvenue, " + userName + " !"); + titre.setForeground(Color.WHITE); // Texte blanc + titre.setFont(new Font("Arial", Font.BOLD, 26)); // Police Arial gras 26pt + titre.setAlignmentX(Component.CENTER_ALIGNMENT); // Centré + + // Crée le bouton "Lancer le jeu" pour démarrer une partie + JButton demarrer = new JButton("Lancer le jeu"); + demarrer.setBackground(new Color(70, 130, 180)); // Couleur bleu acier + demarrer.setForeground(Color.WHITE); // Texte blanc + demarrer.setFocusPainted(false); // Pas de bordure au focus + demarrer.setMaximumSize(new Dimension(220, 40)); // Dimension du bouton + demarrer.setAlignmentX(Component.CENTER_ALIGNMENT); // Centré horizontalement + + + // Au clic, ferme ce menu et lance le jeu + // ★★★ ACTION MODIFIEE PAR L'UTILISATEUR ★★★ + // Lance le jeu APRES fermeture du menu (ajout du menu principal) + demarrer.addActionListener(e -> { + // Ferme la fenêtre de menu + dispose(); + // Crée une instance du jeu avec l'ID utilisateur (authentifié) + Jeu jeu = new Jeu(utilisateurId); + // Démarre l'affichage et l'initialisation du jeu + jeu.demarrer(); + }); + + // Crée le bouton "Voir mes scores" pour afficher l'historique + // ★★★ NOUVEAU BOUTON PAR L'UTILISATEUR ★★★ + // Nouvelle fonctionnalité : permet de voir les scores AVANT de lancer le jeu + // Utilise les méthodes : GestionBDD.recupererScoresUtilisateur() + // GestionBDD.recupererMeilleurScoreUtilisateur() + JButton scores = new JButton("Voir mes scores"); + scores.setBackground(new Color(70, 130, 180)); // Couleur bleu acier (même que demarrer) + scores.setForeground(Color.WHITE); // Texte blanc + scores.setFocusPainted(false); // Pas de bordure au focus + scores.setMaximumSize(new Dimension(220, 40)); // Dimension du bouton + scores.setAlignmentX(Component.CENTER_ALIGNMENT); // Centré horizontalement + + + // Au clic, récupère et affiche les scores depuis la base de données + // ★★★ ACTION PAR L'UTILISATEUR ★★★ + // Nouvelle action : afficher les scores historiques du joueur dans une popup + // Récupère : tous les scores + le meilleur score + scores.addActionListener(e -> { + // Récupère la liste de tous les scores de l'utilisateur depuis la BD + java.util.List scoreList = GestionBDD.recupererScoresUtilisateur(utilisateurId); + // Récupère aussi le meilleur score (score maximum) depuis la BD + int meilleurScore = GestionBDD.recupererMeilleurScoreUtilisateur(utilisateurId); + + // Construit un message texte avec tous les scores à afficher + StringBuilder message = new StringBuilder(); + message.append("Meilleur score : ").append(meilleurScore).append("\n\n"); + message.append("Tous les scores :\n"); + + // Ajoute chaque score à la liste, un par un + for (int s : scoreList) { + message.append(s).append("\n"); + } + + // Affiche les scores dans une boîte de dialogue popup + JOptionPane.showMessageDialog(this, message.toString(), "Mes Scores", JOptionPane.INFORMATION_MESSAGE); + }); + + // Ajoute tous les éléments dans la boîte + box.add(titre); + box.add(Box.createVerticalStrut(40)); // Espace de 40 pixels après le titre + box.add(demarrer); + box.add(Box.createVerticalStrut(15)); // Espace de 15 pixels entre les deux boutons + box.add(scores); + + // Ajoute la boîte au panneau principal + panel.add(box); + } +} diff --git a/projet_linea/src/NiveauxDataConnect.java b/projet_linea/src/NiveauxDataConnect.java index c00ea93..b549612 100644 --- a/projet_linea/src/NiveauxDataConnect.java +++ b/projet_linea/src/NiveauxDataConnect.java @@ -124,24 +124,24 @@ public class NiveauxDataConnect { // 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" + // nom = "Facile", vitesse_ligne = 5, nb_segments = 50, image = "images\ciel.jpeg", multiplicateur_score = 10, couleur_cercle = "bleu" // --------------------------------Niveau 2 -------------------------------- - // nom = "intermédaire", vitesse_ligne = 7, nb_segments = 100, image = "images\montagnes.jpg", multiplicateur_score = 2, couleur_cercle = "gris" + // nom = "intermédaire", vitesse_ligne = 7, nb_segments = 100, image = "images\montagnes.jpg", multiplicateur_score = 20, couleur_cercle = "gris" // --------------------------------Niveau 3 -------------------------------- - // nom = "Difficile", vitesse_ligne = 9, nb_segments = 100, image = "images\volcan.jpg", multiplicateur_score = 3, couleur_cercle = "marron" + // nom = "Difficile", vitesse_ligne = 9, nb_segments = 100, image = "images\volcan.jpg", multiplicateur_score = 30, couleur_cercle = "marron" // --------------------------------Niveau 4 -------------------------------- - // nom = "Ultime", vitesse_ligne = 10, nb_segments = 150, image = "images\espace.jpg", multiplicateur_score = 4, couleur_cercle = "violet" + // nom = "Ultime", vitesse_ligne = 10, nb_segments = 150, image = "images\espace.jpg", multiplicateur_score = 50, 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');"; + + "VALUES('Facile', 5, 50, 'images/ciel.jpeg', 10, '#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');"; + + "VALUES('Intermédiaire', 7, 100, 'images/montagnes.jpg', 20, '#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');"; + + "VALUES('Difficile', 9, 100, 'images/volcan.jpg', 30, '#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');"; + + "VALUES('Ultime', 10, 150, 'images/espace.jpg', 50, '#9400D3');"; try (Statement stmt = conn.createStatement()) { stmt.execute(query1); diff --git a/projet_linea/src/Segment.java b/projet_linea/src/Segment.java index 60374da..59dbb0d 100644 --- a/projet_linea/src/Segment.java +++ b/projet_linea/src/Segment.java @@ -32,6 +32,14 @@ public class Segment extends ObjetGraphique { // Hérite de la classe ObjetGraph yLong = yyLong; } + public double getYLong(){ + return this.yLong; + } + + public double getXLong(){ + return this.xLong; + } + // Méthode pour obtenir la position Y au milieu du segment public double getMilieuY() { return y + yLong / 2; diff --git a/projet_linea/src/ZoneDessin.class b/projet_linea/src/ZoneDessin.class deleted file mode 100644 index 3a893aa..0000000 Binary files a/projet_linea/src/ZoneDessin.class and /dev/null differ diff --git a/projet_linea/src/images/icone.png b/projet_linea/src/images/icone.png new file mode 100644 index 0000000..d728eca Binary files /dev/null and b/projet_linea/src/images/icone.png differ