Pair Programming ( merci bamba ) CardLayout
This commit is contained in:
parent
50d9ee2f58
commit
0fdd38bdae
AllScore.javaSendScore.java
bin
controller
AllScore.classGameController.classGameEndListener.classMenuController.classResListener.classSendScore.class
main
model
view
src/main
@ -21,7 +21,7 @@ public class AllScore {
|
|||||||
"jdbc:mariadb://dwarves.iut-fbleau.fr/akagundu",
|
"jdbc:mariadb://dwarves.iut-fbleau.fr/akagundu",
|
||||||
"akagundu", "dersim62Lodek");
|
"akagundu", "dersim62Lodek");
|
||||||
try{
|
try{
|
||||||
PreparedStatement pst = cnx.prepareStatement("SELECT score from score where id_serie=?;");
|
PreparedStatement pst = cnx.prepareStatement("SELECT Score from score where id_serie=?;");
|
||||||
pst.setInt(1, idSerie);
|
pst.setInt(1, idSerie);
|
||||||
ResultSet rs = pst.executeQuery();
|
ResultSet rs = pst.executeQuery();
|
||||||
while(rs.next()) {
|
while(rs.next()) {
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.DriverManager;
|
import java.sql.DriverManager;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
public class SendScore {
|
public class SendScore {
|
||||||
public void insertscore(int idSerie,int score) {
|
public void insertscore(int idSerie,int score) {
|
||||||
@ -18,7 +16,7 @@ public class SendScore {
|
|||||||
"jdbc:mariadb://dwarves.iut-fbleau.fr/akagundu",
|
"jdbc:mariadb://dwarves.iut-fbleau.fr/akagundu",
|
||||||
"akagundu", "dersim62Lodek");
|
"akagundu", "dersim62Lodek");
|
||||||
try{
|
try{
|
||||||
PreparedStatement pst = cnx.prepareStatement("INSERT INTO score (id_serie, score) VALUES (?, ?);");
|
PreparedStatement pst = cnx.prepareStatement("INSERT INTO Score (id_serie, score) VALUES (?, ?);");
|
||||||
pst.setInt(1, idSerie);
|
pst.setInt(1, idSerie);
|
||||||
pst.setInt(2, score);
|
pst.setInt(2, score);
|
||||||
pst.executeUpdate();
|
pst.executeUpdate();
|
||||||
|
BIN
bin/controller/AllScore.class
Normal file
BIN
bin/controller/AllScore.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
bin/controller/GameEndListener.class
Normal file
BIN
bin/controller/GameEndListener.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/controller/SendScore.class
Normal file
BIN
bin/controller/SendScore.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/view/ScoreView$1.class
Normal file
BIN
bin/view/ScoreView$1.class
Normal file
Binary file not shown.
BIN
bin/view/ScoreView.class
Normal file
BIN
bin/view/ScoreView.class
Normal file
Binary file not shown.
@ -1,8 +1,4 @@
|
|||||||
package main;
|
package main;
|
||||||
|
|
||||||
import model.MenuModel;
|
|
||||||
import controller.MenuController;
|
|
||||||
import controller.SeriesSelector;
|
|
||||||
import view.*;
|
import view.*;
|
||||||
|
|
||||||
import javax.sound.sampled.AudioInputStream;
|
import javax.sound.sampled.AudioInputStream;
|
||||||
@ -14,21 +10,9 @@ import java.net.URL;
|
|||||||
public class Main {
|
public class Main {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
SwingUtilities.invokeLater(() -> {
|
SwingUtilities.invokeLater(() -> {
|
||||||
MenuModel model = new MenuModel();
|
MenuView menuView = new MenuView();
|
||||||
MenuView view = new MenuView();
|
App.addView(menuView, App.MENU_VIEW);
|
||||||
|
App.showView(App.MENU_VIEW);
|
||||||
// Initialiser SeriesSelector et le passer à MenuView
|
|
||||||
SeriesSelector seriesSelector = new SeriesSelector();
|
|
||||||
view.setSeriesSelector(seriesSelector);
|
|
||||||
|
|
||||||
// Créer MenuController avec model, view et seriesSelector
|
|
||||||
new MenuController(model, view, seriesSelector);
|
|
||||||
|
|
||||||
JFrame frame = App.getInstance();
|
|
||||||
frame.add(view);
|
|
||||||
frame.setVisible(true);
|
|
||||||
|
|
||||||
PlayMusic("/Music/audio.wav");
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
39
src/main/java/controller/AllScore.java
Normal file
39
src/main/java/controller/AllScore.java
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package controller;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class AllScore {
|
||||||
|
public static ArrayList<Integer> getScoresForSeries(int idSerie) {
|
||||||
|
ArrayList<Integer> scores = new ArrayList<>();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Class.forName("org.mariadb.jdbc.Driver");
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
System.err.println("Erreur : pilote JDBC non trouvé");
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
try (Connection cnx = DriverManager.getConnection(
|
||||||
|
"jdbc:mariadb://dwarves.iut-fbleau.fr/akagundu",
|
||||||
|
"akagundu", "dersim62Lodek")) {
|
||||||
|
try (PreparedStatement pst = cnx.prepareStatement("SELECT score FROM Score WHERE id_serie=? ORDER BY score DESC LIMIT 10")) {
|
||||||
|
pst.setInt(1, idSerie);
|
||||||
|
try (ResultSet rs = pst.executeQuery()) {
|
||||||
|
while (rs.next()) {
|
||||||
|
scores.add(rs.getInt("score"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
System.err.println("Erreur de connexion ou d'exécution de la requête SQL");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return scores;
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,4 @@
|
|||||||
|
// src/main/java/controller/GameController.java
|
||||||
package controller;
|
package controller;
|
||||||
|
|
||||||
import model.Tile;
|
import model.Tile;
|
||||||
@ -20,22 +21,25 @@ public class GameController implements TilePlacer {
|
|||||||
private TileDatabaseManager dbManager;
|
private TileDatabaseManager dbManager;
|
||||||
private List<Tile> currentTiles;
|
private List<Tile> currentTiles;
|
||||||
private int tileIndex;
|
private int tileIndex;
|
||||||
private ScoreGameContext scoreGameContext; // Nouveau contexte pour le score
|
private ScoreGameContext scoreGameContext;
|
||||||
|
|
||||||
public GameController(GameContext gameContext, JPanel gridPanel, HexagonTile nextTilePreview, JLabel scoreLabel) {
|
private int placedTileCount = 0;
|
||||||
|
private int seriesId;
|
||||||
|
private GameEndListener gameEndListener;
|
||||||
|
|
||||||
|
public GameController(GameContext gameContext, JPanel gridPanel, HexagonTile nextTilePreview, JLabel scoreLabel, int seriesId, GameEndListener gameEndListener) {
|
||||||
|
this.seriesId = seriesId;
|
||||||
this.gameContext = gameContext;
|
this.gameContext = gameContext;
|
||||||
this.gridPanel = gridPanel;
|
this.gridPanel = gridPanel;
|
||||||
this.hexagonMap = gameContext.getHexagonMap();
|
this.hexagonMap = gameContext.getHexagonMap();
|
||||||
this.availablePositions = gameContext.getAvailablePositions();
|
this.availablePositions = gameContext.getAvailablePositions();
|
||||||
this.nextTilePreview = nextTilePreview;
|
this.nextTilePreview = nextTilePreview;
|
||||||
|
|
||||||
this.dbManager = new TileDatabaseManager();
|
this.dbManager = new TileDatabaseManager();
|
||||||
this.tileIndex = 0;
|
this.tileIndex = 0;
|
||||||
|
|
||||||
// Initialisation de ScoreGameContext
|
|
||||||
this.scoreGameContext = new ScoreGameContext(gameContext, scoreLabel);
|
this.scoreGameContext = new ScoreGameContext(gameContext, scoreLabel);
|
||||||
|
this.gameEndListener = gameEndListener;
|
||||||
|
|
||||||
loadSeries(1); // Charger la série par défaut (ex. série 1)
|
loadSeries(seriesId);
|
||||||
updatePreview();
|
updatePreview();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,16 +58,12 @@ public class GameController implements TilePlacer {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println("Placement de la tuile avec ID : " + (nextTile != null ? nextTile.getId() : "null") + " à la position : " + position);
|
hexTile.setTile(nextTile);
|
||||||
|
|
||||||
hexTile.setTile(nextTile); // Place la tuile actuelle
|
|
||||||
gridPanel.revalidate();
|
gridPanel.revalidate();
|
||||||
gridPanel.repaint();
|
gridPanel.repaint();
|
||||||
|
|
||||||
availablePositions.remove(position);
|
availablePositions.remove(position);
|
||||||
|
|
||||||
Point[] adjacentPositions = getAdjacentPositions(position);
|
for (Point adj : getAdjacentPositions(position)) {
|
||||||
for (Point adj : adjacentPositions) {
|
|
||||||
if (!hexagonMap.containsKey(adj)) {
|
if (!hexagonMap.containsKey(adj)) {
|
||||||
availablePositions.add(adj);
|
availablePositions.add(adj);
|
||||||
addHexagonTile(adj, gridPanel, 50, null, null);
|
addHexagonTile(adj, gridPanel, 50, null, null);
|
||||||
@ -71,38 +71,43 @@ public class GameController implements TilePlacer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
gameContext.repaintGrid(gridPanel);
|
gameContext.repaintGrid(gridPanel);
|
||||||
generateNextTile(); // Génère la tuile suivante
|
generateNextTile();
|
||||||
|
|
||||||
// Calcul et mise à jour du score
|
|
||||||
scoreGameContext.calculateScore();
|
scoreGameContext.calculateScore();
|
||||||
|
|
||||||
|
placedTileCount++;
|
||||||
|
if (placedTileCount >= 50) {
|
||||||
|
endGame(); // Appeler endGame pour terminer la partie
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void endGame() {
|
||||||
|
int finalScore = scoreGameContext.getScore();
|
||||||
|
|
||||||
|
// Enregistrer le score dans la base de données
|
||||||
|
new SendScore().insertscore(seriesId, finalScore);
|
||||||
|
|
||||||
|
// Notifiez le listener de la fin de la partie
|
||||||
|
if (gameEndListener != null) {
|
||||||
|
gameEndListener.onGameEnd(finalScore);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initializeGame(CameraController cameraController) {
|
public void initializeGame(CameraController cameraController) {
|
||||||
generateNextTile(); // Génère la première tuile et assigne une tuile valide à `nextTile`
|
generateNextTile();
|
||||||
|
Tile initialTile = getNextTile();
|
||||||
Tile initialTile = getNextTile(); // Récupère la tuile générée
|
|
||||||
if (initialTile == null) {
|
if (initialTile == null) {
|
||||||
System.out.println("Erreur : aucune tuile initiale générée.");
|
System.out.println("Erreur : aucune tuile initiale générée.");
|
||||||
return; // Arrête l'initialisation si aucune tuile n'a été générée
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println("ID de la tuile initiale générée : " + initialTile.getId()); // Affiche l'ID de la tuile initiale
|
|
||||||
|
|
||||||
int centerX = gridPanel.getPreferredSize().width / 2;
|
int centerX = gridPanel.getPreferredSize().width / 2;
|
||||||
int centerY = gridPanel.getPreferredSize().height / 2;
|
int centerY = gridPanel.getPreferredSize().height / 2;
|
||||||
|
Point initialPosition = new Point(centerX / 50, centerY / 50);
|
||||||
Point initialPosition = new Point(0, 0);
|
placeInitialTile(initialPosition, cameraController, initialTile);
|
||||||
initialPosition.setLocation(centerX / 50, centerY / 50); // Calcule la position centrale
|
|
||||||
|
|
||||||
placeInitialTile(initialPosition, cameraController, initialTile); // Place la première tuile
|
|
||||||
|
|
||||||
// Calculer et mettre à jour le score incluant la première tuile
|
|
||||||
scoreGameContext.calculateScore();
|
scoreGameContext.calculateScore();
|
||||||
|
generateNextTile();
|
||||||
generateNextTile(); // Génère la tuile suivante
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void placeInitialTile(Point position, CameraController cameraController, Tile tile) {
|
public void placeInitialTile(Point position, CameraController cameraController, Tile tile) {
|
||||||
if (tile == null) {
|
if (tile == null) {
|
||||||
@ -110,16 +115,13 @@ public class GameController implements TilePlacer {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println("Placement de la tuile initiale avec ID : " + tile.getId() + " à la position : " + position);
|
addHexagonTile(position, gridPanel, 50, cameraController, tile);
|
||||||
|
availablePositions.remove(position);
|
||||||
|
|
||||||
addHexagonTile(position, gridPanel, 50, cameraController, tile); // Place la première tuile
|
for (Point adj : getAdjacentPositions(position)) {
|
||||||
availablePositions.remove(position); // Marque la position comme occupée
|
|
||||||
|
|
||||||
Point[] adjacentPositions = getAdjacentPositions(position);
|
|
||||||
for (Point adj : adjacentPositions) {
|
|
||||||
if (!hexagonMap.containsKey(adj)) {
|
if (!hexagonMap.containsKey(adj)) {
|
||||||
availablePositions.add(adj);
|
availablePositions.add(adj);
|
||||||
addHexagonTile(adj, gridPanel, 50, cameraController, null); // Placeholder vide pour les positions adjacentes
|
addHexagonTile(adj, gridPanel, 50, cameraController, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -143,18 +145,15 @@ public class GameController implements TilePlacer {
|
|||||||
yOffset += (int) (Math.sqrt(3) * hexSize / 2);
|
yOffset += (int) (Math.sqrt(3) * hexSize / 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isPlaceholder = (tile == null); // Si tile est null, c'est un placeholder
|
boolean isPlaceholder = (tile == null);
|
||||||
HexagonTile hexTile = new HexagonTile(position, isPlaceholder);
|
HexagonTile hexTile = new HexagonTile(position, isPlaceholder);
|
||||||
|
|
||||||
if (tile != null) {
|
if (tile != null) {
|
||||||
hexTile.setTile(tile);
|
hexTile.setTile(tile);
|
||||||
} else {
|
|
||||||
System.out.println("Aucun tile n'a été fourni pour cette position : " + position);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hexTile.setBounds(xOffset, yOffset, hexSize, hexSize);
|
hexTile.setBounds(xOffset, yOffset, hexSize, hexSize);
|
||||||
hexTile.addMouseListener(new HexagonMouseListener(hexTile, this, availablePositions));
|
hexTile.addMouseListener(new HexagonMouseListener(hexTile, this, availablePositions));
|
||||||
|
|
||||||
hexagonMap.put(position, hexTile);
|
hexagonMap.put(position, hexTile);
|
||||||
panel.add(hexTile);
|
panel.add(hexTile);
|
||||||
panel.revalidate();
|
panel.revalidate();
|
||||||
@ -164,21 +163,19 @@ public class GameController implements TilePlacer {
|
|||||||
public void generateNextTile() {
|
public void generateNextTile() {
|
||||||
if (tileIndex < currentTiles.size()) {
|
if (tileIndex < currentTiles.size()) {
|
||||||
nextTile = currentTiles.get(tileIndex++);
|
nextTile = currentTiles.get(tileIndex++);
|
||||||
System.out.println("Génération de la prochaine tuile avec ID : " + nextTile.getId() + " (index " + tileIndex + ")");
|
updatePreview();
|
||||||
updatePreview(); // Met à jour l'aperçu de la tuile suivante
|
|
||||||
} else {
|
} else {
|
||||||
nextTile = null; // Fin de la série, plus de tuiles à placer
|
nextTile = null;
|
||||||
updatePreview(); // Met à jour l'aperçu pour refléter l'absence de prochaine tuile
|
updatePreview();
|
||||||
System.out.println("Fin de la série. Plus de tuiles à placer.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updatePreview() {
|
private void updatePreview() {
|
||||||
if (nextTilePreview != null) {
|
if (nextTilePreview != null) {
|
||||||
if (nextTile != null) {
|
if (nextTile != null) {
|
||||||
nextTilePreview.setTile(nextTile); // Met à jour avec une tuile valide
|
nextTilePreview.setTile(nextTile);
|
||||||
} else {
|
} else {
|
||||||
nextTilePreview.setTile(null); // Affiche un placeholder ou un message si `nextTile` est null
|
nextTilePreview.setTile(null);
|
||||||
}
|
}
|
||||||
nextTilePreview.repaint();
|
nextTilePreview.repaint();
|
||||||
}
|
}
|
||||||
|
5
src/main/java/controller/GameEndListener.java
Normal file
5
src/main/java/controller/GameEndListener.java
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package controller;
|
||||||
|
|
||||||
|
public interface GameEndListener {
|
||||||
|
void onGameEnd(int finalScore);
|
||||||
|
}
|
@ -1,15 +0,0 @@
|
|||||||
package controller;
|
|
||||||
|
|
||||||
import model.MenuModel;
|
|
||||||
import view.MenuView;
|
|
||||||
|
|
||||||
public class MenuController {
|
|
||||||
|
|
||||||
public MenuController(MenuModel model, MenuView view, SeriesSelector seriesSelector) {
|
|
||||||
// Assignation des action listeners aux boutons du menu
|
|
||||||
view.getQuiButton().addActionListener(new QuiListener()); // Quitte l'application
|
|
||||||
|
|
||||||
// Définir le sélecteur de séries
|
|
||||||
view.setSeriesSelector(seriesSelector);
|
|
||||||
}
|
|
||||||
}
|
|
30
src/main/java/controller/SendScore.java
Normal file
30
src/main/java/controller/SendScore.java
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package controller;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
public class SendScore {
|
||||||
|
public void insertscore(int idSerie, int score) {
|
||||||
|
try {
|
||||||
|
Class.forName("org.mariadb.jdbc.Driver");
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
System.err.println("Erreur : pilote JDBC non trouvé");
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
try (Connection cnx = DriverManager.getConnection(
|
||||||
|
"jdbc:mariadb://dwarves.iut-fbleau.fr/akagundu",
|
||||||
|
"akagundu", "dersim62Lodek")) {
|
||||||
|
try (PreparedStatement pst = cnx.prepareStatement("INSERT INTO Score (id_serie, score) VALUES (?, ?);")) {
|
||||||
|
pst.setInt(1, idSerie);
|
||||||
|
pst.setInt(2, score);
|
||||||
|
pst.executeUpdate();
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
System.err.println("Erreur de connexion ou d'exécution de la requête SQL");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +0,0 @@
|
|||||||
package model;
|
|
||||||
|
|
||||||
|
|
||||||
public class MenuModel {
|
|
||||||
|
|
||||||
public MenuModel() {
|
|
||||||
// rien du tout pour l'instant
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,17 +1,37 @@
|
|||||||
package view;
|
package view;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
public class App {
|
public class App {
|
||||||
|
public static final String MENU_VIEW = "MenuView";
|
||||||
|
public static final String GAME_VIEW = "GameView";
|
||||||
|
public static final String SCORE_VIEW = "ScoreView";
|
||||||
|
|
||||||
private static JFrame frame;
|
private static JFrame frame;
|
||||||
|
private static CardLayout cardLayout;
|
||||||
|
private static JPanel mainPanel;
|
||||||
|
|
||||||
|
static {
|
||||||
|
frame = new JFrame("Application de Jeu");
|
||||||
|
cardLayout = new CardLayout();
|
||||||
|
mainPanel = new JPanel(cardLayout);
|
||||||
|
frame.setContentPane(mainPanel);
|
||||||
|
frame.setSize(1500, 750);
|
||||||
|
frame.setLocationRelativeTo(null);
|
||||||
|
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||||
|
}
|
||||||
|
|
||||||
public static JFrame getInstance() {
|
public static JFrame getInstance() {
|
||||||
if (frame == null) {
|
|
||||||
frame = new JFrame("Menu");
|
|
||||||
frame.setSize(1500, 750);
|
|
||||||
frame.setLocationRelativeTo(null);
|
|
||||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
||||||
}
|
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
public static void addView(JPanel view, String viewName) {
|
||||||
|
mainPanel.add(view, viewName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void showView(String viewName) {
|
||||||
|
cardLayout.show(mainPanel, viewName);
|
||||||
|
frame.setVisible(true);
|
||||||
|
}
|
||||||
|
}
|
@ -1,31 +1,23 @@
|
|||||||
|
// src/main/java/view/GameView.java
|
||||||
package view;
|
package view;
|
||||||
|
|
||||||
import controller.GameController;
|
import controller.*;
|
||||||
import controller.CameraController;
|
|
||||||
import controller.GameContext;
|
|
||||||
import controller.MouseWheelController;
|
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
|
||||||
public class GameView extends JFrame {
|
public class GameView extends JPanel implements GameEndListener {
|
||||||
private JPanel gridPanel;
|
private JPanel gridPanel;
|
||||||
private HexagonTile nextTilePreview;
|
private HexagonTile nextTilePreview;
|
||||||
private GameController gameController;
|
private GameController gameController;
|
||||||
private CameraController cameraController;
|
private CameraController cameraController;
|
||||||
private GameContext gameContext;
|
private GameContext gameContext;
|
||||||
private JLabel scoreLabel;
|
private JLabel scoreLabel;
|
||||||
|
private int seriesId;
|
||||||
// Couleurs pour le style
|
|
||||||
private final Color hoverColor = new Color(200, 150, 100); // Couleur de hover avec transparence
|
|
||||||
private final Color normalColor = new Color(243, 171, 115); // Couleur normale avec transparence
|
|
||||||
|
|
||||||
public GameView(int seriesId) {
|
public GameView(int seriesId) {
|
||||||
setTitle("Jeu de Tuiles");
|
this.seriesId = seriesId;
|
||||||
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
||||||
setLayout(new BorderLayout());
|
setLayout(new BorderLayout());
|
||||||
setSize(1500, 750);
|
|
||||||
setLocationRelativeTo(null);
|
|
||||||
|
|
||||||
gameContext = new GameContext();
|
gameContext = new GameContext();
|
||||||
gridPanel = createHexagonGrid();
|
gridPanel = createHexagonGrid();
|
||||||
@ -34,27 +26,39 @@ public class GameView extends JFrame {
|
|||||||
|
|
||||||
nextTilePreview = new HexagonTile(null, false);
|
nextTilePreview = new HexagonTile(null, false);
|
||||||
scoreLabel = new JLabel("Score: 0");
|
scoreLabel = new JLabel("Score: 0");
|
||||||
scoreLabel.setForeground(Color.BLACK); // Texte noir pour contraste
|
scoreLabel.setForeground(Color.BLACK);
|
||||||
|
|
||||||
JPanel controlPanel = createControlPanel();
|
JPanel controlPanel = createControlPanel();
|
||||||
controlPanel.setPreferredSize(new Dimension(200, 600));
|
controlPanel.setPreferredSize(new Dimension(200, getPreferredSize().height));
|
||||||
add(controlPanel, BorderLayout.EAST);
|
add(controlPanel, BorderLayout.EAST);
|
||||||
|
|
||||||
gameController = new GameController(gameContext, gridPanel, nextTilePreview, scoreLabel);
|
gameController = new GameController(gameContext, gridPanel, nextTilePreview, scoreLabel, seriesId, this);
|
||||||
gameController.loadSeries(seriesId); // Charge la série
|
gameController.loadSeries(seriesId);
|
||||||
cameraController = new CameraController(gridPanel, gameContext);
|
cameraController = new CameraController(gridPanel, gameContext);
|
||||||
|
|
||||||
MouseWheelController wheelController = new MouseWheelController(nextTilePreview, gameController);
|
MouseWheelController wheelController = new MouseWheelController(nextTilePreview, gameController);
|
||||||
addMouseWheelListener(wheelController);
|
addMouseWheelListener(wheelController);
|
||||||
|
|
||||||
gameController.initializeGame(cameraController);
|
gameController.initializeGame(cameraController);
|
||||||
setVisible(true);
|
|
||||||
|
JButton backButton = new JButton("Retour");
|
||||||
|
backButton.setPreferredSize(new Dimension(100, 40));
|
||||||
|
backButton.setBackground(new Color(202, 146, 104));
|
||||||
|
backButton.setForeground(Color.BLACK);
|
||||||
|
backButton.setFocusPainted(false);
|
||||||
|
backButton.setBorderPainted(false);
|
||||||
|
|
||||||
|
backButton.addActionListener(e -> {
|
||||||
|
App.showView(App.MENU_VIEW);
|
||||||
|
});
|
||||||
|
|
||||||
|
controlPanel.add(backButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
private JPanel createHexagonGrid() {
|
private JPanel createHexagonGrid() {
|
||||||
JPanel panel = new JPanel();
|
JPanel panel = new JPanel();
|
||||||
panel.setLayout(null);
|
panel.setLayout(null);
|
||||||
panel.setBackground(normalColor); // Couleur de fond de la grille
|
panel.setBackground(new Color(243, 171, 115));
|
||||||
panel.setPreferredSize(new Dimension(800, 800));
|
panel.setPreferredSize(new Dimension(800, 800));
|
||||||
return panel;
|
return panel;
|
||||||
}
|
}
|
||||||
@ -69,16 +73,16 @@ public class GameView extends JFrame {
|
|||||||
private JPanel createControlPanel() {
|
private JPanel createControlPanel() {
|
||||||
JPanel panel = new JPanel();
|
JPanel panel = new JPanel();
|
||||||
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
|
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
|
||||||
panel.setBackground(normalColor); // Couleur normale pour le panneau de contrôle
|
panel.setBackground(new Color(243, 171, 115));
|
||||||
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
|
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
|
||||||
|
|
||||||
JLabel nextTileLabel = new JLabel("Prochaine tuile : ");
|
JLabel nextTileLabel = new JLabel("Prochaine tuile : ");
|
||||||
nextTileLabel.setForeground(Color.BLACK); // Texte noir pour contraste
|
nextTileLabel.setForeground(Color.BLACK);
|
||||||
panel.add(nextTileLabel);
|
panel.add(nextTileLabel);
|
||||||
panel.add(Box.createRigidArea(new Dimension(0, 10)));
|
panel.add(Box.createRigidArea(new Dimension(0, 10)));
|
||||||
|
|
||||||
nextTilePreview.setPreferredSize(new Dimension(150, 150));
|
nextTilePreview.setPreferredSize(new Dimension(150, 150));
|
||||||
nextTilePreview.setBackground(hoverColor); // Couleur hover pour différencier
|
nextTilePreview.setBackground(new Color(200, 150, 100));
|
||||||
nextTilePreview.setOpaque(true);
|
nextTilePreview.setOpaque(true);
|
||||||
panel.add(nextTilePreview);
|
panel.add(nextTilePreview);
|
||||||
|
|
||||||
@ -87,4 +91,13 @@ public class GameView extends JFrame {
|
|||||||
|
|
||||||
return panel;
|
return panel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onGameEnd(int finalScore) {
|
||||||
|
SwingUtilities.invokeLater(() -> {
|
||||||
|
ScoreView scoreView = new ScoreView(seriesId, finalScore);
|
||||||
|
App.addView(scoreView, App.SCORE_VIEW);
|
||||||
|
App.showView(App.SCORE_VIEW);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
package view;
|
package view;
|
||||||
|
|
||||||
|
import controller.SeriesSelector;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import controller.SeriesSelector;
|
|
||||||
|
|
||||||
public class MenuView extends JComponent {
|
public class MenuView extends JPanel {
|
||||||
|
|
||||||
private BtnPerso resumeButton;
|
private BtnPerso resumeButton;
|
||||||
private BtnPerso newGameButton;
|
private BtnPerso newGameButton;
|
||||||
@ -18,7 +19,7 @@ public class MenuView extends JComponent {
|
|||||||
private Image backgroundImage;
|
private Image backgroundImage;
|
||||||
private ImageIcon logo;
|
private ImageIcon logo;
|
||||||
private ImageIcon quit;
|
private ImageIcon quit;
|
||||||
private JLabel labelImg; // Déclaration de labelImg
|
private JLabel labelImg;
|
||||||
|
|
||||||
public MenuView() {
|
public MenuView() {
|
||||||
initMenu();
|
initMenu();
|
||||||
@ -51,68 +52,56 @@ public class MenuView extends JComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void initMenu() {
|
private void initMenu() {
|
||||||
// Initialisation du panneau latéral
|
|
||||||
panelCote = new JPanel(new GridBagLayout());
|
panelCote = new JPanel(new GridBagLayout());
|
||||||
GridBagConstraints gbc = new GridBagConstraints();
|
GridBagConstraints gbc = new GridBagConstraints();
|
||||||
panelCote.setBackground(new Color(243, 171, 115, 150));
|
panelCote.setBackground(new Color(243, 171, 115, 150));
|
||||||
panelCote.setPreferredSize(new Dimension(300, 0));
|
panelCote.setPreferredSize(new Dimension(300, 0));
|
||||||
|
|
||||||
// Charger les images
|
|
||||||
backgroundImage = new ImageIcon(getClass().getResource("/java/view/img/bg.png")).getImage();
|
backgroundImage = new ImageIcon(getClass().getResource("/java/view/img/bg.png")).getImage();
|
||||||
logo = new ImageIcon(getClass().getResource("/java/view/img/D.png"));
|
logo = new ImageIcon(getClass().getResource("/java/view/img/D.png"));
|
||||||
quit = new ImageIcon(getClass().getResource("/java/view/img/quit.png"));
|
quit = new ImageIcon(getClass().getResource("/java/view/img/quit.png"));
|
||||||
|
|
||||||
// Redimensionnement des images
|
|
||||||
Image quit1 = quit.getImage();
|
Image quit1 = quit.getImage();
|
||||||
Image lg = logo.getImage();
|
Image lg = logo.getImage();
|
||||||
Image resizedlg = lg.getScaledInstance(300, 300, Image.SCALE_SMOOTH);
|
Image resizedlg = lg.getScaledInstance(300, 300, Image.SCALE_SMOOTH);
|
||||||
labelImg = new JLabel(new ImageIcon(resizedlg)); // Initialisation de labelImg
|
labelImg = new JLabel(new ImageIcon(resizedlg));
|
||||||
|
|
||||||
// Configuration du bouton "Quitter" avec une icône redimensionnée
|
|
||||||
int buttonWidth = 65;
|
int buttonWidth = 65;
|
||||||
int buttonHeight = 40;
|
int buttonHeight = 40;
|
||||||
Image resizedImage = quit1.getScaledInstance(buttonWidth, buttonHeight, Image.SCALE_SMOOTH);
|
Image resizedImage = quit1.getScaledInstance(buttonWidth, buttonHeight, Image.SCALE_SMOOTH);
|
||||||
ImageIcon resizedIcon = new ImageIcon(resizedImage);
|
ImageIcon resizedIcon = new ImageIcon(resizedImage);
|
||||||
|
|
||||||
// Boutons
|
|
||||||
resumeButton = new BtnPerso("JOUER");
|
resumeButton = new BtnPerso("JOUER");
|
||||||
newGameButton = new BtnPerso("COMMENT JOUER");
|
newGameButton = new BtnPerso("COMMENT JOUER");
|
||||||
quitButton = new JButton(resizedIcon);
|
quitButton = new JButton(resizedIcon);
|
||||||
|
|
||||||
// Configurer le bouton "Quitter" pour enlever le fond et la bordure
|
|
||||||
quitButton.setPreferredSize(new Dimension(buttonWidth, buttonHeight));
|
quitButton.setPreferredSize(new Dimension(buttonWidth, buttonHeight));
|
||||||
quitButton.setBackground(new Color(243, 171, 115, 150)); // Fond transparent similaire
|
quitButton.setBackground(new Color(243, 171, 115, 150));
|
||||||
quitButton.setBorderPainted(false); // Enlever la bordure pour un look plus propre
|
quitButton.setBorderPainted(false);
|
||||||
quitButton.setOpaque(true); // Rendre le fond visible
|
quitButton.setOpaque(true);
|
||||||
quitButton.setFocusPainted(false); // Enlever le focus autour du bouton
|
quitButton.setFocusPainted(false);
|
||||||
|
|
||||||
// Ajout des listeners pour les boutons
|
|
||||||
resumeButton.addActionListener(e -> showSeriesButtons());
|
resumeButton.addActionListener(e -> showSeriesButtons());
|
||||||
newGameButton.addActionListener(e -> toggleHowToPlay());
|
newGameButton.addActionListener(e -> toggleHowToPlay());
|
||||||
|
|
||||||
// Créer le panneau "Comment jouer" et le panneau de séries
|
|
||||||
howToPlayPanel = createHowToPlayPanel();
|
howToPlayPanel = createHowToPlayPanel();
|
||||||
howToPlayPanel.setVisible(false);
|
howToPlayPanel.setVisible(false);
|
||||||
|
|
||||||
seriesPanel = createSeriesPanel();
|
seriesPanel = createSeriesPanel();
|
||||||
seriesPanel.setVisible(false);
|
seriesPanel.setVisible(false);
|
||||||
|
|
||||||
// Panneau centré pour le contenu dynamique
|
|
||||||
centeredPanel = new JPanel(new GridBagLayout());
|
centeredPanel = new JPanel(new GridBagLayout());
|
||||||
centeredPanel.setOpaque(false);
|
centeredPanel.setOpaque(false);
|
||||||
centeredPanel.add(howToPlayPanel);
|
centeredPanel.add(howToPlayPanel);
|
||||||
|
|
||||||
// Ajout des composants au panneau latéral
|
|
||||||
gbc.fill = GridBagConstraints.HORIZONTAL;
|
gbc.fill = GridBagConstraints.HORIZONTAL;
|
||||||
gbc.insets = new Insets(10, 10, 10, 10);
|
gbc.insets = new Insets(10, 10, 10, 10);
|
||||||
gbc.weightx = 1.0;
|
gbc.weightx = 1.0;
|
||||||
gbc.gridx = 0;
|
gbc.gridx = 0;
|
||||||
|
|
||||||
// Ajouter l'image de logo
|
|
||||||
gbc.gridy = 0;
|
gbc.gridy = 0;
|
||||||
panelCote.add(labelImg, gbc); // Ajout de labelImg ici
|
panelCote.add(labelImg, gbc);
|
||||||
|
|
||||||
// Ajouter les boutons
|
|
||||||
gbc.gridy = 1;
|
gbc.gridy = 1;
|
||||||
panelCote.add(resumeButton, gbc);
|
panelCote.add(resumeButton, gbc);
|
||||||
|
|
||||||
@ -164,6 +153,9 @@ public class MenuView extends JComponent {
|
|||||||
int seriesId = i;
|
int seriesId = i;
|
||||||
BtnPerso seriesButton = new BtnPerso("Série " + seriesId);
|
BtnPerso seriesButton = new BtnPerso("Série " + seriesId);
|
||||||
seriesButton.addActionListener(e -> {
|
seriesButton.addActionListener(e -> {
|
||||||
|
GameView gameView = new GameView(seriesId);
|
||||||
|
App.addView(gameView, App.GAME_VIEW);
|
||||||
|
App.showView(App.GAME_VIEW);
|
||||||
if (seriesSelector != null) {
|
if (seriesSelector != null) {
|
||||||
seriesSelector.startGameWithSeries(seriesId);
|
seriesSelector.startGameWithSeries(seriesId);
|
||||||
}
|
}
|
||||||
@ -180,16 +172,4 @@ public class MenuView extends JComponent {
|
|||||||
super.paintComponent(g);
|
super.paintComponent(g);
|
||||||
g.drawImage(backgroundImage, 0, 0, getWidth(), getHeight(), this);
|
g.drawImage(backgroundImage, 0, 0, getWidth(), getHeight(), this);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
public BtnPerso getResumeButton() {
|
|
||||||
return resumeButton;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BtnPerso getNewGameButton() {
|
|
||||||
return newGameButton;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JButton getQuiButton() {
|
|
||||||
return quitButton;
|
|
||||||
}
|
|
||||||
}
|
|
90
src/main/java/view/ScoreView.java
Normal file
90
src/main/java/view/ScoreView.java
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
// src/main/java/view/ScoreView.java
|
||||||
|
package view;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import controller.AllScore;
|
||||||
|
|
||||||
|
public class ScoreView extends JPanel {
|
||||||
|
private int seriesId;
|
||||||
|
private int finalScore;
|
||||||
|
private final Color hoverColor = new Color(200, 150, 100,150);
|
||||||
|
private final Color normalColor = new Color(243, 171, 115, 150); // Couleur avec transparence
|
||||||
|
|
||||||
|
public ScoreView(int seriesId, int finalScore) {
|
||||||
|
this.seriesId = seriesId;
|
||||||
|
this.finalScore = finalScore;
|
||||||
|
initScoreView();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initScoreView() {
|
||||||
|
setLayout(new BorderLayout());
|
||||||
|
setBackground(normalColor);
|
||||||
|
|
||||||
|
// Titre de la vue de score
|
||||||
|
JLabel title = new JLabel("Fin de la Partie", JLabel.CENTER);
|
||||||
|
title.setFont(new Font("Helvetica", Font.BOLD, 30));
|
||||||
|
add(title, BorderLayout.NORTH);
|
||||||
|
|
||||||
|
// Affichage du score actuel de la partie
|
||||||
|
JLabel scoreLabel = new JLabel("Votre Score : " + finalScore, JLabel.CENTER);
|
||||||
|
scoreLabel.setFont(new Font("Helvetica", Font.PLAIN, 20));
|
||||||
|
add(scoreLabel, BorderLayout.CENTER);
|
||||||
|
|
||||||
|
// Panneau des scores du top 10
|
||||||
|
JPanel topScoresPanel = new JPanel();
|
||||||
|
topScoresPanel.setLayout(new BoxLayout(topScoresPanel, BoxLayout.Y_AXIS));
|
||||||
|
topScoresPanel.setBorder(BorderFactory.createTitledBorder("Top 10 des Scores"));
|
||||||
|
topScoresPanel.setBackground(normalColor);
|
||||||
|
|
||||||
|
ArrayList<Integer> scores = AllScore.getScoresForSeries(seriesId);
|
||||||
|
Collections.sort(scores, Collections.reverseOrder());
|
||||||
|
scores = new ArrayList<>(scores.subList(0, Math.min(10, scores.size())));
|
||||||
|
|
||||||
|
for (Integer score : scores) {
|
||||||
|
JLabel scoreItem = new JLabel(score.toString(), JLabel.CENTER);
|
||||||
|
scoreItem.setFont(new Font("Helvetica", Font.PLAIN, 18));
|
||||||
|
scoreItem.setAlignmentX(Component.CENTER_ALIGNMENT);
|
||||||
|
|
||||||
|
// Marquer le score final en couleur spéciale
|
||||||
|
if (score == finalScore) {
|
||||||
|
scoreItem.setForeground(new Color(128, 0, 128)); // Violet pour le score actuel
|
||||||
|
} else {
|
||||||
|
scoreItem.setForeground(Color.BLACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
topScoresPanel.add(scoreItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
add(topScoresPanel, BorderLayout.CENTER);
|
||||||
|
|
||||||
|
// Bouton de retour au menu
|
||||||
|
BtnPerso backButton = new BtnPerso("Retour au Menu");
|
||||||
|
backButton.addActionListener(e -> App.showView(App.MENU_VIEW));
|
||||||
|
backButton.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||||
|
public void mouseEntered(java.awt.event.MouseEvent evt) {
|
||||||
|
backButton.setBackground(hoverColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void mouseExited(java.awt.event.MouseEvent evt) {
|
||||||
|
backButton.setBackground(normalColor);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Panneau de score actuel
|
||||||
|
JPanel currentScorePanel = new JPanel();
|
||||||
|
currentScorePanel.setBackground(normalColor);
|
||||||
|
JLabel currentScoreLabel = new JLabel("Score Actuel : " + finalScore);
|
||||||
|
currentScoreLabel.setFont(new Font("Helvetica", Font.BOLD, 22));
|
||||||
|
currentScorePanel.add(currentScoreLabel);
|
||||||
|
|
||||||
|
// Ajouter le panneau de score actuel et le bouton de retour
|
||||||
|
JPanel southPanel = new JPanel(new BorderLayout());
|
||||||
|
southPanel.add(currentScorePanel, BorderLayout.NORTH);
|
||||||
|
southPanel.add(backButton, BorderLayout.SOUTH);
|
||||||
|
|
||||||
|
add(southPanel, BorderLayout.SOUTH);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user