ajout d'un compteur de lignes supprimée et d'un bouton pour quitter l'application

This commit is contained in:
ROGER
2025-05-15 12:36:02 +02:00
parent 43037c4174
commit 309eeea534
18 changed files with 422 additions and 20 deletions

View File

@@ -23,6 +23,10 @@ dependencies {
// This dependency is used by the application.
implementation(libs.guava)
// 🔊 JLayer pour lire les fichiers MP3
implementation("javazoom:jlayer:1.0.1")
}
// Apply a specific Java toolchain to ease working on different environments.

View File

@@ -14,7 +14,5 @@ public class App {
Grille grille = new Grille(10, 10);
//VueGrille vueGrille = new VueGrille(grille);
VueTetris vueTetris = new VueTetris(grille);
}
}

View File

@@ -0,0 +1,50 @@
package org.Controlers;
import org.Models.Musique;
import org.Views.VueControle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TetrisControleur {
private boolean partieEnPause = false;
private boolean partieTerminee = false;
private Musique musique;
private VueControle vueControle;
public TetrisControleur(VueControle vueControle) {
this.vueControle = vueControle;
this.musique = new Musique();
musique.start();//demarer musique
//action play/pause
this.vueControle.getPauseButton().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
switchPlayPause();
}
});
vueControle.getQuitterButton().addActionListener(e -> {
System.out.println("Fermeture de l'application...");
System.exit(0);
});
}
public void switchPlayPause() {
if (partieTerminee) {
return;
}
partieEnPause = !partieEnPause;
musique.basculePlayPause();
vueControle.getPauseButton().setText(partieEnPause ? "PLAY" : "PAUSE");
System.out.println(partieEnPause ? "Partie en pause" : "Partie en cours");
}
public void setPartieTerminee() {
partieTerminee = true;
musique.arreterMusique();
vueControle.getPauseButton().setEnabled(false);
System.out.println("Partie terminée");
}
}

View File

@@ -0,0 +1,52 @@
package org.Models;
import javazoom.jl.player.Player;
import java.io.BufferedInputStream;
import java.io.InputStream;
public class Musique extends Thread{
private Player player;
private boolean stop = false;
private boolean enPause = false;
public void run(){
while (!stop) {
try {
if (!enPause) {
InputStream musique = getClass().getResourceAsStream("/TetrisMusic.mp3");
//System.out.println(musique != null ? "Musique trouvée" : "Musique introuvable");
if (musique == null) {
System.err.println("Erreur : le fichier musique.mp3 est introuvable.");
return;
}
BufferedInputStream buffer = new BufferedInputStream(musique);
player = new Player(buffer);
player.play();
} else {
Thread.sleep(1000); // Attendre 1 seconde avant de vérifier à nouveau
}
} catch (Exception e) {
System.err.println("Erreur lors de la lecture de la musique : " + e.getMessage());
}
}
}
public void basculePlayPause() {
if (enPause) {
enPause = false;
} else {
enPause = true;
if (player != null) {
player.close();
}
}
}
public void arreterMusique() {
stop = true;
if (player != null) {
player.close();
}
}
}

View File

@@ -0,0 +1,17 @@
package org.Models;
public class PieceI extends PieceCourante {
public PieceI(){
super();
this.motif[0][1] = true;
this.motif[1][1] = true;
this.motif[2][1] = true;
this.motif[3][1] = true;
}
@Override
public boolean[][] getMotif() {
return super.getMotif();
}
}

View File

@@ -0,0 +1,17 @@
package org.Models;
public class PieceJ extends PieceCourante {
public PieceJ(){
super();
this.motif[0][2] = true;
this.motif[1][2] = true;
this.motif[2][2] = true;
this.motif[2][1] = true;
}
@Override
public boolean[][] getMotif() {
return super.getMotif();
}
}

View File

