Projet
This commit is contained in:
commit
5c0578eacd
140
Block.java
Normal file
140
Block.java
Normal file
@ -0,0 +1,140 @@
|
||||
/**
|
||||
* La classe <code>Block</code> est utilisée pour créer les blocs
|
||||
*
|
||||
* @version 0.1
|
||||
* @author Adil HAMMERSCHMIDT & Lucas GRANDJEAN
|
||||
*/
|
||||
|
||||
import java.awt.*;
|
||||
import javax.swing.*;
|
||||
|
||||
|
||||
public class Block extends JPanel {
|
||||
private int column;
|
||||
private int line;
|
||||
private char color;
|
||||
private int status;
|
||||
|
||||
/**
|
||||
* Constructeur uniquement destiné à la création des variables publiques.
|
||||
*
|
||||
* @param blockColumn le numéro de la colonne où se trouve le bloc
|
||||
* @param blockLine le numéro de la ligne où se trouve le bloc
|
||||
* @param blockColor la couleur du bloc
|
||||
*/
|
||||
public Block(int blockColumn, int blockLine, char blockColor) {
|
||||
super();
|
||||
this.column = blockColumn;
|
||||
this.line = blockLine;
|
||||
this.color = blockColor;
|
||||
this.status = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renvoie le numéro de colonne du bloc
|
||||
*
|
||||
* @return Renvoie le numéro de colonne du bloc (de 0 à 14)
|
||||
*/
|
||||
public int getColumn() {
|
||||
return this.column;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renvoie le numéro de ligne du bloc
|
||||
*
|
||||
* @return Renvoie le numéro de ligne du bloc (de 0 à 9)
|
||||
*/
|
||||
public int getLine() {
|
||||
return this.line;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renvoie la couleur du bloc
|
||||
*
|
||||
* @return Renvoie la couleur du bloc ('R', 'V' ou 'B')
|
||||
*/
|
||||
public char getColor() {
|
||||
return this.color;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renvoie le status
|
||||
*
|
||||
* @return Renvoie le status du bloc (1 ou 0)
|
||||
*/
|
||||
public int getStatus() {
|
||||
return this.status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Modifie le numéro de colonne du bloc
|
||||
*
|
||||
* @param blockColumn le numéro de la colonne que l'on souhaite affecter au bloc (de 0 à 14)
|
||||
*/
|
||||
public void setColumn(int blockColumn) {
|
||||
this.column = blockColumn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Modifie le numéro de ligne du bloc
|
||||
*
|
||||
* @param blockLine le numéro de la ligne que l'on souhaite affecter au bloc (de 0 à 9)
|
||||
*/
|
||||
public void setLine(int blockLine) {
|
||||
this.line = blockLine;
|
||||
}
|
||||
|
||||
/**
|
||||
* Modifie la couleur du bloc
|
||||
*
|
||||
* @param blockColor la couleur que l'on souhaite affecter au bloc ('R', 'V' ou 'B')
|
||||
*/
|
||||
public void setColor(char blockColor) {
|
||||
this.color = blockColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Modifie le status du bloc
|
||||
*
|
||||
* @param blockStatus le status que l'on souhaite affecter au bloc (1 ou 0)
|
||||
*/
|
||||
public void setStatus(int blockStatus) {
|
||||
this.status = blockStatus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Actualise les graphiques du block
|
||||
*/
|
||||
@Override
|
||||
public void paintComponent(Graphics g) {
|
||||
if (this.isOpaque()) {
|
||||
g.setColor(this.getBackground());
|
||||
g.fillRect(0, 0, this.getWidth(), this.getHeight());
|
||||
}
|
||||
if(this.status == 1) {
|
||||
|
||||
if(this.color == 'R') {
|
||||
Image img = getToolkit().getImage(this.getClass().getResource("/img/rouge.png"));
|
||||
g.drawImage(img, 0, 0, this);
|
||||
}
|
||||
|
||||
else if(this.color=='V') {
|
||||
Image img = getToolkit().getImage(this.getClass().getResource("/img/vert.png"));
|
||||
|
||||
g.drawImage(img, 0, 0, this);
|
||||
}
|
||||
|
||||
else if(this.color=='B') {
|
||||
Image img = getToolkit().getImage(this.getClass().getResource("/img/bleu.png"));
|
||||
g.drawImage(img, 0, 0, this);
|
||||
}
|
||||
}
|
||||
else {
|
||||
g.setColor(Color.WHITE);
|
||||
g.drawOval(0, 0, 50, 50);
|
||||
g.fillOval(0, 0, 50, 50);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
44
FinalScreen.java
Normal file
44
FinalScreen.java
Normal file
@ -0,0 +1,44 @@
|
||||
/**
|
||||
* La classe <code>FinalScreen</code> est utilisée pour afficher l'écran de fin de partie
|
||||
*
|
||||
* @version 0.1
|
||||
* @author Adil HAMMERSCHMIDT & Lucas GRANDJEAN
|
||||
*/
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
public class FinalScreen extends JFrame {
|
||||
/**
|
||||
* Constructeur déstiné à créer l'écran de fin.
|
||||
*
|
||||
* @param gameInstance l'instance de jeu
|
||||
*/
|
||||
public FinalScreen(int score) {
|
||||
FinalScreenListener fsListener = new FinalScreenListener(this);
|
||||
|
||||
JPanel scorePanel = new JPanel();
|
||||
JLabel scoreLabel = new JLabel("Votre score : " + String.valueOf(score));
|
||||
|
||||
scorePanel.add(scoreLabel, JPanel.CENTER_ALIGNMENT);
|
||||
|
||||
JPanel p = new JPanel();
|
||||
p.setLayout(new GridLayout(1,2));
|
||||
|
||||
JButton restartBtn = new JButton("Revenir");
|
||||
JButton exitBtn = new JButton("Quitter");
|
||||
|
||||
restartBtn.addActionListener(fsListener);
|
||||
exitBtn.addActionListener(fsListener);
|
||||
|
||||
scorePanel.add(scoreLabel);
|
||||
p.add(restartBtn);
|
||||
p.add(exitBtn);
|
||||
|
||||
this.add(scorePanel, BorderLayout.NORTH);
|
||||
this.add(p);
|
||||
this.setPreferredSize(new Dimension(300, 300));
|
||||
this.pack();
|
||||
this.setLocationRelativeTo(null);
|
||||
this.setVisible(true);
|
||||
}
|
||||
}
|
33
FinalScreenListener.java
Normal file
33
FinalScreenListener.java
Normal file
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* La classe <code>FinalScreenListener</code> est utilisée pour donner un rôle aux boutons de l'écran de fin
|
||||
*
|
||||
* @version 0.1
|
||||
* @author Adil HAMMERSCHMIDT & Lucas GRANDJEAN
|
||||
*/
|
||||
import java.awt.event.*;
|
||||
import javax.swing.JFrame;
|
||||
|
||||
public class FinalScreenListener implements ActionListener {
|
||||
|
||||
private JFrame fsFrame;
|
||||
|
||||
public FinalScreenListener(JFrame fsFrame) {
|
||||
this.fsFrame = fsFrame;
|
||||
}
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
// On récupère l'action afin d'exécuter le code qui lui est attribué
|
||||
String action = e.getActionCommand();
|
||||
|
||||
switch(action)
|
||||
{
|
||||
case "Revenir":
|
||||
fsFrame.dispose();
|
||||
break;
|
||||
|
||||
case "Quitter":
|
||||
System.exit(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
395
Grid.java
Normal file
395
Grid.java
Normal file
@ -0,0 +1,395 @@
|
||||
/**
|
||||
* La classe <code>Grid</code> est utilisée pour générer la grille de blocs
|
||||
*
|
||||
* @version 0.1
|
||||
* @author Adil HAMMERSCHMIDT & Lucas GRANDJEAN
|
||||
*/
|
||||
|
||||
import java.io.*;
|
||||
import java.awt.*;
|
||||
import javax.swing.*;
|
||||
import java.util.Random;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class Grid extends JPanel {
|
||||
|
||||
private Random random = new Random();
|
||||
private int col = 15;
|
||||
private int row = 10;
|
||||
private char charTab[][] = new char[10][15];
|
||||
private Block blockTab[][] = new Block[10][15];
|
||||
private String[] connectedCellList = null;
|
||||
private final ArrayList<String> cellNeigbors = new ArrayList<>();
|
||||
private HUD gameHUD;
|
||||
private int score = 0;
|
||||
|
||||
/**
|
||||
*Constructeur de la Grid : Génère une grille aléatoire.
|
||||
*@param HUD Nom de l'HUD
|
||||
*/
|
||||
public Grid(HUD gameHUD) {
|
||||
this.gameHUD = gameHUD;
|
||||
this.setLayout(new GridLayout(row,col,0,0));
|
||||
this.setBackground(Color.WHITE);
|
||||
this.initGrid();
|
||||
}
|
||||
|
||||
/**
|
||||
*TODO : Surchage du constructeur avec le fichier
|
||||
*
|
||||
*@param s Nom du fichier
|
||||
*@param HUD Nom de l'HUD
|
||||
*/
|
||||
public Grid(String s, HUD gameHUD) {
|
||||
this.gameHUD = gameHUD;
|
||||
this.setLayout(new GridLayout(row,col,0,0));
|
||||
try {
|
||||
|
||||
File grid_file = new File(s);
|
||||
FileInputStream flux = new FileInputStream(grid_file);
|
||||
|
||||
this.initGrid(flux);
|
||||
|
||||
try {
|
||||
flux.close();
|
||||
}
|
||||
|
||||
catch (IOException e) {
|
||||
System.err.println("Impossible de fermer le fichier " + s + " !");
|
||||
}
|
||||
}
|
||||
|
||||
catch (FileNotFoundException e) {
|
||||
System.err.println("Impossible d'ouvrir le fichier " + s + " !");
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Met en place la grille
|
||||
*
|
||||
*/
|
||||
public void initGrid() {
|
||||
GridMouseHandler gridMouseHandler = new GridMouseHandler();
|
||||
|
||||
int i,j;
|
||||
for (i=0; i<row; i++) {
|
||||
for (j=0; j<col; j++) {
|
||||
int randomBlock=this.random.nextInt(3);
|
||||
try {
|
||||
switch(randomBlock) {
|
||||
case 0:
|
||||
charTab[i][j]='R';
|
||||
break;
|
||||
case 1:
|
||||
charTab[i][j]='V';
|
||||
break;
|
||||
case 2:
|
||||
charTab[i][j]='B';
|
||||
break;
|
||||
default:
|
||||
throw new OutOfRangeBlock();
|
||||
}
|
||||
this.blockTab[i][j] = new Block(j, i, charTab[i][j]);
|
||||
this.blockTab[i][j].addMouseListener(gridMouseHandler);
|
||||
this.blockTab[i][j].setBackground(Color.WHITE);
|
||||
this.add(this.blockTab[i][j]);
|
||||
|
||||
} catch(OutOfRangeBlock e) {
|
||||
System.out.println(e);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Surchage de la fonction initGrid pour fonctionner avec les fichiers
|
||||
*
|
||||
*@param f Flux du fichier
|
||||
*/
|
||||
public void initGrid(FileInputStream f) {
|
||||
GridMouseHandler gridMouseHandler = new GridMouseHandler();
|
||||
int i,j;
|
||||
char c;
|
||||
try {
|
||||
for (i=0; i<row; i++) {
|
||||
for (j=0; j<col; j++) {
|
||||
c = (char)f.read();
|
||||
if (c == '\r') {
|
||||
c = (char)f.read();
|
||||
c = (char)f.read();
|
||||
}
|
||||
|
||||
charTab[i][j]=c;
|
||||
this.blockTab[i][j] = new Block(j, i, charTab[i][j]);
|
||||
this.blockTab[i][j].addMouseListener(gridMouseHandler);
|
||||
this.blockTab[i][j].setBackground(Color.WHITE);
|
||||
this.add(this.blockTab[i][j]);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
catch(IOException e) {
|
||||
System.err.println("Impossible de lire le fichier !");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Cette méthode explore avec récursivité une matrice, partant
|
||||
* de la ligne et colonne spécifiée en argument, processe ses valeurs
|
||||
* puis regarde s'il possède un voisin horizontalement, verticalement et diagonalement (selon les options)
|
||||
* qui possède les mêmes valeurs. Chaques celulles voisines détectées rappellent la fonction,
|
||||
* jusqu'à ce qu'il n'y ai plus de voisins disponibles.
|
||||
* Toutes les celulles voisines ont les valeurs des lignes/colonnes
|
||||
* storés dans une Array String (délimité par un ;).
|
||||
*
|
||||
* @param matrix (2D Array Int) La matrice pour check les voisins
|
||||
*
|
||||
* @param matrix_X (int) Index de la ligne de base
|
||||
*
|
||||
* @param matrix_Y (int) Index de la colonne de base
|
||||
*
|
||||
* @return (String[] Array) Une Array de String contenant des sets délimités par un ";"
|
||||
* avec les valeurs des index de la Ligne;Colonne pour les cellules voisines détectées.
|
||||
* (Cellule de base inclue au début)
|
||||
*/
|
||||
|
||||
public String[] getMatrixNeighCells(char[][] matrix, int matrix_X, int matrix_Y) {
|
||||
/* Dans une matrice on peut avoir jusqu'à 8 voisins qui contiennent la même valeur.
|
||||
On va exclure les diagonales. */
|
||||
int[][] directions = {
|
||||
{0, -1}, // Haut
|
||||
{-1, 0}, // Gauche
|
||||
{1, 0}, // Droite
|
||||
{0, 1}, // Bas
|
||||
};
|
||||
|
||||
|
||||
// Cellule de base
|
||||
String baseCell = String.valueOf((matrix_X)) + ";" + String.valueOf((matrix_Y));
|
||||
if (!this.cellNeigbors.contains(baseCell)) {
|
||||
this.cellNeigbors.add(baseCell);
|
||||
}
|
||||
|
||||
for (int[] d : directions) {
|
||||
int dx = d[0]; // Ligne
|
||||
int dy = d[1]; // Colonne
|
||||
if ((matrix_X + dx) >= 0 && (matrix_X + dx) < (matrix.length)
|
||||
&& (matrix_Y + dy) >= 0 && (matrix_Y + dy) < (matrix[0].length)
|
||||
&& matrix[matrix_X + dx][matrix_Y + dy] == matrix[matrix_X][matrix_Y]
|
||||
&& matrix[matrix_X][matrix_Y] != '1') {
|
||||
// Pour les celulles avec des voisins à la même valeur
|
||||
String neighbor = String.valueOf((matrix_X + dx)) + ";" + String.valueOf((matrix_Y + dy));
|
||||
if (!this.cellNeigbors.contains(neighbor)) {
|
||||
this.cellNeigbors.add(neighbor);
|
||||
// Récursivité pour les voisins
|
||||
String[] tmp = getMatrixNeighCells(matrix, matrix_X + dx, matrix_Y + dy);
|
||||
if (tmp != null) {
|
||||
for (String str : tmp) {
|
||||
if (!this.cellNeigbors.contains(str)) {
|
||||
this.cellNeigbors.add(str);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// On return la liste s'il y'a au moins une cellule voisine aux valeurs adjacente à celle de base
|
||||
if (this.cellNeigbors.size() >= 2) {
|
||||
return this.cellNeigbors.toArray(new String[this.cellNeigbors.size()]);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Permet de vérifier s'il y'a des lignes vides en dessous de chaques boules.
|
||||
* S'il y'en a, on abaisse d'un niveau la boule et on fait une récursion.
|
||||
*@param j Numéro de colonne
|
||||
*/
|
||||
public void reorganizeCol(int j) {
|
||||
for(int i = 0; i < row-1; i++) {
|
||||
if(blockTab[i][j].getStatus() == 1 && blockTab[i+1][j].getStatus() == 0) {
|
||||
blockTab[i+1][j].setColor(blockTab[i][j].getColor());
|
||||
blockTab[i+1][j].setStatus(1);
|
||||
blockTab[i][j].setStatus(0);
|
||||
blockTab[i+1][j].setBackground(Color.WHITE);
|
||||
blockTab[i][j].setBackground(Color.WHITE);
|
||||
charTab[i][j]='1';
|
||||
charTab[i+1][j]=blockTab[i+1][j].getColor();
|
||||
reorganizeCol(j);
|
||||
}
|
||||
}
|
||||
this.validate();
|
||||
this.repaint();
|
||||
}
|
||||
|
||||
/**
|
||||
* Permet de vérifier si une des colonnes est vide. Si oui, on décale et on relance.
|
||||
*@param i Numéro de col
|
||||
*/
|
||||
public void reorganizeRow(int i) {
|
||||
int nbCount = 0;
|
||||
for(int j = 0; j < row; j++) {
|
||||
if(blockTab[j][i].getStatus() == 0) {
|
||||
nbCount++;
|
||||
}
|
||||
if(nbCount == row) {
|
||||
for(int k = 0; k < row; k++) {
|
||||
blockTab[k][i].setColor(blockTab[k][i+1].getColor());
|
||||
if(blockTab[k][i+1].getStatus() == 1) {
|
||||
blockTab[k][i].setStatus(1);
|
||||
blockTab[k][i+1].setStatus(0);
|
||||
charTab[k][i]=blockTab[k][i+1].getColor();
|
||||
}
|
||||
blockTab[k][i].setBackground(Color.WHITE);
|
||||
blockTab[k][i+1].setBackground(Color.WHITE);
|
||||
charTab[k][i+1]='1';
|
||||
}
|
||||
if(i != col-2) {
|
||||
reorganizeRow(i+1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
this.validate();
|
||||
this.repaint();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter du tableau de la grille
|
||||
*
|
||||
*@return tableau de la grille
|
||||
*/
|
||||
public char[][] getGrid() {
|
||||
return this.charTab;
|
||||
}
|
||||
|
||||
/**
|
||||
* Un setter avec incrémentation du score
|
||||
* On change le label du score.
|
||||
*/
|
||||
public void addScore(int score) {
|
||||
this.score += score;
|
||||
gameHUD.setScoreLabel(this.score);
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter du score
|
||||
* @return le score
|
||||
*/
|
||||
public int getScore() {
|
||||
return this.score;
|
||||
}
|
||||
|
||||
/**
|
||||
* On itère chaque blocs pour savoir s'il leur reste des voisins
|
||||
* Si non, on fait gagner le joueur
|
||||
* @return un bool, true marquant la victoire du joueur.
|
||||
*/
|
||||
|
||||
public void checkWin() {
|
||||
int moveLeft = 0;
|
||||
for (int i=0; i< blockTab.length; i++) {
|
||||
for (int j=0; j< blockTab[i].length; j++) {
|
||||
cellNeigbors.clear();
|
||||
connectedCellList = getMatrixNeighCells(getGrid(), i,j);
|
||||
if (connectedCellList != null && connectedCellList.length > 1) moveLeft++;
|
||||
}
|
||||
}
|
||||
if(moveLeft <= 0) endGame();
|
||||
}
|
||||
|
||||
/**
|
||||
* Créé l'écran de fin de partie
|
||||
*/
|
||||
public void endGame() {
|
||||
FinalScreen fs = new FinalScreen(score);
|
||||
JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
|
||||
topFrame.dispose();
|
||||
}
|
||||
|
||||
/**
|
||||
* Mouse Event
|
||||
*/
|
||||
public class GridMouseHandler extends MouseAdapter {
|
||||
|
||||
/**
|
||||
* Si le joueur passe la souris sur un des Blocks,
|
||||
* on vérifie les cellules voisines du block ponté
|
||||
* puis on change le backGround des cellules voisines
|
||||
*/
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent evt) {
|
||||
Block source = (Block) evt.getSource();
|
||||
for (int i = 0; i < blockTab.length; i++) {
|
||||
for (int j = 0; j < blockTab[i].length; j++) {
|
||||
if (blockTab[i][j] == source) {
|
||||
cellNeigbors.clear();
|
||||
connectedCellList = getMatrixNeighCells(getGrid(), i, j);
|
||||
|
||||
if (connectedCellList != null && connectedCellList.length > 1) {
|
||||
for (String cells : connectedCellList) {
|
||||
int x = Integer.valueOf(cells.split(";")[0]);
|
||||
int y = Integer.valueOf(cells.split(";")[1]);
|
||||
blockTab[x][y].setBackground(Color.YELLOW);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Si le joueur quitte le block avec le pointeur de souris,
|
||||
* on remet le background à sa couleur de base
|
||||
*/
|
||||
@Override
|
||||
public void mouseExited(MouseEvent evt) {
|
||||
if (connectedCellList != null) {
|
||||
for (String cells : connectedCellList) {
|
||||
int x = Integer.valueOf(cells.split(";")[0]);
|
||||
int y = Integer.valueOf(cells.split(";")[1]);
|
||||
blockTab[x][y].setBackground(Color.WHITE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Si le joueur clique et relâche la souris,
|
||||
* on désactive le block (en changeant le status),
|
||||
* on remet le fond, on lui assigne une couleur hors du champs
|
||||
* (afin de désactiver le surlignage), et on réorganise les
|
||||
* lignes et colonnes du grid.
|
||||
* On cherche aussi si le joueur a gagné en appelant CheckWin()
|
||||
*/
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent evt) {
|
||||
if (connectedCellList != null) {
|
||||
int ccListSize = connectedCellList.length;
|
||||
for (String cells : connectedCellList) {
|
||||
int x = Integer.valueOf(cells.split(";")[0]);
|
||||
int y = Integer.valueOf(cells.split(";")[1]);
|
||||
charTab[x][y]='1';
|
||||
blockTab[x][y].setStatus(0);
|
||||
blockTab[x][y].setBackground(Color.WHITE);
|
||||
}
|
||||
addScore((ccListSize-2) * (ccListSize-2));
|
||||
for(int j = 0; j < col; j++) {
|
||||
reorganizeCol(j);
|
||||
}
|
||||
for(int i = (col-2) ; i >= 0; i--) {
|
||||
reorganizeRow(i);
|
||||
}
|
||||
}
|
||||
checkWin();
|
||||
mouseEntered(evt);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
35
HUD.java
Normal file
35
HUD.java
Normal file
@ -0,0 +1,35 @@
|
||||
/**
|
||||
* La classe <code>HUD</code> est utilisée pour générer le HUD (interface) du jeu.
|
||||
*
|
||||
* @version 0.1
|
||||
* @author Adil HAMMERSCHMIDT & Lucas GRANDJEAN
|
||||
*/
|
||||
|
||||
import java.awt.Color;
|
||||
import javax.swing.*;
|
||||
import javax.swing.border.MatteBorder;
|
||||
|
||||
public class HUD extends JPanel {
|
||||
|
||||
private int score = 0;
|
||||
public JLabel label2;
|
||||
/**
|
||||
*Constructeur du HUD : Genère un HUD.
|
||||
*/
|
||||
public HUD() {
|
||||
this.setBorder(new MatteBorder(1, 1, 2, 1, Color.black));
|
||||
JLabel label = new JLabel("Score : ");
|
||||
label2 = new JLabel(Integer.toString(score));
|
||||
this.add(label);
|
||||
this.add(label2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter du Score.
|
||||
*/
|
||||
public void setScoreLabel(int score) {
|
||||
label2.setText(Integer.toString(score));
|
||||
}
|
||||
|
||||
|
||||
}
|
5
Main.java
Normal file
5
Main.java
Normal file
@ -0,0 +1,5 @@
|
||||
public class Main {
|
||||
static public void main(String[] args) {
|
||||
Menu m = new Menu();
|
||||
}
|
||||
}
|
25
Makefile
Normal file
25
Makefile
Normal file
@ -0,0 +1,25 @@
|
||||
JC = javac
|
||||
.SUFFIXES: .java .class
|
||||
.java.class:
|
||||
$(JC) $*.java
|
||||
|
||||
CLASSES = \
|
||||
Menu.java \
|
||||
MenuListener.java \
|
||||
SameGame.java \
|
||||
HUD.java \
|
||||
FinalScreen.java \
|
||||
FinalScreenListener.java \
|
||||
Grid.java \
|
||||
Main.java
|
||||
|
||||
default: classes
|
||||
|
||||
classes: $(CLASSES:.java=.class)
|
||||
|
||||
run:
|
||||
make
|
||||
java Main
|
||||
|
||||
clean:
|
||||
$(RM) *.class
|
73
Menu.java
Normal file
73
Menu.java
Normal file
@ -0,0 +1,73 @@
|
||||
/**
|
||||
* La classe <code>Menu</code> est utilisée pour créer le menu du jeu
|
||||
*
|
||||
* @version 0.1
|
||||
* @author Adil HAMMERSCHMIDT & Lucas GRANDJEAN
|
||||
*/
|
||||
import java.awt.*;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.border.BevelBorder;
|
||||
|
||||
public class Menu extends JFrame {
|
||||
|
||||
private JButton playBtn;
|
||||
private JButton playFromFileBtn;
|
||||
private JButton quitBtn;
|
||||
|
||||
public Menu() {
|
||||
JFrame frame = new JFrame("SameGame by Lucas Grandjean & Adil Hammerschmidt");
|
||||
frame.setPreferredSize(new Dimension(300, 300));
|
||||
frame.add(new MenuPanel());
|
||||
frame.pack();
|
||||
frame.setLocationRelativeTo(null);
|
||||
frame.setVisible(true);
|
||||
}
|
||||
|
||||
public class MenuPanel extends JPanel {
|
||||
|
||||
public MenuPanel() {
|
||||
MenuListener mListener = new MenuListener();
|
||||
setOpaque(true);
|
||||
setBackground(new Color(67,133,200));
|
||||
|
||||
setLayout(new GridBagLayout());
|
||||
|
||||
GridBagConstraints gbc = new GridBagConstraints();
|
||||
gbc.gridwidth = GridBagConstraints.REMAINDER;
|
||||
gbc.anchor = GridBagConstraints.NORTH;
|
||||
|
||||
add(new JLabel("<html><h1><strong><i>SameGame</i></strong></h1><hr></html>"), gbc);
|
||||
add(new JLabel("<html>Lucas GRANDJEAN</html>"), gbc);
|
||||
add(new JLabel("<html>Adil HAMMERSCHMIDT<hr></html>"), gbc);
|
||||
|
||||
|
||||
gbc.anchor = GridBagConstraints.CENTER;
|
||||
gbc.fill = GridBagConstraints.HORIZONTAL;
|
||||
gbc.insets = new Insets(5, 0, 5, 0);
|
||||
JPanel buttons = new JPanel(new GridBagLayout());
|
||||
buttons.setBackground(new Color(57,108,160));
|
||||
buttons.setBorder(new BevelBorder(BevelBorder.RAISED));
|
||||
|
||||
playBtn = new JButton("Jouer");
|
||||
playBtn.addActionListener(mListener);
|
||||
|
||||
playFromFileBtn = new JButton("Charger une grille");
|
||||
playFromFileBtn.addActionListener(mListener);
|
||||
|
||||
quitBtn = new JButton("Quitter");
|
||||
quitBtn.addActionListener(mListener);
|
||||
|
||||
buttons.add(playBtn, gbc);
|
||||
buttons.add(playFromFileBtn, gbc);
|
||||
buttons.add(quitBtn, gbc);
|
||||
|
||||
gbc.weighty = 1;
|
||||
|
||||
add(buttons, gbc);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
39
MenuListener.java
Normal file
39
MenuListener.java
Normal file
@ -0,0 +1,39 @@
|
||||
/**
|
||||
* La classe <code>MenuListener</code> est utilisée pour donner un rôle aux boutons du menu
|
||||
*
|
||||
* @version 0.1
|
||||
* @author Adil HAMMERSCHMIDT & Lucas GRANDJEAN
|
||||
*/
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.io.*;
|
||||
|
||||
import javax.swing.JFileChooser;
|
||||
|
||||
public class MenuListener implements ActionListener {
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
// On récupère l'action afin d'exécuter le code qui lui est attribué
|
||||
String action = e.getActionCommand();
|
||||
|
||||
switch(action)
|
||||
{
|
||||
case "Jouer":
|
||||
SameGame g1 = new SameGame();
|
||||
break;
|
||||
|
||||
case "Charger une grille":
|
||||
// On sélectionne le fichier à l'aide de JFileChooser
|
||||
JFileChooser chooser = new JFileChooser();
|
||||
int ret = chooser.showOpenDialog(null);
|
||||
if (ret == JFileChooser.APPROVE_OPTION) {
|
||||
SameGame g2 = new SameGame(chooser.getSelectedFile().getAbsolutePath());
|
||||
}
|
||||
break;
|
||||
|
||||
case "Quitter":
|
||||
System.exit(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
8
OutOfRangeBlock.java
Normal file
8
OutOfRangeBlock.java
Normal file
@ -0,0 +1,8 @@
|
||||
public class OutOfRangeBlock extends Exception {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return ("Le bloc est en dehors de la range demandée");
|
||||
}
|
||||
|
||||
}
|
39
README.md
Normal file
39
README.md
Normal file
@ -0,0 +1,39 @@
|
||||
# SameGame
|
||||
|
||||
Ce jeu est une copie du célèbre "SameGame"
|
||||
|
||||
## Projet Tutoré 2021
|
||||
|
||||
Ce jeu a été conçu dans le but du projet tutoré de 2021, à l'IUT Sénart-Fontainebleau.
|
||||
|
||||
### Installation
|
||||
|
||||
Grâce au Makefile intégré, l'installation sera très simple.
|
||||
|
||||
```
|
||||
Clonez le projet dans un dossier vide
|
||||
```
|
||||
```
|
||||
Utilisez la commande make afin de compiler le jeu
|
||||
```
|
||||
```
|
||||
Profitez d'une expérience de jeu inégalée avec make run !
|
||||
```
|
||||
|
||||
### Langage de programmation
|
||||
|
||||
* [Java](https://en.wikipedia.org/wiki/Java_(programming_language)) - Le langage Java.
|
||||
|
||||
## Auteurs
|
||||
|
||||
* **Lucas Grandjean**
|
||||
* **Adil Hammerschmidt**
|
||||
|
||||
## Licence
|
||||
|
||||
Ce jeu est libre de droit, utilisez le comme bon vous semble !
|
||||
|
||||
## Remerciements
|
||||
|
||||
* Les élèves du DUT Informatique pour leur aide
|
||||
* Les professeurs du DUT Informatique pour leur conseils
|
47
SameGame.java
Normal file
47
SameGame.java
Normal file
@ -0,0 +1,47 @@
|
||||
/**
|
||||
* La classe <code>SameGame</code> est utilisée pour assembler HUD et Grid afin de former le jeu.
|
||||
*
|
||||
* @version 0.1
|
||||
* @author Adil HAMMERSCHMIDT & Lucas GRANDJEAN
|
||||
*/
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import javax.swing.*;
|
||||
|
||||
public class SameGame extends JFrame {
|
||||
|
||||
private int tempScore = 0;
|
||||
private HUD gameHUD = new HUD();
|
||||
|
||||
/**
|
||||
* Constructeur de classe
|
||||
*/
|
||||
public SameGame() {
|
||||
Grid gameGrid = new Grid(this.gameHUD);
|
||||
this.add(BorderLayout.CENTER, gameGrid);
|
||||
this.add(BorderLayout.NORTH, this.gameHUD);
|
||||
this.pack();
|
||||
this.setSize(800, 650);
|
||||
this.setLocation(300, 300);
|
||||
this.setResizable(false);
|
||||
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
this.setVisible(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* (Surchage) Constructeur de classe
|
||||
* @param s Fichier texte de la Grid
|
||||
*/
|
||||
public SameGame(String s) {
|
||||
Grid gameGrid = new Grid(s, this.gameHUD);
|
||||
this.add(BorderLayout.CENTER, gameGrid);
|
||||
this.add(BorderLayout.NORTH, this.gameHUD);
|
||||
this.pack();
|
||||
this.setSize(800, 650);
|
||||
this.setLocation(300, 300);
|
||||
this.setResizable(false);
|
||||
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
this.setVisible(true);
|
||||
}
|
||||
|
||||
}
|
BIN
img/bleu.png
Normal file
BIN
img/bleu.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.8 KiB |
BIN
img/rouge.png
Normal file
BIN
img/rouge.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.9 KiB |
BIN
img/vert.png
Normal file
BIN
img/vert.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.1 KiB |
BIN
rapport_pt_final.pdf
Normal file
BIN
rapport_pt_final.pdf
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user