Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • ImprovedMouseInteraction
  • correction_video
  • going_further
  • main
  • ModifGUI
  • final2023
  • template
7 results

Target

Select target project
  • s20026898/tp-6
  • boukenze.b/jeu-de-la-vie-tp-3
  • b22015696/game-of-life-template
  • s23026062/sahin-game-of-life-template
  • m22023183/game-of-life-MALEK
  • z23012739/game-of-life-template
  • p23021107/poussardin-malo-game-of-life-template
  • o21225801/game-of-life-template
  • alaboure/game-fo-life-template
  • t22007439/game-of-life-toullec
  • b23021750/game-of-life
  • c22029830/game-of-life-template-rafi
  • b23025683/game-of-life-template-tp-6
  • gnaves/game-of-life-template
  • a22025223/game-of-life-template-cristel
  • f22024692/game-of-life-template-paolo-mathis-erwan
  • t21233923/game-fo-life-template
  • h21231335/game-fo-life-template
  • l22023519/game-of-life-template-salma
  • p23020787/game-of-life-template
  • b21232450/game-of-life-template
  • s22031458/game-of-life
  • n21223697/tp-4-ngom
  • a22027291/game-of-life-of-salim
  • k22029508/tp-4
  • s19033421/game-of-life-template
  • b21229750/jeu-de-la-vie-tp-3
  • saddem.r/game-of-life-template
  • l3_s3_infoamu/s3/programmation-2/game-fo-life-template
29 results
Select Git revision
  • ImprovedMouseInteraction
  • correction_video
  • going_further
  • main
  • ModifGUI
  • final2023
  • template