@@ -4,10 +4,11 @@ public class PieceL extends PieceCourante {
public PieceL(){
super();
this.motif[1][0] = true;
this.motif[2][0] = true;
this.motif[3][0] = true;
this.motif[3][1] = true;
this.motif[0][1] = true;
this.motif[1][1] = true;
this.motif[2][1] = true;
this.motif[2][2] = true;
}
@Override

View File

@@ -0,0 +1,16 @@
package org.Models;
public class PieceO extends PieceCourante{
public PieceO(){
super();
this.motif[0][1] = true;
this.motif[0][2] = true;
this.motif[1][1] = true;
this.motif[1][2] = true;
}
@Override
public boolean[][] getMotif() {
return super.getMotif();
}
}

View File

@@ -0,0 +1,17 @@
package org.Models;
public class PieceS extends PieceCourante {
public PieceS(){
super();
this.motif[0][1] = true;
this.motif[1][1] = true;
this.motif[1][2] = true;
this.motif[2][2] = true;
}
@Override
public boolean[][] getMotif() {
return super.getMotif();
}
}

View File

@@ -0,0 +1,17 @@
package org.Models;
public class PieceT extends PieceCourante {
public PieceT(){
super();
this.motif[0][1] = true;
this.motif[1][1] = true;
this.motif[2][1] = true;
this.motif[1][2] = true;
}
@Override
public boolean[][] getMotif() {
return super.getMotif();
}
}

View File

@@ -0,0 +1,17 @@
package org.Models;
public class PieceZ extends PieceCourante {
public PieceZ(){
super();
this.motif[0][2] = true;
this.motif[1][2] = true;
this.motif[1][1] = true;
this.motif[2][1] = true;
}
@Override
public boolean[][] getMotif() {
return super.getMotif();
}
}

View File

@@ -10,6 +10,8 @@ public class VueControle extends JPanel {
private JPanel nextPiecePanel;
private JButton pauseButton;
private JPanel[][] caseNextPiece = new JPanel[4][4];
private JLabel nbLigneLabel;
private JButton quitterButton;
public VueControle() {
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
@@ -17,11 +19,17 @@ public class VueControle extends JPanel {
setPreferredSize(new Dimension(200, 600));
//SCORE
scoreLabel = new JLabel("Score: 0");
scoreLabel = new JLabel("SCORE : 0");
scoreLabel.setForeground(Color.white);
scoreLabel.setFont(new Font("Arial", Font.PLAIN, 16));
scoreLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
//NB LIGNE
nbLigneLabel = new JLabel("LIGNES : 0");
nbLigneLabel.setForeground(Color.white);
nbLigneLabel.setFont(new Font("Arial", Font.PLAIN, 16));
nbLigneLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
//NEXT PIECE
nextPiecePanel = new JPanel();
nextPiecePanel.setPreferredSize(new Dimension(100, 100));
@@ -30,16 +38,24 @@ public class VueControle extends JPanel {
nextPiecePanel.setAlignmentX(Component.CENTER_ALIGNMENT);
initierNextPiecePanel();
//PAUSE BUTTON
pauseButton = new JButton("Pause / Play");
pauseButton.setAlignmentX(Component.CENTER_ALIGNMENT);
//PAUSE BUTTON & QUIT BUTTON
pauseButton = new JButton("PAUSE");
quitterButton = new JButton("QUITTER");
JPanel boutonsPanel = new JPanel();
boutonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 0));
boutonsPanel.setOpaque(false);
boutonsPanel.add(pauseButton);
boutonsPanel.add(quitterButton);
add(Box.createVerticalStrut(20)); // Add some space at the top
add(Box.createVerticalStrut(20));
add(scoreLabel);
add(Box.createVerticalStrut(20)); // Add some space between score and next piece
add(Box.createVerticalStrut(20));
add(nbLigneLabel);
add(Box.createVerticalStrut(20));
add(nextPiecePanel);
add(Box.createVerticalStrut(20)); // Add some space between next piece and button
add(pauseButton);
add(Box.createVerticalStrut(20));
add(boutonsPanel);
//setVisible(true);
}
@@ -52,6 +68,10 @@ public class VueControle extends JPanel {
return pauseButton;
}
public JButton getQuitterButton() {
return quitterButton;
}
public JPanel getNextPiecePanel() {
return nextPiecePanel;
}

View File

@@ -1,8 +1,7 @@
package org.Views;
import org.Models.Grille;
import org.Models.PieceCourante;
import org.Models.PieceL;
import org.Controlers.TetrisControleur;
import org.Models.*;
import javax.swing.*;
import java.awt.*;
@@ -13,6 +12,7 @@ public class VueTetris extends JFrame {
VueGrille vueGrille = new VueGrille(grille);
VueControle vueControle = new VueControle();
TetrisControleur controleur = new TetrisControleur(vueControle);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
@@ -25,7 +25,7 @@ public class VueTetris extends JFrame {
setVisible(true);
// Utilisation de la pièce L
PieceCourante pieceL = new PieceL();
vueControle.afficherPieceSuivante(pieceL);
PieceCourante pieceT = new PieceT();
vueControle.afficherPieceSuivante(pieceT);
}
}

Binary file not shown.