diff --git a/code/jeu de la vie/rsrc/fxml/VueJeu.fxml b/code/jeu de la vie/rsrc/fxml/VueJeu.fxml
index aab54b4..5e55541 100644
--- a/code/jeu de la vie/rsrc/fxml/VueJeu.fxml
+++ b/code/jeu de la vie/rsrc/fxml/VueJeu.fxml
@@ -43,11 +43,7 @@
-->
-
-
-
-
-
+
diff --git a/code/jeu de la vie/src/launcher/Launcher.java b/code/jeu de la vie/src/launcher/Launcher.java
index de9a8b6..555649e 100644
--- a/code/jeu de la vie/src/launcher/Launcher.java
+++ b/code/jeu de la vie/src/launcher/Launcher.java
@@ -6,7 +6,18 @@ import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
+/**
+ * Classe qui s'ocupe de lancer l'application
+ * @author Yohan Breuil
+ * @author Allan Point
+ */
public class Launcher extends Application {
+
+ /**
+ * Lance l'application
+ * @param primaryStage
+ * @throws Exception
+ */
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(this.getClass().getResource("/fxml/VueJeu.fxml"));
diff --git a/code/jeu de la vie/src/model/CellulesVivantes.java b/code/jeu de la vie/src/model/CellulesVivantes.java
index b7d24f5..169fd0d 100644
--- a/code/jeu de la vie/src/model/CellulesVivantes.java
+++ b/code/jeu de la vie/src/model/CellulesVivantes.java
@@ -6,7 +6,16 @@ import model.cellule.Position;
import java.util.HashMap;
+/**
+ * Représentation des cellules vivantes sur le plateau. Elle se met à jours automatiquement.
+ * @author Yohann Breuil
+ * @author Allan Point
+ */
public class CellulesVivantes implements ObserverCellule {
+
+ /**
+ * Dictionaire contenant toutes les cellules vivantes
+ */
private HashMap cellVivantes;
public CellulesVivantes(){
@@ -17,17 +26,40 @@ public class CellulesVivantes implements ObserverCellule {
this.cellVivantes = cellVivantes;
}
+ /**
+ * Récuperer une cellule vivante
+ * @param x Absisse de la cellule
+ * @param y Ordonée de la cellule
+ * @return La cellule (x; y) si elle est vivante. Sinon null
+ */
public Cellule getAt(int x, int y){
Position p = new Position(x, y);
return cellVivantes.get(p);
}
+ /**
+ * Ajoute une paire clef:valeur (Postion:Cellule) dans le dictionaire contenant les cellules vivantes
+ * @param cell Cellule à ajouter
+ * @see Position
+ * @see Cellule
+ */
private void addPeer(Cellule cell){ cellVivantes.put(cell.getPosition(), cell); }
+ /**
+ * Retir une paire clef:valeur (Postion:Cellule) du dictionaire contenant les cellules vivantes
+ * @param cellule Cellule à retirer
+ * @see Position
+ * @see Cellule
+ */
private void rmPeer(Cellule cellule){
cellVivantes.remove(cellule.getPosition());
}
+ /**
+ * Comportement lors ce que le cellule notifit l'objet CellulesVivantes.
+ * Ici on ajoute ou retire la cellule du dictionaire qui contient les cellules vivante en fonction de la cellule qui à notifiée.
+ * @param cellule Cellule qui à notifiée
+ */
@Override
public void update(Cellule cellule) {
if(cellule.isAlive()){
@@ -37,10 +69,17 @@ public class CellulesVivantes implements ObserverCellule {
}
}
+ /**
+ * Cloner l'objet
+ * @return Le meme objet CellulesVivantes avec une référence diférente
+ */
public CellulesVivantes clone(){
return new CellulesVivantes(new HashMap<>(cellVivantes));
}
+ /**
+ * Nétoie le dictionaire contenant les cellules vivantes
+ */
public void reset(){
cellVivantes = new HashMap<>();
}
diff --git a/code/jeu de la vie/src/model/ChangeurRegle.java b/code/jeu de la vie/src/model/ChangeurRegle.java
index 368a61e..568bfc4 100644
--- a/code/jeu de la vie/src/model/ChangeurRegle.java
+++ b/code/jeu de la vie/src/model/ChangeurRegle.java
@@ -1,17 +1,43 @@
package model;
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleObjectProperty;
import model.actualiseur.ActualiseurCellule;
import model.actualiseur.ActualiseurEtatCellule;
import model.arbitre.ArbitreConwayStyle;
+import model.arbitre.ArbitreKiller;
import model.plateau.Plateau;
+/**
+ * Permet de gerer le changement de règles
+ * @author Yohann Breuil
+ * @author Allan Point
+ */
public class ChangeurRegle {
- public ActualiseurCellule changerRegle(Regle regle, Plateau plateau){
- switch (regle){
- case CONWAY_STYLE -> {
+ private ObjectProperty regleEnCours = new SimpleObjectProperty<>();
+ public Regle getRegleEnCours() { return regleEnCours.get(); }
+ public void setRegleEnCours(Regle regleEnCours) { this.regleEnCours.set(regleEnCours); }
+ public ObjectProperty regleEnCoursProperty() { return regleEnCours; }
+
+ public ChangeurRegle(){
+ setRegleEnCours(Regle.values()[0]);
+ }
+
+ /**
+ * Change l'actualiseur en fonction des règles
+ * @param plateau Plateau actuel du jeu
+ * @return Un ActualiseurCellule avec le bon arbitre
+ * @see model.arbitre.Arbitre
+ * @see ActualiseurCellule
+ */
+ public ActualiseurCellule changerRegle(Plateau plateau) {
+ switch (getRegleEnCours()){
+ case REGLE_KILLER -> {
+ return new ActualiseurEtatCellule(new ArbitreKiller(plateau));
+ }
+ default -> {
return new ActualiseurEtatCellule(new ArbitreConwayStyle(plateau));
}
- default -> throw new IllegalArgumentException("Regle Inconue");
}
}
}
diff --git a/code/jeu de la vie/src/model/CompteurDeCellule.java b/code/jeu de la vie/src/model/CompteurDeCellule.java
index 6f23232..f9516dc 100644
--- a/code/jeu de la vie/src/model/CompteurDeCellule.java
+++ b/code/jeu de la vie/src/model/CompteurDeCellule.java
@@ -6,12 +6,26 @@ import model.cellule.Position;
import java.util.LinkedList;
import java.util.List;
+/**
+ * Classe permtant de compter des cellules
+ * @author Yohann Breuil
+ * @author Allan Point
+ */
public class CompteurDeCellule {
+
+ /**
+ * Compte le nombre de voisinne de la cellule (x; y)
+ * @param x Absisse de la cellule à compter
+ * @param y Ordoné de la cellule à compter
+ * @param cellulesVivantes Toutes les cellule vivantes
+ * @return Le nombre de voisinne de la cellule (x; y)
+ */
public int compteNombreCellulesAutour(int x, int y, CellulesVivantes cellulesVivantes){
int cpt = 0;
Cellule c;
List positionsAVerifier = new LinkedList<>();
+ // Définition des 8 diréction autour de la position (x; y)
positionsAVerifier.add(new Position(x-1, y-1));
positionsAVerifier.add(new Position(x, y-1));
positionsAVerifier.add(new Position(x+1, y-1));
diff --git a/code/jeu de la vie/src/model/Manager.java b/code/jeu de la vie/src/model/Manager.java
index b39d3c6..7421de6 100644
--- a/code/jeu de la vie/src/model/Manager.java
+++ b/code/jeu de la vie/src/model/Manager.java
@@ -10,6 +10,11 @@ import model.boucleDeJeu.observer.ObserverBDJ;
import model.cellule.Cellule;
import model.plateau.Plateau;
+/**
+ * Point d'entré du model
+ * @author Yohann Breuil
+ * @author Allan Point
+ */
public class Manager implements ObserverBDJ {
private ActualiseurTour actualiseurTour;
private ActualiseurCellule actualiseurCellule;
@@ -17,17 +22,31 @@ public class Manager implements ObserverBDJ {
private ChangeurRegle changeurRegle;
private boolean jeuLance;
+
+
public Manager(){
boucleDeJeu = new BoucleDeJeu5FPS();
((ObservableBDJ)boucleDeJeu).attacher(this);
changeurRegle = new ChangeurRegle();
Thread thread = new Thread(boucleDeJeu);
thread.start();
- actualiseurCellule = changeurRegle.changerRegle(Regle.CONWAY_STYLE, new Plateau());
+ actualiseurCellule = changeurRegle.changerRegle(new Plateau());
actualiseurTour = new ActualiseurTourUnParUn();
jeuLance = false;
+ changeurRegle.regleEnCoursProperty().addListener((src)->actualiserActualiseurCellule());
+ }
+
+ /**
+ * Change l'actualiseur de cellule en fonction des règles
+ */
+ private void actualiserActualiseurCellule(){
+ actualiseurCellule = changeurRegle.changerRegle(getActualiseurCellule().getArbitre().getPlateau());
}
+ /**
+ * Comportement à adopter quand la boucle de jeu notifie le manager.
+ * (Actualier les cellules et le numéro de génération(tours))
+ */
@Override
public void update() {
if(jeuLance) {
@@ -40,6 +59,9 @@ public class Manager implements ObserverBDJ {
return actualiseurTour;
}
+ /**
+ * Actualiser l'état des cellules
+ */
private void deleguerChangementCellule() {
CellulesVivantes reference = getActualiseurCellule().getArbitre().getPlateau().getCellulesVivantes().clone();
for (int y = 0; y livingColor = new SimpleObjectProperty<>();
@@ -57,13 +58,13 @@ public class Cellule extends ObservableCellule {
/**
*
- * @return état de la cellule (vivante ou morte)
+ * @return True si la cellule est vivante. Sinon false.
*/
public Boolean isAlive() { return alive; }
/**
- *
- * @param alive
+ * Change l'état de la cellule en changant le couleur actve ainsi qu'en notifiant tout les abonnés du changement
+ * @param alive Booléen assigné a l'état de la cellule
*/
public void setAlive(Boolean alive) {
setActiveColor(alive ? (Color) getLivingColor() : deathColor);
@@ -77,8 +78,8 @@ public class Cellule extends ObservableCellule {
/**
*
- * @param o
- * @return
+ * @param o Objet à comparrer
+ * @return True si les cellules ont les mêmes positions. Sinon false
*/
@Override
public boolean equals(Object o) {
@@ -91,6 +92,10 @@ public class Cellule extends ObservableCellule {
}
return false;
}
+
+ /**
+ * Inverset l'état d'une cellule. La tue si elle est vivante et vice versa.
+ */
public void inverseAlive(){
setAlive(!alive);
}
diff --git a/code/jeu de la vie/src/model/cellule/Position.java b/code/jeu de la vie/src/model/cellule/Position.java
index 0d103ea..99188b6 100644
--- a/code/jeu de la vie/src/model/cellule/Position.java
+++ b/code/jeu de la vie/src/model/cellule/Position.java
@@ -3,10 +3,20 @@ package model.cellule;
import java.util.Objects;
/**
- * Définit une position dans un axe x et y
+ * Représente une position dans un axe x et y (2 dimentions)
+ * @author Yohann Breil
+ * @author Allan Point
*/
public class Position {
+
+ /**
+ * Position x
+ */
private int x;
+
+ /**
+ * Position y
+ */
private int y;
/**
@@ -30,12 +40,8 @@ public class Position {
/**
*
* @param valeur position x
- * @throws IllegalArgumentException
*/
- public void setX(int valeur) throws IllegalArgumentException{
- if(valeur<0) {
- //throw new IllegalArgumentException("La valeur de X doit être positive");
- }
+ public void setX(int valeur){
x = valeur;
}
@@ -50,15 +56,16 @@ public class Position {
/**
*
* @param valeur position y
- * @throws IllegalArgumentException
*/
public void setY(int valeur) throws IllegalArgumentException{
- if(valeur<0) {
- // throw new IllegalArgumentException("La valeure de Y doit être positive");
- }
y = valeur;
}
+ /**
+ *
+ * @param o L'objet à comparer
+ * @return True si les 2 positions on les mêmes coordonées. Sinon false.
+ */
@Override
public boolean equals(Object o) {
if (this == o) return true;
diff --git a/code/jeu de la vie/src/model/plateau/Plateau.java b/code/jeu de la vie/src/model/plateau/Plateau.java
index 0e3adfd..b524465 100644
--- a/code/jeu de la vie/src/model/plateau/Plateau.java
+++ b/code/jeu de la vie/src/model/plateau/Plateau.java
@@ -7,25 +7,56 @@ import model.cellule.créateur.CreateurCellule;
import java.util.List;
+/**
+ * Représentation du plateau de jeu
+ * @author Yohann Breuil
+ * @author Allan Point
+ */
public class Plateau implements PrototypePlateau{
+
+ /**
+ * Pour créer corréctement des cellules
+ * @see CreateurCellule
+ */
private CreateurCellule createurCellule;
+
+ /**
+ * Propriété qui permet de mettre en relation le nombre de colones avec la vue
+ */
private IntegerProperty colone = new SimpleIntegerProperty();
public int getColone() { return colone.get();}
public void setColone(int valeur) { colone.set(valeur); resetGrille(valeur, getLigne());}
public IntegerProperty coloneProperty() { return colone; }
+ /**
+ * Propriété qui permet de mettre en relation le nombre de ligne avec la vue
+ */
private IntegerProperty ligne = new SimpleIntegerProperty();
public int getLigne() { return ligne.get(); }
public void setLigne(int valeur ) { ligne.set(valeur); resetGrille(getColone(), valeur);}
public IntegerProperty ligneProperty() { return ligne; }
- //private ObservableList> grilleObs = FXCollections.observableArrayList();
+ /**
+ * Représentation du plateau dans une liste à 2 dimention
+ */
private ListProperty> grille = new SimpleListProperty<>();
public ListProperty> getGrille() { return (ListProperty>) grille.get(); }
public void setGrille(ListProperty> cells) {grille.set(cells);}
public ReadOnlyListProperty grilleProperty() { return grille;}
+
+ /**
+ * Enssemble des cellules vivante du plateau
+ * @see CellulesVivantes
+ */
private CellulesVivantes cellulesVivantes;
+ /**
+ * Récuperer une cellule sur le plateau
+ * @param x Coordonée x
+ * @param y Coordonée y
+ * @return La cellule positioné en (x; y)
+ * @throws IllegalArgumentException x et y doivent être > 0 et respéctivement inferieur au nombre de colones et de ligne
+ */
public Cellule getCell(int x, int y) throws IllegalArgumentException{
if(x < 0 || y < 0) {
throw new IllegalArgumentException("X ou Y est inférieur à 0");
@@ -39,9 +70,18 @@ public class Plateau implements PrototypePlateau{
return grille.get().get(y).get(x);
}
+ /**
+ * Netoyer la grille
+ */
public void resetGrille(){
resetGrille(getColone(), getLigne());
}
+
+ /**
+ * Créer une nouvelle grille
+ * @param colone nombre de colone de la grille
+ * @param ligne nombre de ligne de la grille
+ */
public void resetGrille(int colone, int ligne){
setGrille(createurCellule.creerCellules(colone, ligne, cellulesVivantes));
}
@@ -50,10 +90,23 @@ public class Plateau implements PrototypePlateau{
createurCellule = new CreateurCellule(0, 0);
cellulesVivantes = new CellulesVivantes();
setGrille(new SimpleListProperty<>());
- }
+ }
+
+ /**
+ *
+ * @param colone Nombre de colones du plateau
+ * @param ligne Nombre de lignes du plateau
+ */
public Plateau(int colone, int ligne) {
this(colone, ligne, new CellulesVivantes());
}
+
+ /**
+ *
+ * @param colone Nombre de colone du plateau
+ * @param ligne Nombre de ligne du plateau
+ * @param observer CellulesVivantes qui veux observer les cellules crées
+ */
public Plateau(int colone, int ligne, CellulesVivantes observer) {
createurCellule = new CreateurCellule(colone, ligne);
setLigne(ligne);
@@ -62,12 +115,22 @@ public class Plateau implements PrototypePlateau{
setGrille(createurCellule.creerCellules(cellulesVivantes));
}
+ /**
+ *
+ * @param colone Nombre de colones du plateau
+ * @param ligne Nombre de lignes du plateau
+ * @param cellules Liste en 2 dimentions de cellules
+ */
public Plateau(int colone, int ligne, ListProperty> cellules)
{
this(colone, ligne);
setGrille(cellules);
}
+ /**
+ * Clonne un plateau
+ * @return Le même plateau mais avec une référence différente
+ */
@Override
public Plateau cloner() {
return new Plateau(getColone(), getLigne(), getGrille());
diff --git a/code/jeu de la vie/src/model/plateau/PrototypePlateau.java b/code/jeu de la vie/src/model/plateau/PrototypePlateau.java
index 5f6f76e..f1d2640 100644
--- a/code/jeu de la vie/src/model/plateau/PrototypePlateau.java
+++ b/code/jeu de la vie/src/model/plateau/PrototypePlateau.java
@@ -1,5 +1,10 @@
package model.plateau;
+/**
+ * Abstraction du clonnage de plateau
+ * @author Yohann Breuil
+ * @author Allan Point
+ */
public interface PrototypePlateau {
Plateau cloner();
}
diff --git a/code/jeu de la vie/src/views/VueJeu.java b/code/jeu de la vie/src/views/VueJeu.java
index d1a34d3..228f563 100644
--- a/code/jeu de la vie/src/views/VueJeu.java
+++ b/code/jeu de la vie/src/views/VueJeu.java
@@ -1,25 +1,28 @@
package views;
import javafx.beans.property.Property;
+import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
-import javafx.scene.control.Button;
-import javafx.scene.control.ColorPicker;
-import javafx.scene.control.Label;
-import javafx.scene.control.Spinner;
+import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import model.Manager;
+import model.Regle;
import model.actualiseur.ActualiseurTourUnParUn;
import model.cellule.Cellule;
import model.plateau.Plateau;
+import java.util.List;
import java.util.Random;
+/**
+ * Code Behind de la vue
+ * @author Yohann Breuil
+ * @author Allan Point
+ */
public class VueJeu {
- @FXML
- private Button random;
@FXML
private GridPane map;
@@ -42,10 +45,15 @@ public class VueJeu {
@FXML
private Label numTour;
+ @FXML
+ private ChoiceBox regleChoiceBox;
+
private Manager manager;
- private Color deathColor;
- private Plateau plateau;
+
+ /**
+ * Remplie une grille fxml avec des réctangles bindés au cellules
+ */
public void createGrid() {
map.getChildren().clear();
for(int i=0; i < rowGame.getValue().intValue(); ++i) {
@@ -59,6 +67,9 @@ public class VueJeu {
}
}
+ /**
+ * Fait naître des cellules aléatoirement sur la grille
+ */
public void generateraRandom() {
resetGrid();
int ligne = manager.getActualiseurCellule().getArbitre().getPlateau().getLigne();
@@ -69,38 +80,71 @@ public class VueJeu {
}
}
+ /**
+ * Initalisation de la vue
+ */
public void initialize() {
+ // Remplissage des valeurs de la choice box des regles
+ regleChoiceBox.setItems(FXCollections.observableArrayList(Regle.values()));
+
+
manager = new Manager();
- deathColor = Color.BLACK;
+
+ // Binding bidiréctionel entre les reglès de la vue et celles du model
+ regleChoiceBox.valueProperty().bindBidirectional(manager.getChangeurRegle().regleEnCoursProperty());
+
+ // Binding bidiréctionel entre la ligne de la vue et celle du model
rowGame.getValueFactory().valueProperty().bindBidirectional((Property) manager.getActualiseurCellule().getArbitre().getPlateau().ligneProperty());
+
+ //Binding bidiréctionel entre la colone du model et celle de la vue
colGame.getValueFactory().valueProperty().bindBidirectional((Property) manager.getActualiseurCellule().getArbitre().getPlateau().coloneProperty());
+
+ // Définition d'action lors de redimentionement
manager.getActualiseurCellule().getArbitre().getPlateau().coloneProperty().addListener((src)->resetGrid());
manager.getActualiseurCellule().getArbitre().getPlateau().ligneProperty().addListener((src)->resetGrid());
+
+ // Initialisation des valeurs des legnes et colones
colGame.getValueFactory().setValue(10);
rowGame.getValueFactory().setValue(10);
+ // Binding entre le colorPicker de la vue et la couleur de la cellule vivante
color.valueProperty().bindBidirectional(Cellule.livingColorProperty());
- nbColGame.setText(colGame.getValue().toString());
- nbRowGame.setText(rowGame.getValue().toString());
+
+ // Binding unidiréctionel des informations à afficher (dimentiobn de la grille et numéro de la génération
numTour.textProperty().bind(((ActualiseurTourUnParUn)manager.getActualiseurTour()).cptTourProperty().asString());
nbColGame.textProperty().bind(manager.getActualiseurCellule().getArbitre().getPlateau().coloneProperty().asString());
nbRowGame.textProperty().bind(manager.getActualiseurCellule().getArbitre().getPlateau().ligneProperty().asString());
}
+ /**
+ * Lancer le jeu
+ * @param actionEvent
+ */
public void startGame(ActionEvent actionEvent) {
manager.lancerJeu();
}
+ /**
+ * Metre en pause le jeu
+ * @param actionEvent
+ */
public void pauseGame(ActionEvent actionEvent) {
manager.pauseJeu();
}
+ /**
+ * Réinitialiser le jeu
+ * @param actionEvent
+ */
public void resetGame(ActionEvent actionEvent){
manager.stoperJeu();
resetGrid();
}
+ /**
+ * Réinitialiser la grille
+ */
public void resetGrid(){
manager.getActualiseurCellule().getArbitre().getPlateau().resetGrille();
createGrid();