7 results
Show changes
Commits on Source (5)
Showing
with 293 additions and 345 deletions
......@@ -4,7 +4,7 @@ plugins {
}
javafx {
version = "20"
version = "22"
modules = [ 'javafx.controls', 'javafx.fxml' ]
}
......
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
......@@ -7,8 +7,7 @@ import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import model.CellularAutomatonSimulation;
import model.automata.BiColorAutomaton;
import model.automata.SeedsAutomaton;
import model.automata.GameOfLifeAutomaton;
import java.io.IOException;
import java.net.URL;
......@@ -38,7 +37,7 @@ public class SimulatorApplication extends Application {
public SimulatorApplication() {
this.simulation =
new CellularAutomatonSimulation<>(
new BiColorAutomaton(NUMBER_OF_COLUMNS,NUMBER_OF_ROWS),
new GameOfLifeAutomaton(NUMBER_OF_COLUMNS,NUMBER_OF_ROWS),
GENERATOR
);
}
......
package controller;
import datastruct.Coordinate;
import matrix.Coordinate;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
......@@ -11,7 +11,6 @@ import javafx.scene.control.Label;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.util.Duration;
import model.CellularAutomatonSimulation;
import view.MatrixPane;
import static java.util.Objects.requireNonNull;
......@@ -51,13 +50,6 @@ public class Controller {
}
/**
* Sets {@link CellularAutomatonSimulation} instance.
*
* @param simulation {@link CellularAutomatonSimulation} instance
* @throws NullPointerException if {@code gameOfLife} is {@code null}
*/
public void setSimulation(Simulation simulation) {
this.simulation = requireNonNull(simulation, "game of life is null");
setGenerationNumberLabelTextProperty();
......
package controller;
import datastruct.Coordinate;
import matrix.Coordinate;
import javafx.scene.paint.Color;
import model.OnChangeListener;
......
package datastruct;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Represents a matrix, a rectangular array, with generic values in each cell.
*
* @param <T> The type of values stored in the matrix cells.
*/
public class Matrix<T> implements Iterable<T> {
private final List<List<T>> matrix;
private final int width;
private final int height;
/**
* Creates a new {@link Matrix} with the specified width, height, and an initializer to set
* values.
*
* @param width The width of the {@link Matrix}.
* @param height The height of the {@link Matrix}.
* @param initializer A matrix initializer to set values in the {@link Matrix}.
*/
public Matrix(int width, int height, MatrixInitializer<T> initializer) {
this.width = width;
this.height = height;
this.matrix = new ArrayList<>();
this.initializeWith(initializer);
}
/**
* Creates a new {@link Matrix} with the specified width, height, and initial value for all
* cells.
*
* @param width The width of the {@link Matrix}.
* @param height The height of the {@link Matrix}.
* @param initialValue The initial value to set in all cells of the {@link Matrix}.
*/
public Matrix(int width, int height, T initialValue) {
this(width, height, new ConstantMatrixInitializer<>(initialValue));
}
private void initializeWith(MatrixInitializer<T> initializer) {
for (int x = 0; x < width; x++) {
List<T> row = new ArrayList<>();
this.matrix.add(row);
for (int y = 0; y < height; y++) {
row.add(initializer.initialValueAt(Coordinate.of(x, y)));
}
}
}
/**
* Returns the width of the {@link Matrix}.
*
* @return The width of the {@link Matrix}.
*/
public int width() {
return width;
}
/**
* Returns the height of the {@link Matrix}.
*
* @return The height of the {@link Matrix}.
*/
public int height() {
return height;
}
/**
* Gets the value at the specified coordinates (x, y) in the {@link Matrix}.
*
* @param x The x-coordinate.
* @param y The y-coordinate.
* @return The value at the specified coordinates.
*/
public T get(int x, int y) {
return this.matrix.get(x).get(y);
}
/**
* Gets the value at the specified {@link Coordinate} in the {@link Matrix}.
*
* @param coordinate The {@link Coordinate}.
* @return The value at the specified {@link Coordinate}.
*/
public T get(Coordinate coordinate) {
return this.get(coordinate.x(), coordinate.y());
}
/**
* Sets the value at the specified coordinates (x, y) in the {@link Matrix}.
*
* @param x The x-coordinate.
* @param y The y-coordinate.
* @param value The value to set at the specified coordinates.
*/
public void set(int x, int y, T value) {
this.matrix.get(x).set(y, value);
}
/**
* Sets the value at the specified {@link Coordinate} in the {@link Matrix}.
*
* @param coordinate The {@link Coordinate}.
* @param value The value to set at the specified {@link Coordinate}.
*/
public void set(Coordinate coordinate, T value) {
this.set(coordinate.x(), coordinate.y(), value);
}
/**
* Returns an {@link Iterator} that allows iterating over the elements in the {@link Matrix} in
* row-major order.
*
* @return An {@link Iterator} for the {@link Matrix}.
*/
public Iterator<T> iterator() {
Iterator<Coordinate> coordIterator = this.coordinatesIterator();
return new MatrixIterator<>(this, coordIterator);
}
/**
* Returns an {@link Iterable} that provides access to the {@link Coordinate}s of the
* {@link Matrix} in row-major order. This means that a {@code for} loop on a {@link Matrix}
* will loop over the coordinates of the {@link Matrix}.
*
* @return An {@link Iterable} for the {@link Coordinate}s of the {@link Matrix}.
*/
public Iterable<Coordinate> coordinates() {
return this::coordinatesIterator;
}
/**
* Returns an {@link Iterator} that allows iterating over the {@link Coordinate}s in the
* {@link Matrix} in row-major order.
*
* @return An {@link Iterator} for the {@link Matrix}.
*/
private Iterator<Coordinate> coordinatesIterator() {
return new CoordinateIterator(this.width, this.height);
}
/**
* Returns a lens for accessing and modifying the value at the specified coordinates (x, y) in
* the {@link Matrix}.
*
* @param x The x-coordinate.
* @param y The y-coordinate.
* @return A lens for the specified coordinates.
*/
public Lens<T> at(int x, int y) {
return new Lens<T>() {
@Override
public T get() {
return Matrix.this.get(x, y);
}
@Override
public void set(T value) {
Matrix.this.set(x, y, value);
}
};
}
/**
* Returns a lens for accessing and modifying the value at the specified coordinate in the
* {@link Matrix}.
*
* @param coordinate The {@link Coordinate}.
* @return A lens for the specified {@link Coordinate}.
*/
public Lens<T> at(Coordinate coordinate) {
return this.at(coordinate.x(), coordinate.y());
}
}
package datastruct;
package matrix;
public class ConstantMatrixInitializer<T> implements MatrixInitializer<T> {
private final T constant;
// TODO: add instance variables
public ConstantMatrixInitializer(T constant) {
// TODO
}
public ConstantMatrixInitializer(T constant) {
this.constant = constant;
}
@Override
public T initialValueAt(Coordinate coordinate) {
return constant;
// TODO
return null;
}
}
package datastruct;
package matrix;
import java.util.ArrayList;
import java.util.List;
/**
......@@ -16,7 +15,8 @@ public record Coordinate(int x, int y) {
* @return A new {@link Coordinate} instance.
*/
public static Coordinate of(int x, int y) {
return new Coordinate(x, y);
// TODO: compléter ce fabriquant
return null;
}
/**
......@@ -25,7 +25,8 @@ public record Coordinate(int x, int y) {
* @return The left adjacent {@link Coordinate}.
*/
public Coordinate left() {
return new Coordinate(x - 1, y);
// TODO: à compléter
return null;
}
/**
......@@ -34,7 +35,8 @@ public record Coordinate(int x, int y) {
* @return The right adjacent {@link Coordinate}.
*/
public Coordinate right() {
return new Coordinate(x + 1, y);
// TODO: à compléter
return null;
}
/**
......@@ -43,7 +45,8 @@ public record Coordinate(int x, int y) {
* @return The above adjacent {@link Coordinate}.
*/
public Coordinate above() {
return new Coordinate(x, y + 1);
// TODO: à compléter
return null;
}
/**
......@@ -52,50 +55,76 @@ public record Coordinate(int x, int y) {
* @return The below adjacent {@link Coordinate}.
*/
public Coordinate below() {
return new Coordinate(x, y - 1);
// TODO: à compléter
return null;
}
/**
* Computes and returns a list of orthogonal (adjacent in horizontal or vertical direction) neighbors.
*
* | | | |
* ---------
* | |X| |
* ---------
* |X|O|X|
* ---------
* | |X| |
* ---------
* | | | |
* @return A list of orthogonal neighboring {@link Coordinate}s.
*/
public List<Coordinate> orthogonalNeighbours() {
return List.of(
this.right(),
this.left(),
this.above(),
this.below()
);
// TODO: à compléter
return List.of();
}
/**
* Computes and returns a list of diagonal (adjacent in diagonal direction) neighbors.
* | | | |
* ---------
* |X| |X|
* ---------
* | |O| |
* ---------
* |X| |X|
* ---------
* | | | |
*
* @return A list of diagonal neighboring {@link Coordinate}s.
*/
public List<Coordinate> diagonalNeighbours() {
return List.of(
this.right().above(),
this.left().above(),
this.left().below(),
this.right().below()
);
// TODO: à compléter
return List.of();
}
/**
* Computes and returns a list of all orthogonal and diagonal neighbors.
* * | | | |
* * ---------
* * |X|X|X|
* * ---------
* * |X|O|X|
* * ---------
* * |X|X|X|
* * ---------
* * | | | |
*
* @return A list of all neighboring {@link Coordinate}s.
*/
public List<Coordinate> orthodiagonalNeighbours() {
List<Coordinate> neighbours = new ArrayList<>(this.orthogonalNeighbours());
neighbours.addAll(this.diagonalNeighbours());
return neighbours;
// TODO: à compléter
return List.of();
}
@Override
public String toString() {
return "(" + this.x + "," + this.y + ")";
}
public Coordinate minus(Coordinate corner) {
return new Coordinate(this.x - corner.x, this.y - corner.y);
}
public Coordinate plus(Coordinate corner) {
return new Coordinate(this.x + corner.x, this.y + corner.y);
}
}
\ No newline at end of file
package datastruct;
package matrix;
import java.util.Iterator;
import java.util.NoSuchElementException;
......@@ -8,10 +8,6 @@ import java.util.NoSuchElementException;
* height range.
*/
class CoordinateIterator implements Iterator<Coordinate> {
private final int width;
private final int height;
private int x = 0;
private int y = 0;
/**
* Creates a new {@link CoordinateIterator} with the specified width and height.
......@@ -20,8 +16,7 @@ class CoordinateIterator implements Iterator<Coordinate> {
* @param height The height of the coordinate range.
*/
public CoordinateIterator(int width, int height) {
this.width = width;
this.height = height;
// TODO: à compléter
}
/**
......@@ -31,7 +26,8 @@ class CoordinateIterator implements Iterator<Coordinate> {
*/
@Override
public boolean hasNext() {
return y < this.height;
// TODO: à compléter
return false;
}
/**
......@@ -42,15 +38,7 @@ class CoordinateIterator implements Iterator<Coordinate> {
*/
@Override
public Coordinate next() {
if (!this.hasNext()) {
throw new NoSuchElementException();
}
Coordinate coordinate = new Coordinate(this.x, this.y);
this.x = this.x + 1;
if (this.x == this.width) {
this.x = 0;
this.y = this.y + 1;
}
return coordinate;
// TODO: à compléter
return null;
}
}
package matrix;
import java.util.List;
/**
* Represents a matrix, a rectangular array, with generic values in each cell.
*
* @param <T> The type of values stored in the matrix cells.
*/
public class ListMatrix<T> implements Matrix<T> {
private final List<List<T>> matrix;
private final int width;
private final int height;
/**
* Creates a new {@link ListMatrix} with the specified width, height, and an initializer to set
* values.
*
* @param width The width of the {@link ListMatrix}.
* @param height The height of the {@link ListMatrix}.
* @param initializer A matrix initializer to set values in the {@link ListMatrix}.
*/
public ListMatrix(int width, int height, MatrixInitializer<T> initializer) {
// TODO
this.width = 0;
this.height = 0;
this.matrix = null;
this.initializeWith(initializer); // fills the matrix using initializer
}
public ListMatrix(int width, int height, T constant) {
this(width, height, new ConstantMatrixInitializer<>(constant));
}
private void initializeWith(MatrixInitializer<T> initializer) {
// TODO initialize each cell of the matrix, with a value determined by initializer
}
public int width() {
// TODO
return 0;
}
public int height() {
// TODO
return 0;
}
@Override
public T get(int x, int y) {
// TODO
return null;
}
@Override
public void set(int x, int y, T newValue) {
// TODO
}
public Matrix<T> subMatrix(Coordinate corner, int width, int height) {
// TODO
return this;
}
}
package matrix;
import java.util.Iterator;
public interface Matrix<T> extends Iterable<T> {
/**
* Returns the width of the {@link Matrix}.
*
* @return The width of the {@link Matrix}.
*/
int width();
/**
* Returns the height of the {@link Matrix}.
*
* @return The height of the {@link Matrix}.
*/
int height();
/**
* Returns the value at the specified coordinates (x, y) in
* the {@link Matrix}.
*
* @param x The x-coordinate.
* @param y The y-coordinate.
* @return The content of the matrix at the coordinates (x,y).
*/
T get(int x, int y);
/**
* Returns the value at the specified coordinates (x, y) in
* the {@link Matrix}.
*
* @param coordinate The coordinates (x,y).
* @return The content of the matrix at the coordinates (x,y).
*/
default T get(Coordinate coordinate) {
return this.get(coordinate.x(), coordinate.y());
}
/**
* Changes the value at the specified coordinates (x,y) in the {@link Matrix}
*
* @param x the x-coordinate
* @param y the y-coordinate
* @param newValue the value to assign to coordinates (x,y).
*/
void set(int x, int y, T newValue);
/**
* Changes the value at the specified coordinates (x,y) in the {@link Matrix}
*
* @param coordinate The coordinates (x,y)
* @param newValue the value to assign to coordinates (x,y).
*/
default void set(Coordinate coordinate, T newValue) {
this.set(coordinate.x(), coordinate.y(), newValue);
}
Matrix<T> subMatrix(Coordinate corner, int width, int height);
/**
* Returns an {@link Iterable} that provides access to the {@link Coordinate}s of the
* {@link Matrix} in row-major order. This means that a {@code for} loop on a {@link Matrix}
* will loop over the coordinates of the {@link Matrix}.
*
* @return An {@link Iterable} for the {@link Coordinate}s of the {@link Matrix}.
*/
default Iterable<Coordinate> coordinates() {
return () -> new CoordinateIterator(this.width(), this.height());
}
/**
* Returns an {@link Iterator} that allows iterating over the elements in the {@link Matrix} in
* row-major order.
*
* @return An {@link Iterator} for the {@link Matrix}.
*/
default Iterator<T> iterator() {
Iterator<Coordinate> coords =
new CoordinateIterator(this.width(),this.height());
return new MatrixIterator<>(this, coords);
}
}
package datastruct;
package matrix;
/**
* An interface for initializing a {@link Matrix} by providing initial values for each cell.
* An interface for initializing a {@link ListMatrix} by providing initial values for each cell.
*
* @param <T> The type of values to initialize the {@link Matrix} with.
* @param <T> The type of values to initialize the {@link ListMatrix} with.
*/
public interface MatrixInitializer<T> {
/**
* Returns the initial value to be set in a {@link Matrix} cell at the specified
* Returns the initial value to be set in a {@link ListMatrix} cell at the specified
* {@link Coordinate}.
*
* @param coordinate The {@link Coordinate} at which to set the initial value.
......
package datastruct;
package matrix;
import java.util.Iterator;
import java.util.NoSuchElementException;
......
package model;
import datastruct.Lens;
import java.util.ArrayList;
import java.util.List;
......@@ -12,7 +10,10 @@ import java.util.List;
* @param <T> The type of value stored in the cell.
*/
public class Cell<T> implements Lens<T> {
private T content;
//TODO: ajouter la ou les propriétés nécessaires
// la liste des objets écoutant les modifications du contenu de la cellule
private final List<OnChangeListener<T>> listeners = new ArrayList<>();
/** Initialize a new cell with a given value.
......@@ -20,7 +21,7 @@ public class Cell<T> implements Lens<T> {
* @param initialContent the value initially stored by the cell.
*/
public Cell(T initialContent) {
this.content = initialContent;
//TODO: à compléter
}
/** Add a {@link OnChangeListener} to react to any change of value in the cell.
......@@ -39,11 +40,8 @@ public class Cell<T> implements Lens<T> {
* @param value the new content of this {@link Cell}
*/
public void set(T value) {
T oldValue = this.content;
this.content = value;
for (OnChangeListener<T> listener : this.listeners) {
listener.valueChanged(oldValue, value);
}
//TODO: modifier le contenu de la cellule, puis appeler les méthodes valueChanged des
// listeners
}
/**
......@@ -52,6 +50,7 @@ public class Cell<T> implements Lens<T> {
* @return the current content of this {@link Cell}
*/
public T get(){
return this.content;
//TODO: à compléter
return null;
}
}
package model;
import controller.Simulation;
import datastruct.Coordinate;
import datastruct.Matrix;
import matrix.Coordinate;
import matrix.ListMatrix;
import javafx.scene.paint.Color;
import java.util.Iterator;
......@@ -18,7 +18,7 @@ import java.util.Random;
public class CellularAutomatonSimulation<S extends State<S>>
implements Simulation {
private final Matrix<Cell<S>> grid;
private final ListMatrix<Cell<S>> grid;
private final Cell<Integer> generationNumber = new Cell<>(0);
private final CellularAutomaton<S> automaton;
private final Random generator;
......@@ -31,7 +31,7 @@ public class CellularAutomatonSimulation<S extends State<S>>
*/
public CellularAutomatonSimulation(CellularAutomaton<S> automaton, Random generator) {
this.automaton = automaton;
this.grid = new Matrix<>(
this.grid = new ListMatrix<>(
automaton.numberOfColumns(),
automaton.numberOfRows(),
new ConstantCellInitializer<>(automaton.defaultState())
......@@ -42,12 +42,14 @@ public class CellularAutomatonSimulation<S extends State<S>>
@Override
public int numberOfColumns() {
return this.grid.width();
//TODO: à compléter
return 0;
}
@Override
public int numberOfRows() {
return this.grid.height();
//TODO: à compléter
return 0;
}
/**
......@@ -57,45 +59,38 @@ public class CellularAutomatonSimulation<S extends State<S>>
* @return The cell at the specified coordinate.
*/
public Cell<S> at(Coordinate coordinate) {
return this.grid.get(coordinate);
//TODO: à compléter
return null;
}
@Override
public void updateToNextGeneration() {
this.generationNumber.set(this.generationNumber.get()+1);
Matrix<S> nextStates = this.nextGenerationMatrix();
for (Coordinate coordinate : this.grid.coordinates()) {
this.at(coordinate).set(nextStates.get(coordinate));
}
//TODO: à compléter, en utilisant nextGenerationMatrix()
}
/** Computes the {@link Matrix} of states obtained after a single step of updates
/** Computes the {@link ListMatrix} of states obtained after a single step of updates
* of the simulation.
*
* @return the states of each cell after one generation
*/
private Matrix<S> nextGenerationMatrix() {
return new Matrix<>(
this.grid.width(),
this.grid.height(),
new NextGenerationInitializer<>(this)
);
private ListMatrix<S> nextGenerationMatrix() {
//TODO: à compléter
return null;
}
@Override
public void next(Coordinate coordinate) {
S oldState = this.grid.get(coordinate).get();
this.at(coordinate).set(oldState.next());
//TODO: à compléter
}
@Override
public void copy(Coordinate source, Coordinate destination) {
S state = this.at(source).get();
this.at(destination).set(state);
//TODO: à compléter
}
@Override
public Color getColor(Coordinate coordinate) {
return this.at(coordinate).get().getColor();
//TODO: à compléter
return null;
}
@Override
......@@ -113,19 +108,13 @@ public class CellularAutomatonSimulation<S extends State<S>>
@Override
public void clear() {
for (Cell<S> cell : this.grid) {
cell.set(this.automaton.defaultState());
}
this.generationNumber.set(0);
//TODO: à compléter (penser à remettre le nombre de génération à 0)
}
@Override
public void reset() {
for (Cell<S> cell : this.grid) {
cell.set(this.automaton.randomState(generator));
}
this.generationNumber.set(0);
//TODO: à compléter (penser à remettre le nombre de génération à 0)
}
@Override
......
package model;
import datastruct.Coordinate;
import datastruct.Matrix;
import datastruct.MatrixInitializer;
import matrix.Coordinate;
import matrix.ListMatrix;
import matrix.MatrixInitializer;
/**
* An initializer for {@link Matrix} of {@link Cell}s, where each cell is initialized to the
* An initializer for {@link ListMatrix} of {@link Cell}s, where each cell is initialized to the
* same value.
*
* @param <T> the type of content of each cell
*/
public class ConstantCellInitializer<T> implements MatrixInitializer<Cell<T>> {
private final T defaultValue;
//TODO: ajouter la/les propriétes nécessaires
/** Make a new {@link MatrixInitializer} with cells containing a {@link Cell} with the same
* value.
......@@ -19,11 +19,12 @@ public class ConstantCellInitializer<T> implements MatrixInitializer<Cell<T>> {
* @param defaultValue the value stored in each cell.
*/
public ConstantCellInitializer(T defaultValue) {
this.defaultValue = defaultValue;
//TODO: à compléter
}
@Override
public Cell<T> initialValueAt(Coordinate coordinate) {
return new Cell<>(defaultValue);
//TODO: à compléter
return null;
}
}
package datastruct;
package model;
/**
* A lens interface representing a view into a mutable state.
......
package model;
import datastruct.Coordinate;
import datastruct.MatrixInitializer;
import datastruct.Matrix;
import matrix.Coordinate;
import matrix.MatrixInitializer;
import matrix.ListMatrix;
import controller.Simulation;
import java.util.ArrayList;
import java.util.List;
/**
* An initializer for a {@link Matrix} of states, where each state is computed based on the value
* An initializer for a {@link ListMatrix} of states, where each state is computed based on the value
* of its neighbours in a {@link Simulation} of a cellular automaton.
*
* @param <S> the type of states in the simulation.
*/
public class NextGenerationInitializer<S extends State<S>> implements MatrixInitializer<S> {
private final CellularAutomatonSimulation<S> simulation;
//TODO: ajouter les propriétés nécessaires
/** Create a {@link MatrixInitializer} to compute the next generation in
* a 2D cellular automaton.
......@@ -23,18 +21,13 @@ public class NextGenerationInitializer<S extends State<S>> implements MatrixInit
* @param simulation the {@link Simulation} representing the cellular automaton.
*/
public NextGenerationInitializer(CellularAutomatonSimulation<S> simulation) {
this.simulation = simulation;
//TODO: à compléter
}
@Override
public S initialValueAt(Coordinate coordinate) {
List<State<S>> neighbours = new ArrayList<>();
for (Coordinate neighbourCoord : coordinate.orthodiagonalNeighbours()) {
Coordinate wrapped = wrap(neighbourCoord);
neighbours.add(this.simulation.at(wrapped).get());
}
S state = this.simulation.at(coordinate).get();
return state.update(neighbours);
//TODO: à compléter
return null;
}
/** Computes the grid {@link Coordinate} for an arbitrary {@link Coordinate}, even outside
......@@ -45,11 +38,11 @@ public class NextGenerationInitializer<S extends State<S>> implements MatrixInit
* @param coordinate a {@link Coordinate} that may be outside the grid.
* @return a corresponding {@link Coordinate}, that is inside the grid.
*/
private Coordinate wrap(Coordinate coordinate) {
return new Coordinate(
modulo(coordinate.x(),this.simulation.numberOfColumns()),
modulo(coordinate.y(),this.simulation.numberOfRows())
);
Coordinate wrap(Coordinate coordinate) {
//TODO: à compléter
//Il faut recalculer les coordonnées x et y modulo les dimensions de la grille.
//Pour le modulo, utiliser la fonction ci-dessous, qui s'assure que le résultat est positif.
return null;
}
/** The non-negative remainder of n divided by d.
......@@ -58,7 +51,7 @@ public class NextGenerationInitializer<S extends State<S>> implements MatrixInit
* @param d a non-zero integer.
* @return the remainder of {@code n/d}, between {@code 0} and {@code n-1}.
*/
private static int modulo(int n, int d) {
static int modulo(int n, int d) {
int result = n % d;
return n < 0 ? result + d : result;
}
......
......@@ -44,12 +44,7 @@ public interface State<S> {
* @return The number of times the specified state appears in the list of neighbors.
*/
static <T> int count(T state, List<T> neighbours) {
int count = 0;
for (T neighbour : neighbours) {
if (neighbour.equals(state)) {
count++;
}
}
return count;
//TODO: à compléter
return 0;
}
}
\ No newline at end of file
package model.automata;
import model.CellularAutomaton;
import model.State;
public abstract class AbstractAutomaton<S extends State<S>> implements CellularAutomaton<S> {
private final int numberOfColumns;
private final int numberOfRows;
protected AbstractAutomaton(int numberOfColumns, int numberOfRows) {
this.numberOfColumns = numberOfColumns;
this.numberOfRows = numberOfRows;
}
public int numberOfColumns() {
return numberOfColumns;
}
public int numberOfRows() {
return numberOfRows;
}
}