diff --git a/linea/Jeu.java b/linea/Jeu.java
index 09642d8..c54457c 100644
--- a/linea/Jeu.java
+++ b/linea/Jeu.java
@@ -8,195 +8,138 @@ import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
+import javax.swing.JOptionPane;
-public class Jeu implements KeyListener, ActionListener{
- //-------------------------------------------------------------------------
- // PROPRIETES
- //-------------------------------------------------------------------------
-
- // Ecran : instance de ZoneDessin, qui contiendra tous les objets graphiques
- // et les animera
- protected ZoneDessin ecran = new ZoneDessin();
-
- // Le cercle : en fait 2 demis-cercles, un qui passera sous la ligne
- // un qui passera dessus
- protected Cercle demiCercleAvant = new Cercle(90,-180); // celui qui est sur la ligne
- protected Cercle demiCercleArriere = new Cercle(90,180); // celui qui est derrière la ligne
-
- // A FAIRE : ajouter les objets graphiques manquants, s'il y en a
- Ligne ligne = new Ligne();
+public class Jeu implements KeyListener, ActionListener {
- // Timer : un objet qui émet des événements à un intervalle choisi,
- // il sert à donner le pas de l'animation
- protected Timer horloge;
-
- // Une variable qui contiendra le score
- protected double score=0;
-
- // un label qui servira à afficher le score
- protected JLabel labScore;
-
-
- //-------------------------------------------------------------------------
- // METHODES
- //-------------------------------------------------------------------------
-
- //-------------------------------------------------------------------------
- // Constructeur de la classe
- //-------------------------------------------------------------------------
- public Jeu(){
- // Gestion du score : a réactiver en fin de TP, inutile au début
-
- labScore = new JLabel();
- labScore.setText("
score : 0
");
- labScore.setBounds(20, 0, 200, 50);
- ecran.add(labScore);
-
- }
-
-
- //-------------------------------------------------------------------------
- // Méthodes qu'il faut implémenter pour être
- // conforme à un KeyListener
- //-------------------------------------------------------------------------
-
- //-------------------------------------------------------------------------
- // Appui sur une touche
- // -> l'événement est émis lorsqu'on appuie, puis selon le rythme de
- // répétition du clavier
- //-------------------------------------------------------------------------
- @Override
- public void keyPressed(KeyEvent e){
- // keyCode 38 : up
- // keyCode 40 : down
- int keyCode = e.getKeyCode();
-
- if (keyCode==38){ // touche "flèche vers le haut"
- // On demande aux deux demi-cercle de "monter"
- demiCercleAvant.Monter();
- demiCercleArriere.Monter();
- }
- }
+ //-------------------------------------------------------------------------
+ // PROPRIETES
+ //-------------------------------------------------------------------------
+ protected ZoneDessin ecran = new ZoneDessin();
+ protected Cercle demiCercleAvant;
+ protected Cercle demiCercleArriere;
+ protected Ligne ligne;
+
+ private int _niv = 1;
+ protected Timer horloge;
+ protected double score = 0;
+ protected JLabel labScore;
- //-------------------------------------------------------------------------
- // Relâchement de la touche
- //-------------------------------------------------------------------------
- @Override
- public void keyReleased(KeyEvent e){
- // keyCode 38 : up
- // keyCode 40 : down
- int keyCode = e.getKeyCode();
-
- if (keyCode==38){
- // On demande aux deux demi-cercle "d'arrêter de monter"
- demiCercleAvant.ArreterMonter();
- demiCercleArriere.ArreterMonter();
- }
- }
+ //-------------------------------------------------------------------------
+ // CONSTRUCTEUR
+ //-------------------------------------------------------------------------
+ public Jeu() {
+ labScore = new JLabel();
+ labScore.setText("score : 0
");
+ labScore.setBounds(20, 0, 200, 50);
+ ecran.add(labScore);
+ }
- //-------------------------------------------------------------------------
- // Une méthode que nous n'utilisons pas
- //-------------------------------------------------------------------------
- @Override
- public void keyTyped(KeyEvent e) {
- // TODO Auto-generated method stub
-
- }
-
- //-------------------------------------------------------------------------
- // Démarrage du jeu :
- // création de diverses instances et
- //-------------------------------------------------------------------------
- public void demarrer(){
- // Création d'une fenêtre
- JFrame fenetre = new JFrame();
-
- // A FAIRE :
- // placer dans l'instance de l'écran tous les objets graphiques nécessaires
- // par exemple : ecran.ajouterObjet(demiCerleArriere);
- ecran.ajouterObjet(demiCercleArriere);
- ecran.ajouterObjet(ligne);
- ecran.ajouterObjet(demiCercleAvant);
+ //-------------------------------------------------------------------------
+ // METHODES DE GESTION DU JEU
+ //-------------------------------------------------------------------------
+ /**
+ * Centralise la création et la configuration des objets du jeu.
+ * Évite de répéter ce code dans demarrer() et resetLevel().
+ */
+ private void initialiserPartie() {
+ // 1. Nettoyage de l'écran
+ ecran.reinitialiser();
+
+ // 2. Création des instances
+ demiCercleAvant = new Cercle(90, -180);
+ demiCercleArriere = new Cercle(90, 180);
+ ligne = new Ligne(_niv);
- // on indique que c'est le jeu qui traitera les appuis sur une touche
- ecran.addKeyListener(this);
- ecran.setFocusable(true);
- fenetre.setContentPane(ecran);
- fenetre.pack();
- fenetre.setLocation(100, 100);
- fenetre.setVisible(true);
- fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ // 3. Configuration visuelle
+ demiCercleArriere.setCouleur(new Color(0.8f, 0.0f, 0.0f));
+ demiCercleAvant.setCouleur(new Color(0.0f, 0.8f, 0.0f));
- // Démarrage du timer, qui rythmera l'animation
- horloge = new Timer(40, this);
- horloge.start();
-
- // A FAIRE :
- // donner la couleur des 2 demi-cercles, par exemple : demiCerleArriere.setCouleur(new Color(0.8f,0.0f,0.0f));
-
- demiCercleArriere.setCouleur(new Color(0.8f,0.0f,0.0f));
- demiCercleAvant.setCouleur(new Color(0.0f,0.8f,0.0f));
- }
+ // 4. Ajout à l'écran (l'ordre définit la superposition)
+ ecran.ajouterObjet(demiCercleArriere);
+ ecran.ajouterObjet(ligne);
+ ecran.ajouterObjet(demiCercleAvant);
+ }
+ public void demarrer() {
+ JFrame fenetre = new JFrame("Linea Game");
+
+ // Initialise les objets une première fois
+ initialiserPartie();
- //-------------------------------------------------------------------------
- // Méthode appelée lorsqu'un événement timer se produit
- //-------------------------------------------------------------------------
- @Override
- public void actionPerformed(ActionEvent e) {
- ecran.traiterBoucleAnimation();
- if (ecran.aCollision()) {
- if (horloge != null) horloge.stop();
- int finalScore = (int) score;
- Object[] options = {"Relancer", "Quitter"};
- int choix = javax.swing.JOptionPane.showOptionDialog(null,
- "Perdu\nScore : " + finalScore,
- "Perdu",
- javax.swing.JOptionPane.DEFAULT_OPTION,
- javax.swing.JOptionPane.INFORMATION_MESSAGE,
- null,
- options,
- options[0]);
- if (choix == 0) { // Relancer
- resetLevel();
- } else {
- System.exit(0);
- }
- return;
- }
- score+=(0.05+(0.05*horloge.getDelay()/100.0));
- labScore.setText("score : "+(int)score+"
");
- }
+ ecran.addKeyListener(this);
+ ecran.setFocusable(true);
+ fenetre.setContentPane(ecran);
+ fenetre.pack();
+ fenetre.setLocation(100, 100);
+ fenetre.setVisible(true);
+ fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- // Réinitialise le niveau : recrée les objets, remet le score et redémarre
- private void resetLevel() {
- if (horloge != null) horloge.stop();
- score = 0;
- labScore.setText("score : 0
");
+ // Création et lancement du timer
+ horloge = new Timer(40, this);
+ horloge.start();
+ }
- // Réinitialiser l'écran (vide la liste des objets et les flags)
- ecran.reinitialiser();
+ private void resetLevel() {
+ // Réinitialisation des variables de jeu
+ score = 0;
+ labScore.setText("score : 0
");
- // recréer les objets
- demiCercleAvant = new Cercle(90, -180);
- demiCercleArriere = new Cercle(90, 180);
- ligne = new Ligne();
+ // Ré-initialisation des objets graphiques
+ initialiserPartie();
- // ré-ajouter les objets
- ecran.ajouterObjet(demiCercleArriere);
- ecran.ajouterObjet(ligne);
- ecran.ajouterObjet(demiCercleAvant);
+ // Relance le timer existant et redonne le focus
+ if (horloge != null) horloge.restart();
+ ecran.requestFocusInWindow();
+ }
- demiCercleArriere.setCouleur(new Color(0.8f,0.0f,0.0f));
- demiCercleAvant.setCouleur(new Color(0.0f,0.8f,0.0f));
+ //-------------------------------------------------------------------------
+ // EVENEMENTS (Timer & Clavier)
+ //-------------------------------------------------------------------------
- // redémarrer l'horloge
- horloge = new Timer(40, this);
- horloge.start();
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ ecran.traiterBoucleAnimation();
- // redonner le focus clavier
- ecran.requestFocusInWindow();
- }
-
-}
+ if (ecran.aCollision()) {
+ horloge.stop();
+
+ Object[] options = {"Relancer", "Quitter"};
+ int choix = JOptionPane.showOptionDialog(null,
+ "Perdu\nScore : " + (int)score,
+ "Game Over",
+ JOptionPane.DEFAULT_OPTION,
+ JOptionPane.INFORMATION_MESSAGE,
+ null, options, options[0]);
+
+ if (choix == 0) resetLevel();
+ else System.exit(0);
+
+ return;
+ }
+
+ // Calcul du score basé sur le temps écoulé
+ score += (0.05 + (0.05 * horloge.getDelay() / 100.0));
+ labScore.setText("score : " + (int)score + "
");
+ }
+
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if (e.getKeyCode() == KeyEvent.VK_UP) {
+ demiCercleAvant.Monter();
+ demiCercleArriere.Monter();
+ }
+ }
+
+ @Override
+ public void keyReleased(KeyEvent e) {
+ if (e.getKeyCode() == KeyEvent.VK_UP) {
+ demiCercleAvant.ArreterMonter();
+ demiCercleArriere.ArreterMonter();
+ }
+ }
+
+ @Override
+ public void keyTyped(KeyEvent e) {}
+}
\ No newline at end of file
diff --git a/linea/Ligne.java b/linea/Ligne.java
index 65487ba..e6a22b6 100644
--- a/linea/Ligne.java
+++ b/linea/Ligne.java
@@ -18,25 +18,61 @@ public class Ligne extends ObjetGraphique{
// facteur qui amplifie la croissance elle-même (pour accélérer la montée)
private double facteurCroissance = 1.00003; // croissance augmente légèrement
+ private int niveau = 1; // niveau de difficulté, à augmenter pour rendre le jeu plus difficile
+
// liste des segments
private ArrayList segments = new ArrayList();
- public Ligne(){
- double x = 800;
- double y = 300;
+ // écran fixe actuellement 800x600 (voir ZoneDessin)
+ private static final int SCREEN_WIDTH = 800;
+ private static final int SCREEN_HEIGHT = 600;
+ private static final int VERTICAL_MARGIN = 20; // éviter de toucher les bords
+
+ public Ligne(int _niveaux){
+ niveau = _niveaux;
+
+ double x = SCREEN_WIDTH; // commence au bord droit
+ double y = SCREEN_HEIGHT/2.0; // milieu vertical
double dx,dy;
+ nbSegments += niveau * 50; // augmenter le nombre de segments avec les niveaux
+
Segment s;
for (int i=0; i maxStep) rawDy = maxStep;
+ if (rawDy < -maxStep) rawDy = -maxStep;
+
+ double tentativeY = y + rawDy;
+ // si on dépasserait les marges, repositionner vers l'intérieur
+ if (tentativeY < VERTICAL_MARGIN) {
+ tentativeY = VERTICAL_MARGIN + Math.random()*10;
+ } else if (tentativeY > SCREEN_HEIGHT - VERTICAL_MARGIN) {
+ tentativeY = SCREEN_HEIGHT - VERTICAL_MARGIN - Math.random()*10;
+ }
+ dy = tentativeY - y;
+ // éviter pente nulle (ligne plate) en forçant un petit mouvement
+ if (Math.abs(dy) < 1.0) {
+ dy = (rawDy < 0 ? -1.0 : 1.0);
+ tentativeY = y + dy;
+ }
+
s = new Segment(x,y,dx,dy);
s.setCouleur(new Color(0.2f,0.2f,0.2f));
-
+
segments.add(s);
-
- x+=dx;
- y+=dy;
+
+ x += dx;
+ y = tentativeY;
}
}
@@ -59,7 +95,7 @@ public class Ligne extends ObjetGraphique{
}
// appliquer la croissance (vitesse *= 1 + croissance)
- vitesse *= (1.0 + croissance);
+ vitesse *= (1.0 + croissance + (niveau * 0.00001)); // augmenter la croissance avec le niveau
// augmenter légèrement la croissance pour que l'accélération s'amplifie
croissance *= facteurCroissance;
}
diff --git a/linea/LineaAppli.java b/linea/LineaAppli.java
index eb40de1..61bd22b 100644
--- a/linea/LineaAppli.java
+++ b/linea/LineaAppli.java
@@ -9,6 +9,5 @@ public class LineaAppli {
Jeu jeu = new Jeu();
jeu.demarrer();
-
}
}