From 53447461a52debf7ff91d80f0fa222d88a321126 Mon Sep 17 00:00:00 2001
From: Guyslain <guyslain.naves@lis-lab.fr>
Date: Mon, 23 Oct 2023 16:50:33 +0200
Subject: [PATCH] Ajout Wireworld

---
 src/main/java/SimulatorApplication.java       |  3 +-
 .../model/automata/WireWorldAutomaton.java    | 39 ++++++++++++++++
 .../java/model/automata/WireWorldState.java   | 44 +++++++++++++++++++
 3 files changed, 85 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/model/automata/WireWorldAutomaton.java
 create mode 100644 src/main/java/model/automata/WireWorldState.java

diff --git a/src/main/java/SimulatorApplication.java b/src/main/java/SimulatorApplication.java
index 7e2a01d..1b933b4 100644
--- a/src/main/java/SimulatorApplication.java
+++ b/src/main/java/SimulatorApplication.java
@@ -8,6 +8,7 @@ import javafx.scene.Scene;
 import javafx.stage.Stage;
 import model.CellularAutomatonSimulation;
 import model.automata.GameOfLifeAutomaton;
+import model.automata.WireWorldAutomaton;
 
 import java.io.IOException;
 import java.net.URL;
@@ -37,7 +38,7 @@ public class SimulatorApplication extends Application {
   public SimulatorApplication() {
     this.simulation =
       new CellularAutomatonSimulation<>(
-              new GameOfLifeAutomaton(NUMBER_OF_COLUMNS,NUMBER_OF_ROWS),
+              new WireWorldAutomaton(NUMBER_OF_COLUMNS,NUMBER_OF_ROWS),
               GENERATOR
       );
   }
diff --git a/src/main/java/model/automata/WireWorldAutomaton.java b/src/main/java/model/automata/WireWorldAutomaton.java
new file mode 100644
index 0000000..5ee116d
--- /dev/null
+++ b/src/main/java/model/automata/WireWorldAutomaton.java
@@ -0,0 +1,39 @@
+package model.automata;
+
+import model.CellularAutomaton;
+
+import java.util.Random;
+
+import static model.automata.WireWorldState.WIRE;
+
+public class WireWorldAutomaton implements CellularAutomaton<WireWorldState> {
+
+    private final int numberOfColumns;
+    private final int numberOfRows;
+
+    public WireWorldAutomaton(int numberOfColumns, int numberOfRows) {
+        this.numberOfColumns = numberOfColumns;
+        this.numberOfRows = numberOfRows;
+    }
+
+    @Override
+    public int numberOfColumns() {
+        return numberOfColumns;
+    }
+
+    @Override
+    public int numberOfRows() {
+        return numberOfRows;
+    }
+
+    @Override
+    public WireWorldState defaultState() {
+        return WireWorldState.DEAD;
+    }
+
+    @Override
+    public WireWorldState randomState(Random generator) {
+        int r = generator.nextInt(10);
+        return r < 3 ? WireWorldState.WIRE: WireWorldState.DEAD;
+    }
+}
diff --git a/src/main/java/model/automata/WireWorldState.java b/src/main/java/model/automata/WireWorldState.java
new file mode 100644
index 0000000..4d94fd2
--- /dev/null
+++ b/src/main/java/model/automata/WireWorldState.java
@@ -0,0 +1,44 @@
+package model.automata;
+
+import javafx.scene.paint.Color;
+import model.State;
+
+import java.util.List;
+
+public enum WireWorldState implements State<WireWorldState> {
+    DEAD, WIRE, BLUE, RED;
+
+
+    @Override
+    public Color getColor() {
+        return switch (this) {
+            case DEAD -> Color.BLACK;
+            case WIRE -> Color.GOLD;
+            case BLUE -> Color.BLUE;
+            case RED -> Color.RED;
+        };
+    }
+
+    @Override
+    public WireWorldState cycle() {
+        return switch (this) {
+            case DEAD -> WIRE;
+            case WIRE -> BLUE;
+            case BLUE -> RED;
+            case RED -> DEAD;
+        };
+    }
+
+    @Override
+    public WireWorldState update(List<WireWorldState> neighbours) {
+        return switch (this) {
+            case DEAD -> DEAD;
+            case WIRE -> {
+                int countBlues = State.count(BLUE, neighbours);
+                yield (countBlues == 1 || countBlues == 2)? BLUE: WIRE;
+            }
+            case BLUE -> RED;
+            case RED -> WIRE;
+        };
+    }
+}
-- 
GitLab