rules added and half of agents

This commit is contained in:
Dorian VELOSO 2024-05-22 22:07:19 +02:00
parent 21950423b8
commit be6e9da50d
2 changed files with 165 additions and 92 deletions

View File

@ -18,13 +18,16 @@ public class Simulator extends Thread {
private ArrayList<Integer> fieldBirthValues;
private ArrayList<Agent> agents;
ArrayList<ArrayList<Integer>> rule = new ArrayList<>();
ArrayList<Integer> birthConditions = new ArrayList<>();
ArrayList<Integer> survivalConditions = new ArrayList<>();
private boolean stopFlag;
private boolean pauseFlag;
private boolean loopingBorder;
private boolean clickActionFlag;
private int loopDelay = 150;
private Grid grid;
private World world;
//TODO : add missing attribute(s)
@ -38,8 +41,17 @@ public class Simulator extends Thread {
agents = new ArrayList<Agent>();
fieldBirthValues = new ArrayList<Integer>();
fieldSurviveValues = new ArrayList<Integer>();
grid = new Grid(60, 60);
//TODO : add missing attribute initialization
// Normal Game of Life rules
birthConditions.add(3); // Birth condition
survivalConditions.add(2); // Survival condition
survivalConditions.add(3); // Survival condition
rule.add(birthConditions);
rule.add(survivalConditions);
world = new World(COL_NUM, LINE_NUM, rule);
@ -51,12 +63,12 @@ public class Simulator extends Thread {
}
public int getWidth() {
return grid.getWidth();
return world.getWidth();
}
public int getHeight() {
//TODO : replace with proper return
return grid.getHeight();
return world.getHeight();
}
//Should probably stay as is
@ -119,61 +131,7 @@ public class Simulator extends Thread {
* and the count is in the birth list,
* then the cell becomes alive
*/
Grid nextGrid = new Grid(60,60);
for (int x = 0; x < getWidth(); x++) {
for (int y = 0; y < getHeight(); y++) {
int actualState = getCell(x,y);
int futureState =0;
// high life
if(actualState==0) {
for (int i = 1; i<=5; i++) {
if(checkNeighbors(x,y,i)==3||checkNeighbors(x,y,i)==6) {
futureState = i;
}
}
} else {
if(checkNeighbors(x,y,actualState)==3||checkNeighbors(x,y,actualState)==2) {
futureState = actualState;
}
}
nextGrid.setCell(x,y,futureState);
}
}
grid = nextGrid;
}
private int checkNeighbors(int x, int y, int state) {
int nbNeighbors = 0;
for (int i = x - 1; i <= x + 1; i++) {
for (int j = y - 1; j <= y + 1; j++) {
int x_looped = i;
int y_looped = j;
if (loopingBorder) {
if (x_looped < 0) {
x_looped = getWidth() - 1;
} else if (x_looped >= getWidth()) {
x_looped = 0;
}
if (y_looped < 0) {
y_looped = getHeight() - 1;
} else if (y_looped >= getHeight()) {
y_looped = 0;
}
}
if (x_looped >= 0 && x_looped < getWidth() && y_looped >= 0 && y_looped < getHeight() && (x_looped != x || y_looped != y)) {
if (state == grid.getCell(x_looped, y_looped).getState()) {
nbNeighbors++;
}
}
}
}
System.out.println(nbNeighbors);
return nbNeighbors;
world.makeStep();
}
/*
@ -194,7 +152,7 @@ public class Simulator extends Thread {
* method called when clicking on a cell in the interface
*/
public void clickCell(int x, int y) {
grid.getCell(x, y).toggleCell();
world.clickCell(x, y);;
}
/**
@ -204,7 +162,7 @@ public class Simulator extends Thread {
* @return value of cell
*/
public int getCell(int x, int y) {
return grid.getCell(x, y).getState();
return world.getCell(x, y);
}
/**
*
@ -238,7 +196,7 @@ public class Simulator extends Thread {
* @param val to set in cell
*/
public void setCell(int x, int y, int val) {
grid.getCell(x, y).setState(val);
world.setCell(x, y, val);
}
/**
@ -299,15 +257,7 @@ public class Simulator extends Thread {
* maybe just make a constructor in there
* and use it here
*/
for (int y = 0; y < getHeight(); y++) {
for (int x = 0; x < getWidth(); x++) {
if (Math.random() < chanceOfLife) {
setCell(x, y, 1);
} else {
setCell(x, y, 0);
}
}
}
world.generateRandom(chanceOfLife);
}
public boolean isLoopingBorder() {
@ -323,21 +273,23 @@ public class Simulator extends Thread {
}
public void toggleClickAction() {
//TODO : complete method
clickActionFlag = !clickActionFlag;
}
/**
* prepare the content of a file saving present ruleSet
* as you might want to save a state,
* initialy written in this class constructor
* as a file for future use
* @return File content as an ArrayList of Lines (String)
* @see loadRule for inverse process
*/
public ArrayList<String> getRule() {
//TODO : complete method with proper return
return null;
ArrayList<String> lines = new ArrayList<>();
// Add birth conditions
for (Integer birthCondition : rule.get(0)) {
lines.add(birthCondition.toString());
}
// Add survival conditions
for (Integer survivalCondition : rule.get(1)) {
lines.add(survivalCondition.toString());
}
return lines;
}
public void loadRule(ArrayList<String> lines) {
@ -345,8 +297,7 @@ public class Simulator extends Thread {
System.out.println("empty rule file");
return;
}
//TODO : remove previous rule (=emptying lists)
rule.clear();
String surviveLine = lines.get(0);
String birthLine = lines.get(1);
@ -354,7 +305,7 @@ public class Simulator extends Thread {
for(int x=0; x<surviveElements.length;x++) {
String elem = surviveElements[x];
int value = Integer.parseInt(elem);
//TODO : add value to possible survive values
rule.get(0).add(value);
}
String[] birthElements = birthLine.split(";");
@ -362,7 +313,7 @@ public class Simulator extends Thread {
String elem = birthElements[x];
int value = Integer.parseInt(elem);
//TODO : add value to possible birth values
rule.get(1).add(value);
}
}
@ -381,9 +332,7 @@ public class Simulator extends Thread {
* @return String representation of click action
*/
public String clickActionName() {
// TODO : initially return "sheep" or "cell"
// depending on clickActionFlag
return "";
return clickActionFlag ? "agents" : "cell";
}
}

124
src/backend/World.java Normal file
View File

@ -0,0 +1,124 @@
package backend;
import java.util.ArrayList;
public class World {
private Grid grid;
private int width;
private int height;
private boolean loopingBorder;
private ArrayList<ArrayList<Integer>> rule;
public World(int sizeX, int sizeY, ArrayList<ArrayList<Integer>> _rule) {
width = sizeX;
height = sizeY;
rule = _rule;
grid = new Grid(sizeX, sizeY);
}
public void generateRandom(float chanceOfLife) {
//TODO : complete method
/*
* Advice :
* as you should probably have a separate class
* representing the field of cells...
* maybe just make a constructor in there
* and use it here
*/
for (int y = 0; y < getHeight(); y++) {
for (int x = 0; x < getWidth(); x++) {
if (Math.random() < chanceOfLife) {
setCell(x, y, 1);
} else {
setCell(x, y, 0);
}
}
}
}
public void makeStep() {
Grid nextGrid = new Grid(width,height);
for (int x = 0; x < getWidth(); x++) {
for (int y = 0; y < getHeight(); y++) {
int actualState = getCell(x,y);
int futureState =0;
// high life
if(actualState==0) {
for (int i = 1; i<=5; i++) {
//Birth
if(rule.get(0).contains(checkNeighbors(x, y, i))) {
futureState = i;
}
}
} else {
//Survival
if(rule.get(1).contains(checkNeighbors(x, y, actualState))) {
futureState = actualState;
}
}
nextGrid.setCell(x,y,futureState);
}
}
grid = nextGrid;
}
private int checkNeighbors(int x, int y, int state) {
int nbNeighbors = 0;
for (int i = x - 1; i <= x + 1; i++) {
for (int j = y - 1; j <= y + 1; j++) {
int x_looped = i;
int y_looped = j;
if (loopingBorder) {
if (x_looped < 0) {
x_looped = getWidth() - 1;
} else if (x_looped >= getWidth()) {
x_looped = 0;
}
if (y_looped < 0) {
y_looped = getHeight() - 1;
} else if (y_looped >= getHeight()) {
y_looped = 0;
}
}
if (x_looped >= 0 && x_looped < getWidth() && y_looped >= 0 && y_looped < getHeight() && (x_looped != x || y_looped != y)) {
if (state == grid.getCell(x_looped, y_looped).getState()) {
nbNeighbors++;
}
}
}
}
System.out.println(nbNeighbors);
return nbNeighbors;
}
public void clickCell(int x, int y) {
grid.getCell(x, y).toggleCell();
}
public void setCell(int x, int y, int val) {
grid.getCell(x, y).setState(val);
}
public void setLoopingBorders(boolean loop) {
loopingBorder = loop;
}
public int getCell(int x, int y) {
return grid.getCell(x, y).getState();
}
public int getWidth() {
return grid.getWidth();
}
public int getHeight() {
return grid.getHeight();
}
}