From 60370f9add521b2a6a8eb18730433baea8955822 Mon Sep 17 00:00:00 2001
From: Guyslain <guyslain.naves@lis-lab.fr>
Date: Mon, 16 Oct 2023 08:23:34 +0200
Subject: [PATCH] ajout wireworld

---
 src/main/java/SimulatorApplication.java       |  4 +-
 .../model/automata/WireWorldAutomata.java     | 39 +++++++++++++++++
 .../java/model/automata/WireWorldState.java   | 43 +++++++++++++++++++
 3 files changed, 85 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/model/automata/WireWorldAutomata.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 1e2f7b3..6f4bae3 100644
--- a/src/main/java/SimulatorApplication.java
+++ b/src/main/java/SimulatorApplication.java
@@ -9,6 +9,8 @@ import javafx.stage.Stage;
 import model.CellularAutomatonSimulation;
 import model.automata.BiColorAutomaton;
 import model.automata.SeedsAutomaton;
+import model.automata.WireWorldAutomata;
+import model.automata.WireWorldState;
 
 import java.io.IOException;
 import java.net.URL;
@@ -38,7 +40,7 @@ public class SimulatorApplication extends Application {
   public SimulatorApplication() {
     this.simulation =
       new CellularAutomatonSimulation<>(
-              new BiColorAutomaton(NUMBER_OF_COLUMNS,NUMBER_OF_ROWS),
+              new WireWorldAutomata(NUMBER_OF_COLUMNS,NUMBER_OF_ROWS),
               GENERATOR
       );
   }
diff --git a/src/main/java/model/automata/WireWorldAutomata.java b/src/main/java/model/automata/WireWorldAutomata.java
new file mode 100644
index 0000000..f476a25
--- /dev/null
+++ b/src/main/java/model/automata/WireWorldAutomata.java
@@ -0,0 +1,39 @@
+package model.automata;
+
+import model.CellularAutomaton;
+
+import java.util.Random;
+
+public class WireWorldAutomata implements CellularAutomaton<WireWorldState> {
+
+    private final int numberOfColumns;
+    private final int numberOfRows;
+
+    public WireWorldAutomata(int numberOfColumns, int numberOfRows) {
+        this.numberOfColumns = numberOfColumns;
+        this.numberOfRows = numberOfRows;
+    }
+
+    @Override
+    public int numberOfColumns() {
+        return this.numberOfColumns;
+    }
+
+    @Override
+    public int numberOfRows() {
+        return this.numberOfRows;
+    }
+
+    @Override
+    public WireWorldState defaultState() {
+        return WireWorldState.DEAD;
+    }
+
+    @Override
+    public WireWorldState randomState(Random generator) {
+        int r = generator.nextInt(18);
+        return r < 5 ? WireWorldState.CONDUCTOR:
+               r == 5 ? WireWorldState.HEAD:
+                 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..63b89a2
--- /dev/null
+++ b/src/main/java/model/automata/WireWorldState.java
@@ -0,0 +1,43 @@
+package model.automata;
+
+import javafx.scene.paint.Color;
+import model.State;
+
+import java.util.List;
+
+public enum WireWorldState implements State<WireWorldState> {
+    DEAD, CONDUCTOR, HEAD, TAIL;
+
+    @Override
+    public Color getColor() {
+        return switch (this) {
+            case DEAD -> Color.BLACK;
+            case CONDUCTOR -> Color.GOLD;
+            case HEAD -> Color.BLUE;
+            case TAIL -> Color.RED;
+        };
+    }
+
+    @Override
+    public WireWorldState next() {
+        return switch (this) {
+            case DEAD -> CONDUCTOR;
+            case CONDUCTOR -> HEAD;
+            case HEAD -> TAIL;
+            case TAIL -> DEAD;
+        };
+    }
+
+    @Override
+    public WireWorldState update(List<WireWorldState> neighbours) {
+        return switch (this) {
+            case DEAD -> DEAD;
+            case CONDUCTOR -> {
+                int heads = State.count(HEAD,neighbours);
+                yield heads == 1 || heads == 2 ? HEAD: CONDUCTOR;
+            }
+            case HEAD -> TAIL;
+            case TAIL -> CONDUCTOR;
+        };
+    }
+}
-- 
GitLab