Ajout de commentaires

master
Allan POINT 4 years ago
parent 72cea8d78f
commit 872460562e

@ -5,21 +5,51 @@ import model.CompteurDeCellule;
import model.plateau.Plateau; import model.plateau.Plateau;
import model.cellule.CellState; import model.cellule.CellState;
/**
* @author Yohann Breuil
* @author Allan Point
*/
public abstract class Arbitre { public abstract class Arbitre {
private Plateau plateau; private Plateau plateau;
private CompteurDeCellule compteurCell; private CompteurDeCellule compteurCell;
public Arbitre(Plateau plateau) { /**
* @param plateau Plateau à arbitrer
* @throws IllegalArgumentException Lève une exception si le plateau est null
*/
public Arbitre(Plateau plateau) throws IllegalArgumentException {
if(plateau == null){
throw new IllegalArgumentException("Le plateau ne doit pat être null");
}
this.plateau = plateau; this.plateau = plateau;
compteurCell = new CompteurDeCellule(); compteurCell = new CompteurDeCellule();
} }
/**
*
* @return Le plateau en cours d'arbitrage
*/
public Plateau getPlateau(){ public Plateau getPlateau(){
return plateau; return plateau;
} }
/**
*
* @return Le compteur de cellule du jeu
* @see CompteurDeCellule
*/
protected CompteurDeCellule getCompteurCell(){ protected CompteurDeCellule getCompteurCell(){
return compteurCell; return compteurCell;
} }
/**
*
* @param x Coordonée x de la cellule à checker
* @param y Coordonée y de la cellule à checker
* @param reference Toutes les cellules qui était vivantes au début du tour et qui servent donc de references
* @return L'état de la cellule au prochain tours
* @see CellState
*/
public abstract CellState verifierChangementCellules(int x, int y, CellulesVivantes reference); public abstract CellState verifierChangementCellules(int x, int y, CellulesVivantes reference);
} }

