Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
bin
build/
.gradle
*.class
22 changes: 22 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -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'
}
13 changes: 13 additions & 0 deletions src/test/java/usr/cxh/BlobTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
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() {
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},\"strat\":\"ROAM\",\"kills\":0,\"roamTarget\":{\"x\":255.0,\"y\":265.0},\"x\":10.0,\"y\":30.0}");
}
}
34 changes: 31 additions & 3 deletions src/usr/cxh/canvas/Arena.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Blob> blobs = new ArrayList<>();
Expand All @@ -22,7 +28,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;
}
Expand All @@ -36,16 +42,27 @@ public void advanceState() {
reset();
}
food.add(new Food(randInt(0, _arenaWidth), randInt(0, _arenaHeight)));

boolean ser = false;
for (Blob blob : blobs) {
if(blob.size < 4) {
if(!ser) {
ser = true;
this.toJson("smaller4.json");
}
}
}
}


public void reset() {
blobs.clear();
food.clear();
System.out.println(winners.size());
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++) {
Expand Down Expand Up @@ -89,4 +106,15 @@ public static double randInt(final double min, final double max) {
public List<Double> getBlobData(final Function<Blob, Double> 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) {}
}
}
47 changes: 26 additions & 21 deletions src/usr/cxh/canvas/Blob.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
import java.util.ArrayList;
import java.util.List;

import com.google.gson.Gson;

public class Blob extends Positional {

double food = 0;
double energy = 100;
double size = 10, speed = 1, senseRadius = 100, algae = 10;
Color _color;
Color _secondaryColor;
private final Arena _arena;
Strat strat = Strat.ROAM;
int kills = 0;

Expand All @@ -20,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);
Expand All @@ -56,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<Blob> 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<Positional> sortedFood = new ArrayList<>(_arena.food);
for (final Positional food : _arena.food) {
final List<Positional> 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);
Expand All @@ -82,15 +82,15 @@ 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);
}
}
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)));
Expand Down Expand Up @@ -120,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);
}
}

Expand All @@ -174,4 +174,9 @@ public void reset() {
food = 0;
strat = Strat.ROAM;
}

public String toJson() {
Gson gson = new Gson();

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I should probably iniate this once per class, oh well :)

return gson.toJson(this);
}
}
2 changes: 1 addition & 1 deletion src/usr/cxh/canvas/BlobWindow.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down