From 9deaf0d560b2d9a43f6afabef9a201e351638ae1 Mon Sep 17 00:00:00 2001 From: Tom Fiodorov Date: Fri, 24 May 2019 06:33:47 +0100 Subject: [PATCH 1/4] adding build and serialisation --- .gitignore | 3 +++ build.gradle | 22 ++++++++++++++++++++++ src/test/java/usr/cxh/BlobTest.java | 14 ++++++++++++++ src/usr/cxh/canvas/Blob.java | 7 +++++++ 4 files changed, 46 insertions(+) create mode 100644 build.gradle create mode 100644 src/test/java/usr/cxh/BlobTest.java diff --git a/.gitignore b/.gitignore index ba077a4..cf21804 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ bin +build/ +.gradle +*.class diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..6add0f9 --- /dev/null +++ b/build.gradle @@ -0,0 +1,22 @@ +apply plugin: 'java' +apply plugin: 'application' + +sourceCompatibility = 1.8 + +mainClassName = 'usr.cxh.canvas.BlobWindow' + +sourceSets.main.java.srcDirs = ['src/usr'] + +repositories { + mavenCentral() +} + +test { + useJUnitPlatform() +} + +dependencies { + implementation 'com.google.code.gson:gson:2.8.5' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1' +} diff --git a/src/test/java/usr/cxh/BlobTest.java b/src/test/java/usr/cxh/BlobTest.java new file mode 100644 index 0000000..0766757 --- /dev/null +++ b/src/test/java/usr/cxh/BlobTest.java @@ -0,0 +1,14 @@ +package usr.cxh.canvas; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class BlobTest { + @Test + public void testToJson() { + Arena arena = new Arena(100, 100); + Blob blob = new Blob(10, 30, arena); + String s = blob.toJson(); + assertEquals(s, "{\"food\":0.0,\"energy\":100.0,\"size\":10.0,\"speed\":1.0,\"senseRadius\":100.0,\"algae\":10.0,\"_color\":{\"value\":-14785436,\"falpha\":0.0},\"_secondaryColor\":{\"value\":-15382970,\"falpha\":0.0},\"_arena\":{\"blobs\":[],\"food\":[],\"_arenaWidth\":100,\"_arenaHeight\":100,\"winners\":[]},\"strat\":\"ROAM\",\"kills\":0,\"roamTarget\":{\"x\":255.0,\"y\":265.0},\"x\":10.0,\"y\":30.0}"); + } +} diff --git a/src/usr/cxh/canvas/Blob.java b/src/usr/cxh/canvas/Blob.java index 65b276d..539d0ca 100644 --- a/src/usr/cxh/canvas/Blob.java +++ b/src/usr/cxh/canvas/Blob.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.List; +import com.google.gson.Gson; + public class Blob extends Positional { double food = 0; @@ -174,4 +176,9 @@ public void reset() { food = 0; strat = Strat.ROAM; } + + public String toJson() { + Gson gson = new Gson(); + return gson.toJson(this); + } } From f2356b6731158d05b097f8e8612b81a5a9a98303 Mon Sep 17 00:00:00 2001 From: Tom Fiodorov Date: Fri, 24 May 2019 21:33:15 +0100 Subject: [PATCH 2/4] remove _arena --- src/test/java/usr/cxh/BlobTest.java | 5 ++-- src/usr/cxh/canvas/Arena.java | 6 ++--- src/usr/cxh/canvas/Blob.java | 40 ++++++++++++++--------------- src/usr/cxh/canvas/BlobWindow.java | 2 +- 4 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/test/java/usr/cxh/BlobTest.java b/src/test/java/usr/cxh/BlobTest.java index 0766757..112df59 100644 --- a/src/test/java/usr/cxh/BlobTest.java +++ b/src/test/java/usr/cxh/BlobTest.java @@ -6,9 +6,8 @@ public class BlobTest { @Test public void testToJson() { - Arena arena = new Arena(100, 100); - Blob blob = new Blob(10, 30, arena); + Blob blob = new Blob(10, 30); String s = blob.toJson(); - assertEquals(s, "{\"food\":0.0,\"energy\":100.0,\"size\":10.0,\"speed\":1.0,\"senseRadius\":100.0,\"algae\":10.0,\"_color\":{\"value\":-14785436,\"falpha\":0.0},\"_secondaryColor\":{\"value\":-15382970,\"falpha\":0.0},\"_arena\":{\"blobs\":[],\"food\":[],\"_arenaWidth\":100,\"_arenaHeight\":100,\"winners\":[]},\"strat\":\"ROAM\",\"kills\":0,\"roamTarget\":{\"x\":255.0,\"y\":265.0},\"x\":10.0,\"y\":30.0}"); + assertEquals(s, "{\"food\":0.0,\"energy\":100.0,\"size\":10.0,\"speed\":1.0,\"senseRadius\":100.0,\"algae\":10.0,\"_color\":{\"value\":-14785436,\"falpha\":0.0},\"_secondaryColor\":{\"value\":-15382970,\"falpha\":0.0},\"strat\":\"ROAM\",\"kills\":0,\"roamTarget\":{\"x\":255.0,\"y\":265.0},\"x\":10.0,\"y\":30.0}"); } } diff --git a/src/usr/cxh/canvas/Arena.java b/src/usr/cxh/canvas/Arena.java index 5af92f8..5829916 100644 --- a/src/usr/cxh/canvas/Arena.java +++ b/src/usr/cxh/canvas/Arena.java @@ -22,7 +22,7 @@ public void advanceState() { int totFood = 0; int fullFed = 0; for (final Blob blob : new ArrayList<>(blobs)) { - blob.move(); + blob.move(this); totFood += blob.food; fullFed += blob.food == 2 ? 1 : 0; } @@ -45,7 +45,7 @@ public void reset() { if (winners.isEmpty()) { // Add normal blobs for (int i = 0; i < 20; i++) { - blobs.add(new Blob(10, 10 + i * 20, this)); + blobs.add(new Blob(10, 10 + i * 20)); } // // Add algae blobs // for (int i = 0; i < 4; i++) { @@ -89,4 +89,4 @@ public static double randInt(final double min, final double max) { public List getBlobData(final Function dataGetter) { return map(blobs, dataGetter); } -} \ No newline at end of file +} diff --git a/src/usr/cxh/canvas/Blob.java b/src/usr/cxh/canvas/Blob.java index 539d0ca..593bc58 100644 --- a/src/usr/cxh/canvas/Blob.java +++ b/src/usr/cxh/canvas/Blob.java @@ -13,7 +13,6 @@ public class Blob extends Positional { double size = 10, speed = 1, senseRadius = 100, algae = 10; Color _color; Color _secondaryColor; - private final Arena _arena; Strat strat = Strat.ROAM; int kills = 0; @@ -22,23 +21,22 @@ enum Strat { } public Blob(final int x, final int y, final double size, final double speed, final double senseRadius, - final double algae, final Arena arena) { - this(x, y, arena); + final double algae) { + this(x, y); this.size = size; this.speed = speed; this.senseRadius = senseRadius; this.algae = algae; } - Blob(final int x, final int y, final Arena arena) { + Blob(final int x, final int y) { super(x, y); - _arena = arena; setColors(); roamTarget = new Positional((x + 500) / 2, (y + 500) / 2); } Blob(final Blob parent) { - this((int) (parent.x + parent.size / 2), (int) (parent.y + parent.size / 2), parent._arena); + this((int) (parent.x + parent.size / 2), (int) (parent.y + parent.size / 2)); speed = evolve(parent.speed); size = evolve(parent.size); senseRadius = evolve(parent.senseRadius); @@ -58,23 +56,23 @@ private void setColors() { } Positional roamTarget; - void move() { + void move(final Arena arena) { final Positional mov; Positional hunt = null; switch (strat) { case ROAM: -// if (_arena.food.isEmpty()) { +// if (arena.food.isEmpty()) { // strat = Strat.HOME; // return; // } final List toAvoid = new ArrayList<>(); - for (final Blob blob : _arena.blobs) { + for (final Blob blob : arena.blobs) { if (blob.size >= size * 1.2 && blob.dist(this) < avoidRadius(blob)) { toAvoid.add(blob); } } - final List sortedFood = new ArrayList<>(_arena.food); - for (final Positional food : _arena.food) { + final List sortedFood = new ArrayList<>(arena.food); + for (final Positional food : arena.food) { for (final Blob blob : toAvoid) { if (blob.dist(food) < avoidRadius(blob)) { sortedFood.remove(food); @@ -84,7 +82,7 @@ void move() { if (eConsumption() > 100) { sortedFood.clear(); } - for (final Blob blob: _arena.blobs) { + for (final Blob blob: arena.blobs) { if (blob.size * 1.2 < size && (blob.speed * 1.1 <= speed || dist(blob) < size / 2)) { sortedFood.add(blob); } @@ -92,7 +90,7 @@ void move() { if (!toAvoid.isEmpty()) { toAvoid.sort((a, b) -> Double.compare(a.dist(this), b.dist(this))); hunt = add(sub(toAvoid.get(0))); - hunt.truncateToArena(_arena); + hunt.truncateToArena(arena); } else { sortedFood.sort((a, b) -> Double.compare(a.dist(this), b.dist(this))); @@ -122,40 +120,40 @@ void move() { if (strat == Strat.ROAM) { if (hunt instanceof Food || hunt instanceof Blob) { if (hunt instanceof Food) { - _arena.food.remove(hunt); + arena.food.remove(hunt); food += 1; energy += 100; } if (hunt instanceof Blob) { kills++; - _arena.blobs.remove(hunt); + arena.blobs.remove(hunt); food += ((Blob) hunt).size / 10; energy += ((Blob) hunt).size * 10 + ((Blob) hunt).energy; } // if (food >= size / 10 * 2) { -// _arena.blobs.add(new Blob(this)); +// arena.blobs.add(new Blob(this)); // food -= size / 10; // } if (energy >= size * 10 * 2) { - _arena.blobs.add(new Blob(this)); + arena.blobs.add(new Blob(this)); energy -= size * 10; } } else { roamTarget = new Positional(x + Arena.randInt(-senseRadius, senseRadius), y + Arena.randInt(-senseRadius, senseRadius)); - roamTarget.truncateToArena(_arena); + roamTarget.truncateToArena(arena); } } else { - _arena.winners.add(this); - _arena.blobs.remove(this); + arena.winners.add(this); + arena.blobs.remove(this); return; } } energy -= eConsumption(); energy += algae; // Slight algae if (energy < 0) { - _arena.blobs.remove(this); + arena.blobs.remove(this); } } diff --git a/src/usr/cxh/canvas/BlobWindow.java b/src/usr/cxh/canvas/BlobWindow.java index 571004e..a964c4c 100644 --- a/src/usr/cxh/canvas/BlobWindow.java +++ b/src/usr/cxh/canvas/BlobWindow.java @@ -97,7 +97,7 @@ public void stateChanged(final ChangeEvent e) { } class BlobData extends JPanel { - public Blob selectedBlob = new Blob(100, 100, null); + public Blob selectedBlob = new Blob(100, 100); JLabel blobSpeedLabel = new JLabel(); JLabel blobSizeLabel = new JLabel(); JLabel blobSenseLabel = new JLabel(); From eaa72c893beb73f21b6a2b3ba306c62910d9d50c Mon Sep 17 00:00:00 2001 From: Tom Fiodorov Date: Sat, 25 May 2019 10:48:57 +0100 Subject: [PATCH 3/4] serialising the arena to disk --- src/usr/cxh/canvas/Arena.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/usr/cxh/canvas/Arena.java b/src/usr/cxh/canvas/Arena.java index 5829916..2c76ca8 100644 --- a/src/usr/cxh/canvas/Arena.java +++ b/src/usr/cxh/canvas/Arena.java @@ -6,6 +6,12 @@ import java.util.List; import java.util.concurrent.ThreadLocalRandom; import java.util.function.Function; +import java.io.IOException; +import java.io.File; +import java.io.FileWriter; + + +import com.google.gson.Gson; public class Arena { List blobs = new ArrayList<>(); @@ -36,8 +42,17 @@ public void advanceState() { reset(); } food.add(new Food(randInt(0, _arenaWidth), randInt(0, _arenaHeight))); + + boolean ser = false; + if (blobs.size() >= 400) { + if(!ser) { + this.toJson("arena.json"); + ser = true; + } + } } + public void reset() { blobs.clear(); food.clear(); @@ -89,4 +104,15 @@ public static double randInt(final double min, final double max) { public List getBlobData(final Function dataGetter) { return map(blobs, dataGetter); } + + public void toJson(String file) { + Gson gson = new Gson(); + FileWriter fw = null; + + try { + fw = new FileWriter(file); + gson.toJson(this, fw); + fw.close(); + } catch(IOException e) {} + } } From 27f2fcaa2a90e44692f8b9f59120cef96b9526f9 Mon Sep 17 00:00:00 2001 From: Tom Fiodorov Date: Sat, 25 May 2019 13:34:11 +0100 Subject: [PATCH 4/4] different criteria --- src/usr/cxh/canvas/Arena.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/usr/cxh/canvas/Arena.java b/src/usr/cxh/canvas/Arena.java index 2c76ca8..00f2210 100644 --- a/src/usr/cxh/canvas/Arena.java +++ b/src/usr/cxh/canvas/Arena.java @@ -44,10 +44,12 @@ public void advanceState() { food.add(new Food(randInt(0, _arenaWidth), randInt(0, _arenaHeight))); boolean ser = false; - if (blobs.size() >= 400) { - if(!ser) { - this.toJson("arena.json"); - ser = true; + for (Blob blob : blobs) { + if(blob.size < 4) { + if(!ser) { + ser = true; + this.toJson("smaller4.json"); + } } } }