@ -5,12 +5,28 @@ import model.CellulesVivantes;
import model.plateau.Plateau; import model.plateau.Plateau;
import model.cellule.CellState; import model.cellule.CellState;
/**
* @author Yohann Breuil
* @author Allan Point
*/
public class ArbitreConwayStyle extends Arbitre{ public class ArbitreConwayStyle extends Arbitre{
/**
*
* @param plateau Plateau à arbitrer
* @see Arbitre
*/
public ArbitreConwayStyle(Plateau plateau) { public ArbitreConwayStyle(Plateau plateau) {
super(plateau); super(plateau);
} }
/**
*
* @param x Coordonée x de la cellule à checker
* @param y Coordonée y de la cellule à checker
* @param reference Toutes les cellules qui était vivantes au début du tour et qui servent donc de references
* @return L'état de la cellule au prohain tour
*/
@Override @Override
public CellState verifierChangementCellules(int x, int y, CellulesVivantes reference) { public CellState verifierChangementCellules(int x, int y, CellulesVivantes reference) {
if(verifierNaissance(x, y, reference)) { if(verifierNaissance(x, y, reference)) {
@ -22,6 +38,13 @@ public class ArbitreConwayStyle extends Arbitre{
return reference.getAt(x, y) != null ? CellState.LIVE : CellState.DIE; return reference.getAt(x, y) != null ? CellState.LIVE : CellState.DIE;
} }
/**
*
* @param x Coordonée x de la cellule à checker
* @param y Coordonée y de la cellule à checker
* @param reference Toutes les cellules qui était vivantes au début du tour et qui servent donc de references
* @return True si la cellule doit naître. Sinon false
*/
private boolean verifierNaissance(int x, int y, CellulesVivantes reference) { private boolean verifierNaissance(int x, int y, CellulesVivantes reference) {
int cpt = getCompteurCell().compteNombreCellulesAutour(x, y, reference); int cpt = getCompteurCell().compteNombreCellulesAutour(x, y, reference);
if(cpt == 3 && !getPlateau().getCell(x, y).isAlive()) { if(cpt == 3 && !getPlateau().getCell(x, y).isAlive()) {
@ -29,7 +52,13 @@ public class ArbitreConwayStyle extends Arbitre{
} }
return false; return false;
} }
/**
*
* @param x Coordonée x de la cellule à checker
* @param y Coordonée y de la cellule à checker
* @param reference Toutes les cellules qui était vivantes au début du tour et qui servent donc de references
* @return True si la cellule doit mourir. Sinon false
*/
private boolean verifierMort(int x, int y, CellulesVivantes reference) { private boolean verifierMort(int x, int y, CellulesVivantes reference) {
int cpt = getCompteurCell().compteNombreCellulesAutour(x, y, reference); int cpt = getCompteurCell().compteNombreCellulesAutour(x, y, reference);
if(!(cpt == 2 || cpt == 3) && getPlateau().getCell(x, y).isAlive()) { if(!(cpt == 2 || cpt == 3) && getPlateau().getCell(x, y).isAlive()) {

@ -4,11 +4,19 @@ package model.boucleDeJeu;
import model.boucleDeJeu.observer.ObservableBDJ; import model.boucleDeJeu.observer.ObservableBDJ;
import java.util.LinkedList; import java.util.LinkedList;
/**
* Boucle de jeu qui notifit tout les 33ms pour avoir 60 Image Par Seconde dans un thread (fils d'execution) séparé.
* @author Yohann Breui
* @author Allan Point
*/
public class BoucleDeJeu30FPS extends ObservableBDJ implements IBoucleDeJeu { public class BoucleDeJeu30FPS extends ObservableBDJ implements IBoucleDeJeu {
public BoucleDeJeu30FPS(){ public BoucleDeJeu30FPS(){
setObserveurs(new LinkedList<>()); setObserveurs(new LinkedList<>());
} }
/**
* Déffinition du comportement de la boucle de jeu pour le thread
*/
@Override @Override
public void run() public void run()
{ {
@ -18,14 +26,17 @@ public class BoucleDeJeu30FPS extends ObservableBDJ implements IBoucleDeJeu {
beep(); beep();
} }
// Gestion des exceptions : si le processus à été intérompu pendant le sleep, on le log. // Gestion des exceptions : si le processus à été intérompu pendant le sleep, on arrete la boucle.
catch (InterruptedException e) catch (InterruptedException e)
{ {
return; break;
} }
} }
} }
/**
* Notifier les abonnés
*/
public void beep() { public void beep() {
notifier(); notifier();
} }

@ -4,10 +4,19 @@ import model.boucleDeJeu.observer.ObservableBDJ;
import java.util.LinkedList; import java.util.LinkedList;
/**
* Boucle de jeu qui notifit tout les 200ms pour avoir 5 Image Par Seconde dans un thread (fils d'execution) séparé.
* @author Yohann Breui
* @author Allan Point
*/
public class BoucleDeJeu5FPS extends ObservableBDJ implements IBoucleDeJeu { public class BoucleDeJeu5FPS extends ObservableBDJ implements IBoucleDeJeu {
public BoucleDeJeu5FPS(){ public BoucleDeJeu5FPS(){
setObserveurs(new LinkedList<>()); setObserveurs(new LinkedList<>());
} }
/**
* Déffinition du comportement de la boucle de jeu pour le thread
*/
@Override @Override
public void run() public void run()
{ {
@ -17,14 +26,17 @@ public class BoucleDeJeu5FPS extends ObservableBDJ implements IBoucleDeJeu {
beep(); beep();
} }
// Gestion des exceptions : si le processus à été intérompu pendant le sleep, on le log. // Gestion des exceptions : si le processus à été intérompu pendant le sleep, on arrete la boucle.
catch (InterruptedException e) catch (InterruptedException e)
{ {
return; break;
} }
} }
} }
/**
* Notifier les abonnés
*/
public void beep() { public void beep() {
notifier(); notifier();
} }

@ -1,3 +1,8 @@
package model.boucleDeJeu; package model.boucleDeJeu;
/**
* Perrmet d'avoir une boucle de jeu Runnable dans un thread
* @author Yohann Breuil
* @author Allan Point
*/
public interface IBoucleDeJeu extends Runnable {} public interface IBoucleDeJeu extends Runnable {}

@ -4,8 +4,20 @@ import javafx.application.Platform;
import java.util.List; import java.util.List;
/**
* @author Yohann Breuil
* @author Allan Point
*/
public abstract class ObservableBDJ { public abstract class ObservableBDJ {
/**
* Liste des observeurs de la boucle de jeu. Cette liste servira à notifier les abonnés de la boucle de jeu
*/
private List<ObserverBDJ> observeurs; private List<ObserverBDJ> observeurs;
/**
*
* @return Les observeur de la boucle observée
*/
protected List<ObserverBDJ> getObserveurs(){ protected List<ObserverBDJ> getObserveurs(){
return observeurs; return observeurs;
} }
@ -13,18 +25,27 @@ public abstract class ObservableBDJ {
protected void setObserveurs(List<ObserverBDJ> valeur){ protected void setObserveurs(List<ObserverBDJ> valeur){
observeurs = valeur; observeurs = valeur;
} }
/**
* Permet de s'abonner l'observable
* @param o Observateur qui veut s'abboner
*/
public void attacher(ObserverBDJ o) { public void attacher(ObserverBDJ o) {
observeurs.add(o); observeurs.add(o);
} }
public void detacher(Object o) throws IllegalArgumentException{ /**
if(o.getClass() != ObserverBDJ.class) { * Permet de se déabonner de la liste de notification de la boucle.
throw new IllegalArgumentException("Imposible de détacher autre chose qu'un observer"); * @param o Observateur qui veut s'abbonner
} */
public void detacher(ObserverBDJ o){
observeurs.remove(o); observeurs.remove(o);
} }
public void notifier() { /**
* Permet de notifier les abonnés de la boucle de jeu
*/
protected void notifier() {
for (ObserverBDJ observeur : observeurs) { for (ObserverBDJ observeur : observeurs) {
Platform.runLater(()->observeur.update()); Platform.runLater(()->observeur.update());
} }

@ -1,5 +1,13 @@
package model.boucleDeJeu.observer; package model.boucleDeJeu.observer;
/**
* Permet d'obbserver une boucle de jeu
* @author Yohann Breuil
* @author Allan Point
*/
public interface ObserverBDJ { public interface ObserverBDJ {
/**
* Réaction en cas de notification
*/
void update(); void update();
} }

@ -1,7 +1,21 @@
package model.cellule; package model.cellule;
/**
* Tout les etats possible pour la manipulation de cellules
*/
public enum CellState { public enum CellState {
/**
* La cellule est vivante
*/
LIVE, LIVE,
/**
* La cellule est morte ou meur
*/
DIE, DIE,
/**
* La cellule née
*/
BIRTH BIRTH
} }

@ -6,22 +6,40 @@ import javafx.scene.paint.Paint;
import model.cellule.observer.ObservableCellule; import model.cellule.observer.ObservableCellule;
/** /**
* * Classe métier représentant une cellule
*/ */
public class Cellule extends ObservableCellule { public class Cellule extends ObservableCellule {
/**
* Position de la cellule
* @see Position
*/
private Position position; private Position position;
private BooleanProperty alive;
/**
* État de la cellule
*/
private boolean alive;
/**
* TODO: Faire un poid mouche pour séparé les partis commune des cellules (livingColor)
* Permet d'avoir une propriété qui représente la coulleur de toutes les cellules vivantes
*/
private static ObjectProperty<Color> livingColor = new SimpleObjectProperty<>(); private static ObjectProperty<Color> livingColor = new SimpleObjectProperty<>();
public Color getLivingColor() { return livingColor.get(); } public Color getLivingColor() { return livingColor.get(); }
public void setLivingColor(Color color) { livingColor.set(color); } public void setLivingColor(Color color) { livingColor.set(color); }
public static ObjectProperty<Color> livingColorProperty() { return livingColor; } public static ObjectProperty<Color> livingColorProperty() { return livingColor; }
/**
* Permet d'avoir une propriété qui représente la coulleur actuel d'une cellule en fonction de son etat
*/
private ObjectProperty<Paint> activeColor = new SimpleObjectProperty<>(); private ObjectProperty<Paint> activeColor = new SimpleObjectProperty<>();
public Paint getActiveColor() { return activeColor.get(); } public Paint getActiveColor() { return activeColor.get(); }
public void setActiveColor(Color color) { activeColor.set(color); } public void setActiveColor(Color color) { activeColor.set(color); }
public Property<Paint> activeColorProperty() { return activeColor; } public Property<Paint> activeColorProperty() { return activeColor; }
/**
* Couleur des cellules mortes
*/
private Color deathColor; private Color deathColor;
/** /**
@ -34,20 +52,14 @@ public class Cellule extends ObservableCellule {
deathColor = Color.BLACK; deathColor = Color.BLACK;
activeColorProperty().setValue(deathColor); activeColorProperty().setValue(deathColor);
position = new Position(x,y); position = new Position(x,y);
alive = new SimpleBooleanProperty(false); alive = false;
} }
/** /**
* *
* @return état de la cellule (vivante ou morte) * @return état de la cellule (vivante ou morte)
*/ */
public Boolean isAlive() { return alive.get(); } public Boolean isAlive() { return alive; }
/**
*
* @return
*/
public ReadOnlyBooleanProperty aliveProperty() { return alive; }
/** /**
* *
@ -55,7 +67,7 @@ public class Cellule extends ObservableCellule {
*/ */
public void setAlive(Boolean alive) { public void setAlive(Boolean alive) {
setActiveColor(alive ? (Color) getLivingColor() : deathColor); setActiveColor(alive ? (Color) getLivingColor() : deathColor);
this.alive.set(alive); this.alive = alive;
notifier(this); notifier(this);
} }
@ -80,6 +92,6 @@ public class Cellule extends ObservableCellule {
return false; return false;
} }
public void inverseAlive(){ public void inverseAlive(){
setAlive(!alive.get()); setAlive(!alive);
} }
} }

@ -10,10 +10,28 @@ import model.cellule.Cellule;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
/**
* Permet de créer des cellules de manières sécurisé et standardiser
* @author Yohann Breuil
* @author Allan Point
*/
public class CreateurCellule implements ICreateurCellule { public class CreateurCellule implements ICreateurCellule {
/**
* Nombre de colones à créer
*/
private int w; private int w;
/**
* Nombre de ligne à créer
*/
private int h; private int h;
/**
*
* @param w Nombre de colones. Doit être supperieur ou égal à 0.
* @param h Nombre de lignes. Doit être supperieur ou égal à 0.
* @throws IllegalArgumentException Si w ou h sont strictement inferieur à 0.
*/
public CreateurCellule(int w, int h) throws IllegalArgumentException{ public CreateurCellule(int w, int h) throws IllegalArgumentException{
if(w<0 || h<0){ if(w<0 || h<0){
throw new IllegalArgumentException("La longueur et la largeur doivent être supperieur à 0"); throw new IllegalArgumentException("La longueur et la largeur doivent être supperieur à 0");
@ -21,10 +39,23 @@ public class CreateurCellule implements ICreateurCellule {
this.w = w; this.w = w;
this.h = h; this.h = h;
} }
/**
* Créer des cellules selon les dimentions précisé dans le constructeur.
* @param observer Permet d'abonner un objet CellulesVivantes à toute les cellules.
* @return Une liste observable pour fxml avec toutes les cellules standardisées .
*/
public ListProperty<List<Cellule>> creerCellules(CellulesVivantes observer){ public ListProperty<List<Cellule>> creerCellules(CellulesVivantes observer){
return creerCellules(w, h, observer); return creerCellules(w, h, observer);
} }
/**
* Créer des cellules.
* @param colone Nombre de colones à créer.
* @param ligne Nombre de lignes à créer.
* @param observer Permet d'abonner un objet CellulesVivantes à toute les cellules.
* @return Une liste observable pour fxml avec toutes les cellules standardisées.
*/
public ListProperty<List<Cellule>> creerCellules(int colone, int ligne, CellulesVivantes observer){ public ListProperty<List<Cellule>> creerCellules(int colone, int ligne, CellulesVivantes observer){
ObservableList<List<Cellule>> cellsInit = FXCollections.observableArrayList(); ObservableList<List<Cellule>> cellsInit = FXCollections.observableArrayList();
ListProperty<List<Cellule>> cells = new SimpleListProperty<>(cellsInit); ListProperty<List<Cellule>> cells = new SimpleListProperty<>(cellsInit);
@ -41,12 +72,17 @@ public class CreateurCellule implements ICreateurCellule {
} }
return cells; return cells;
} }
/**
* Créer une ligne de cellule
* @param ligne nombre de ligne à créer
* @return Les lignes avec les cellules.
*/
public List<Cellule> creerLigneCellule(int ligne){ public List<Cellule> creerLigneCellule(int ligne){
List<Cellule> cells = new LinkedList<>(); List<Cellule> cells = new LinkedList<>();
for(int i=0; i<ligne; ++i){ for(int i=0; i<ligne; ++i){
cells.add(new Cellule(i, ligne)); cells.add(new Cellule(i, ligne));
} }
++h;
return cells; return cells;
} }
} }

@ -5,6 +5,17 @@ import model.cellule.Cellule;
import java.util.List; import java.util.List;
/**
* Couche d'abstraction de la création des cellules
* @author Yohann Breil
* @author Allan Point
*/
public interface ICreateurCellule { public interface ICreateurCellule {
/**
* Créer des cellules selon les dimentions précisé dans le constructeur.
* @param observer Permet d'abonner un objet CellulesVivantes à toute les cellules.
* @return Une liste observable pour fxml avec toutes les cellules standardisées .
*/
List<List<Cellule>> creerCellules(CellulesVivantes observer); List<List<Cellule>> creerCellules(CellulesVivantes observer);
} }

@ -4,7 +4,15 @@ import model.cellule.Cellule;
import java.util.*; import java.util.*;
/**
* Permet à une cellule d'être observée
* @author Yohann Breil
* @author Allan Point
*/
public abstract class ObservableCellule { public abstract class ObservableCellule {
/**
* Liste des observeurs de la boucle de jeu. Cette liste servira à notifier les abonnés de la boucle de jeu
*/
List<ObserverCellule> observeurs; List<ObserverCellule> observeurs;
public ObservableCellule(){ public ObservableCellule(){
@ -14,7 +22,7 @@ public abstract class ObservableCellule {
/** /**
* *
* @param o observeur à attacher * @param o observeur à attacher
* @throws IllegalArgumentException * @throws IllegalArgumentException L'observeur ne peut pas être null
*/ */
public void attacher(ObserverCellule o) throws IllegalArgumentException{ public void attacher(ObserverCellule o) throws IllegalArgumentException{
if(o == null){ if(o == null){
@ -26,7 +34,7 @@ public abstract class ObservableCellule {
/** /**
* *
* @param o observeur à détacher * @param o observeur à détacher
* @throws IllegalArgumentException * @throws IllegalArgumentException L'observer ne peut pas être null
*/ */
public void detacher(ObserverCellule o) throws IllegalArgumentException{ public void detacher(ObserverCellule o) throws IllegalArgumentException{
if(o == null){ if(o == null){
@ -36,7 +44,7 @@ public abstract class ObservableCellule {
} }
/** /**
* * Permet de notifier les abonnés de la boucle de jeu
*/ */
public void notifier(Cellule cellule) { public void notifier(Cellule cellule) {
for (ObserverCellule observeur : observeurs) { for (ObserverCellule observeur : observeurs) {

@ -2,6 +2,14 @@ package model.cellule.observer;
import model.cellule.Cellule; import model.cellule.Cellule;
/**
* Permet d'obbserver une boucle de jeu
* @author Yohann Breuil
* @author Allan Point
*/
public interface ObserverCellule { public interface ObserverCellule {
/**
* Réaction en cas de notification
*/
void update(Cellule cellule); void update(Cellule cellule);
} }

Loading…
Cancel
Save