From 96b2ea03f01238ae04737524a14fc97032f87486 Mon Sep 17 00:00:00 2001 From: ariane_v_ Date: Thu, 30 May 2024 14:42:46 +0200 Subject: [PATCH] last version --- .DS_Store | Bin 0 -> 6148 bytes Project_A05/.DS_Store | Bin 0 -> 6148 bytes Project_A05/Agents/.DS_Store | Bin 0 -> 6148 bytes Project_A05/Agents/flock.csv | 1 - Project_A05/Agents/sheeps.csv | 8 + Project_A05/Rule/.DS_Store | Bin 0 -> 6148 bytes Project_A05/Rule/Book 2.xlsx | Bin 0 -> 8285 bytes Project_A05/Rule/Règles.csv | 2 + Project_A05/Rule/ZombieRule.csv | 3 + Project_A05/Rule/zombieRules.csv | Bin 0 -> 86937 bytes Project_A05/src/backend/Agent.java | 2 + Project_A05/src/backend/AgentRules.java | 20 + Project_A05/src/backend/Grid.java | 85 ++++ Project_A05/src/backend/Rules.java | 109 ++++++ Project_A05/src/backend/Sheep.java | 49 ++- Project_A05/src/backend/Simulator.java | 364 ++++++++++++++---- Project_A05/src/backend/Wolf.java | 73 ++++ .../src/windowInterface/JPanelDraw.java | 4 +- 18 files changed, 641 insertions(+), 79 deletions(-) create mode 100644 .DS_Store create mode 100644 Project_A05/.DS_Store create mode 100644 Project_A05/Agents/.DS_Store delete mode 100644 Project_A05/Agents/flock.csv create mode 100644 Project_A05/Agents/sheeps.csv create mode 100644 Project_A05/Rule/.DS_Store create mode 100644 Project_A05/Rule/Book 2.xlsx create mode 100644 Project_A05/Rule/Règles.csv create mode 100644 Project_A05/Rule/ZombieRule.csv create mode 100755 Project_A05/Rule/zombieRules.csv create mode 100644 Project_A05/src/backend/AgentRules.java create mode 100644 Project_A05/src/backend/Grid.java create mode 100644 Project_A05/src/backend/Rules.java create mode 100644 Project_A05/src/backend/Wolf.java diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..85cd180bbcca7a3f9c13b699d3ded8c139c1a9ac GIT binary patch literal 6148 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�NTR`(1FAdETM?Q{bn7iPxvYvrTbS008qp zf#1=|-OAYUM~a!Ju5FvnhUb%AefRnzlh~{$4y`aPUna4}LQTND3@fE0jkU*xqtg7& zyIb@jSZQv&`O9kiforp)qAiGFIE$zs)@SF0Z`h$;^sJPd==M+tnKJ^K`vENeENL03 z>YUd1js><$F+G;V9tsej!LZG=d>l0G&`%B1Y%sWgJ3cG3^~Hj_gF9rT?^0SVh8Lqi zLao#;x;$p>&QHdoc_%Gryz+fiS^byYVFLr|{?2wO^A}Tyg*78VNrjR5v{EH}{NJis zuVwUzt(|vD0m+*U>olISu1f1cNv71IK4fYMF>K9YP0!0D(s0^O=aaEF%u5oh3daT3 za#8}Rly|VJ3lO<*Y285H zvFcCdR&KCDgQa!C9)(X=0VK1;>q$93_&p&0y72;u6we8WJvMXG?(t@m@?HE0(kS2O zF&H<#(;@GzUSdJO1XdVv^UUSgH`Hd!9a41x%f)_S-ApO_1 z&(#F9WX@EK3D>*mmg&VQ0;g9`2%<%#zE><^gwI|+B*&4iW|hgFf2x0sA#!{6X&)=aS`=n9(`Y z8PIVr5Vo5ed>Zg*2V-b|=xQzWVyihUP^&HjCEhX#`N*jLeq8T@1B`LqfOPSO81tH> zt7%Tz{l4}a0~96{PGo_gbEipTH>ZnDl9F_0#Om((jRUTaieNVS(sue3g>OtLie>RR zGGMponM`}}R7Cd5di9URA4=W?9DI!rUX4R9je_w5&7i?lttYHv=PC_yF-M0(zDWOM z#TQz{{NeD-_Az`F7k;KTvVEiCU~A{d`o`A5`1k(Ezei~}y(83GZRXf8ny{xu2pa?{ zGofaY9Vj*L3-AetG00qAGH`2H$_I3e4=hF3=+F^)Oe;q39r$~#Twaz~R%v34@HXPE zfpLgHcC*t9QrEMKUz4fA^Ps?zsyf_z5i1QB*XEebs090_c2AIqB8UWLUIi|N(NXEk z6D^|);1fX06@(jx84L+sMxVK<3M6Q#>hxgAnoG)Ih16%0bs7~J)Er+8N1+l^*G#{M z(DzF+M1$IfJF!Wm)+J_$_}v!GiOF{)?JJoqtlqe-KrZqFH6~$gY(L{&2U6$A(|_T!c}WT7YVFG+Clo= z>C1pG!t|MX4oClZ>L*Xv4c~(+=pEdOasF(<26lG;8ZdlgejgbzKP&9?XU~ab9;J;c ztjg=q@YoOmZra+rO4XdoiVZ8gB%CG4hoF4y=#ST(;UEOg`r zYgPp|n$*oMyFh4ZpiyL6t^hH({jI#?amRVbm~AZ!(gR-y+9!i$uzn3l8SHlUP?vLS z)0tAM{YvHk%5m_y-@{8LNoSKzOO{hv@MJazb` z%>OI+uQkt~Pyk>M{WtLcQvv-|&abtxpOSVT{P!jPRw?^c%CE(apHkjn{bT9lR{_5! zO+N+bJpN6<&lKuc=wBn%Papt5MFar+EpGh^|Ert$GyE&bpWwec4HbD5xNZOdbofsg Mp5&oF`SI`n0F)Jv1^@s6 literal 0 HcmV?d00001 diff --git a/Project_A05/Rule/Règles.csv b/Project_A05/Rule/Règles.csv new file mode 100644 index 0000000..d35631c --- /dev/null +++ b/Project_A05/Rule/Règles.csv @@ -0,0 +1,2 @@ +1;2;3;4;5 +3;;;; diff --git a/Project_A05/Rule/ZombieRule.csv b/Project_A05/Rule/ZombieRule.csv new file mode 100644 index 0000000..509d0f6 --- /dev/null +++ b/Project_A05/Rule/ZombieRule.csv @@ -0,0 +1,3 @@ +2;3 +3; +2; diff --git a/Project_A05/Rule/zombieRules.csv b/Project_A05/Rule/zombieRules.csv new file mode 100755 index 0000000000000000000000000000000000000000..006b853e9335df8435a5bdaa1355275e6c8f9c7f GIT binary patch literal 86937 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 sheepSurviveValues; + private ArrayList sheepBirthValues; + + public AgentRules() { + sheepSurviveValues = new ArrayList<>(); + sheepBirthValues = new ArrayList<>(); + + sheepBirthValues.addAll(Arrays.asList(2)); // Sheeps are born with 2 or more neighbors + } + + public boolean shouldBirth(int numberOfNeighbors) { + return sheepBirthValues.contains(numberOfNeighbors); + } +} diff --git a/Project_A05/src/backend/Grid.java b/Project_A05/src/backend/Grid.java new file mode 100644 index 0000000..aac1f86 --- /dev/null +++ b/Project_A05/src/backend/Grid.java @@ -0,0 +1,85 @@ +package backend; + +import java.util.Random; + +public class Grid { + + + private final int COL_NUM = 100; + private final int LINE_NUM = 100; + private int[][] worldGrid; // The grid + + + + + // Constructor to create a grid ang give its size + public Grid() { + worldGrid = new int[COL_NUM][LINE_NUM]; + } + + // Method to initialize the grid with all zeros + public void iniGrid() { + for (int i = 0; i < COL_NUM; i++) { + for (int j = 0; j < LINE_NUM; j++) { + worldGrid[i][j] = 0; // Set each cell to 0 + } + } + } + + // Method to get the width of the grid + public int getWidth() { + return COL_NUM; + } + + // Method to get the height of the grid + public int getHeight() { + return LINE_NUM; + } + + // method to access a cell in the grid + public int getCell(int x, int y) { + return worldGrid[x][y]; // Get the value at cell (x, y) + } + // method to set the value of a cell in the grid + public void setCell(int x, int y, int val) { + + worldGrid[x][y] = val; // Set the value at cell (x, y) + } + + + + public int[][] getGrid() { + return worldGrid; + } + + public int countNeighbors(int x, int y) { + int count = 0; + + // Check all nine cells around the given cell + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + int nx = x + i; + int ny = y + j; + + // Skip checking the cell itself + if (i == 0 && j == 0) { + continue; + } + + // Count how many cells are alive around the given cell + if (nx >= 0 && nx < getWidth() && ny >= 0 && ny < getHeight()) { + if (getCell(nx,ny) == 1) { // 1 represents alive + count++; + } + } + } + } + + return count; + } + + + + + +} \ No newline at end of file diff --git a/Project_A05/src/backend/Rules.java b/Project_A05/src/backend/Rules.java new file mode 100644 index 0000000..6f9e01d --- /dev/null +++ b/Project_A05/src/backend/Rules.java @@ -0,0 +1,109 @@ +package backend; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Random; + +public class Rules { + private ArrayList fieldSurviveValues; + private ArrayList fieldBirthValues; + + private int zombieProbability; + Random rand; + + public int zombieProbability() { + return zombieProbability; + } + + + public Rules() { + // create lists of survival and birth rules + fieldSurviveValues = new ArrayList<>(); + fieldBirthValues = new ArrayList<>(); + + + + } + + // define if cell should die or survive + public boolean shouldSurvive(int numberOfNeighbors) { + return fieldSurviveValues.contains(numberOfNeighbors); + } + + // define if cell should birth + public boolean shouldBirth(int numberOfNeighbors) { + return fieldBirthValues.contains(numberOfNeighbors); + } + + // define if cell should become zombie + public boolean shouldBecomeZombie(int zombieProbability) { + this.rand = new Random(); + int zombie = rand.nextInt(99); + + return zombie < zombieProbability ; + } + + + //method to load rules from a file + public void loadRule(ArrayList lines) { + if(lines.size()<=0) { + System.out.println("empty rule file"); + return; + } + //DONE TODO : remove previous rule (=emptying lists) + fieldSurviveValues.clear(); + fieldBirthValues.clear(); + + String surviveLine = lines.get(0); + String birthLine = lines.get(1); + + String[] surviveElements = surviveLine.split(";"); + System.out.println("Survival rules are:"); + for(int x=0; x lines) { + String zombieLine = lines.get(2); + System.out.println("dying cells are becoming zombies"); + String[] zombieElement = zombieLine.split(";"); + for (int x = 0; x < zombieElement.length; x++) { + String elem = zombieElement[x]; + zombieProbability = Integer.parseInt(elem); + } + return zombieProbability; + + } + + + + +} + + + + diff --git a/Project_A05/src/backend/Sheep.java b/Project_A05/src/backend/Sheep.java index ece8a18..0ace505 100644 --- a/Project_A05/src/backend/Sheep.java +++ b/Project_A05/src/backend/Sheep.java @@ -11,6 +11,8 @@ import java.util.Random; public class Sheep extends Agent { int hunger; + boolean eaten; + boolean isEaten; Random rand; Sheep(int x,int y){ @@ -31,29 +33,64 @@ public class Sheep extends Agent { */ public boolean liveTurn(ArrayList neighbors, Simulator world) { if(world.getCell(x, y)==1) { - world.setCell(x, y, 0); + world.setCell(x, y, 0); //sheep eats green cell it's on } else { hunger++; } + + eaten = this.eatenSheep(neighbors, world); // true if sheep is eaten by wolf, false if not this.moveRandom(); - return hunger>10; + + // next steps will make a sheep live or die + + if (hunger<2) { // is sheep doesn't die of hunger + return !eaten ; // either it dies eaten or it lives + } + else + return hunger<2;// sheep dies of hunger } + + public boolean eatenSheep(ArrayList neighbors, Simulator world) { + isEaten = false; + + for (Agent agent : neighbors) { + if (agent instanceof Wolf) { + if (Math.abs(agent.getX() - this.x) <= 1 && Math.abs(agent.getY() - this.y) <= 1) { //sheep is eaten if wolf in 1 cell radius + + isEaten = true; // Indicate that a sheep has been eaten + + } + } + } + return isEaten; + } + + public boolean eatSheep() { + return isEaten; + } + + + + + private void moveRandom() { int direction = rand.nextInt(4); - if(direction == 0) { + if(direction == 0 && x<99) { x+=1; } - if(direction == 1) { + if(direction == 1 && y<99) { y+=1; } - if(direction == 2) { + if(direction == 2 && x>0) { x-=1; } - if(direction == 3) { + if(direction == 3 && y>0) { y-=1; } } + + } diff --git a/Project_A05/src/backend/Simulator.java b/Project_A05/src/backend/Simulator.java index 52b5f9f..83960d5 100644 --- a/Project_A05/src/backend/Simulator.java +++ b/Project_A05/src/backend/Simulator.java @@ -1,14 +1,17 @@ package backend; import java.util.ArrayList; - +import java.util.List; +import java.util.Random; +import java.util.Iterator; import windowInterface.MyInterface; + public class Simulator extends Thread { private MyInterface mjf; - private final int COL_NUM = 100; - private final int LINE_NUM = 100; + + // COL_NUM and LINE_NUM moved to Grid private final int LIFE_TYPE_NUM = 4; //Conway Radius : 1 private final int LIFE_AREA_RADIUS = 1; @@ -24,8 +27,13 @@ public class Simulator extends Thread { private boolean loopingBorder; private boolean clickActionFlag; private int loopDelay = 150; + private int stepCounter = 0; - //TODO : add missing attribute(s) + //DONETODO : add missing attribute(s) + private Grid worldGrid; + private Rules rules = new Rules(); + Random rand; + public Simulator(MyInterface mjfParam) { mjf = mjfParam; @@ -38,8 +46,11 @@ public class Simulator extends Thread { fieldBirthValues = new ArrayList(); fieldSurviveValues = new ArrayList(); - //TODO : add missing attribute initialization + //DONETODO : add missing attribute initialization + worldGrid = new Grid(); + worldGrid.iniGrid(); + //Default rule : Survive always, birth never @@ -48,15 +59,17 @@ public class Simulator extends Thread { } } + + public int getWidth() { - //TODO : replace with proper return - return 0; + //DONETODO : replace with proper return + return worldGrid.getWidth(); // the width is the number of columns } public int getHeight() { - //TODO : replace with proper return - return 0; + //DONETODO : replace with proper return + return worldGrid.getHeight(); // the height is the number of rows } //Should probably stay as is @@ -91,6 +104,7 @@ public class Simulator extends Thread { // only modify if sure of what you do // to modify agent behavior, see liveTurn method // in agent classes + /* for(Agent agent : agents) { ArrayList neighbors = this.getNeighboringAnimals( @@ -103,14 +117,141 @@ public class Simulator extends Thread { agents.remove(agent); } } + */ + + // The code above gave us an error, we replaced it with this one, using an iterator + Iterator iterator = agents.iterator(); + while (iterator.hasNext()) { + Agent agent = iterator.next(); + ArrayList neighbors = + this.getNeighboringAnimals(agent.getX(), agent.getY(), ANIMAL_AREA_RADIUS); + if (!agent.liveTurn(neighbors, this)) { + iterator.remove(); + } + } + + List newAgents = new ArrayList<>(); + + // reproduction of agents + + for (int x = 0; x < worldGrid.getWidth(); x++) { + for (int y = 0; y < worldGrid.getHeight(); y++) { + if (isCellEmpty(x, y) && countNeighboringSheep(x, y) == 2) { + newAgents.add(new Sheep(x, y)); // add sheep in cell that doesn't contain any agent if there are exactly 2 neighboring sheeps. + } + } + } + agents.addAll(newAgents); + //then evolution of the field - // TODO : apply game rule to all cells of the field + + + for (int x = 0; x < worldGrid.getWidth(); x++) { + + for (int y = 0; y < worldGrid.getHeight(); y++) { + + + int neighbor = worldGrid.countNeighbors(x, y); // Calculate number of neighbors + + // Determine if cell should die, survive or birth. + boolean survives = rules.shouldSurvive(neighbor); + boolean born = rules.shouldBirth(neighbor); + + // Determine if cell should become a zombie. + boolean zombie = rules.shouldBecomeZombie(rules.zombieProbability()); + + if (getCell(x, y) == 1 && !survives && zombie) { + setCell(x, y, 2); // Cell becomes zombie + + + } else if (getCell(x, y) == 1 && !survives) { + setCell(x, y, 0); // Cell dies + + } else if (getCell(x, y) == 0 && born) { + setCell(x, y, 1); // New cell is born + } else if (getCell(x,y)==2) { + + this.contaminateCell(x,y); + } + + } + } + + // Check if there are more than 20 sheeps + if (countSheep() > 20) { + addWolfRandomly(); // Add a wolf if there are more than 20 sheeps on the grid. + } + } + + // Method that add a Wolf to a random location + public void addWolfRandomly() { + Random rand = new Random(); + int x = rand.nextInt(getWidth()); // Assume getWidth() gives the grid width + int y = rand.nextInt(getHeight()); // Assume getHeight() gives the grid height + agents.add(new Wolf(x, y)); // Add a new Wolf to the list + } + + // Method that allows a zombie to randomly contaminate a cell around it + public void contaminateCell(int x, int y) { + rand = new Random(); + int direction = rand.nextInt(4); + if(direction == 0 && x<99) { + x+=1; + } + if(direction == 1 && y<99) { + y+=1; + } + if(direction == 2 && x>0) { + x-=1; + } + if(direction == 3 && y>0) { + y-=1; + } + int contaminationProbability = rand.nextInt(4); // zombie has a 25% change of contaminating a cell. + + if (getCell(x,y)==1 && contaminationProbability == 0) { + this.setCell(x, y,2); // cell becomes zombie if contaminated + + } + } + + + private boolean isCellEmpty(int x, int y) { + return agents.stream().noneMatch(agent -> agent.getX() == x && agent.getY() == y); + } + + // method that count the number of Neighboring Sheep to a precise cell. + private int countNeighboringSheep(int x, int y) { + int count = 0; + for (Agent agent : agents) { // go through whole list of agents + if (agent instanceof Sheep) { //only count sheeps + if (Math.abs(agent.getX() - x) <= 1 && Math.abs(agent.getY() - y) <= 1 && !(agent.getX() == x && agent.getY() == y)) {// in a radius of 1 case around the case, without counting the case itself + count++; + } + } + } + return count; + } + // Method that counts the total number of sheeps on the grid + public int countSheep() { + int sheepCount = 0; + for (Agent agent : agents) { + if (agent instanceof Sheep) { + sheepCount++; // Increment count if the agent is a Sheep + } + } + return sheepCount; + } + + // DONETODO : apply game rule to all cells of the field + //see method countNeighboring, makeStep and class Rules /* you should distribute this action in methods/classes * don't write everything here ! * * the idea is first to get the surrounding values - * then count how many are alive + * then count how many are alive : + * then check if that number is in the lists of rules * if the cell is alive * and the count is in the survive list, @@ -119,11 +260,15 @@ public class Simulator extends Thread { * and the count is in the birth list, * then the cell becomes alive */ + + + + + - - } + /* * leave this as is @@ -136,14 +281,25 @@ public class Simulator extends Thread { * method called when clicking pause button */ public void togglePause() { - // TODO : actually toggle the corresponding flag + // DONETODO : actually toggle the corresponding flag + pauseFlag = !pauseFlag; } /** * method called when clicking on a cell in the interface */ public void clickCell(int x, int y) { - //TODO : complete method + if (clickActionFlag) { + // Assuming different types of actions based on flag + // E.g., toggling cell state + int currentVal = worldGrid.getCell(x, y); + int newVal = 1 - currentVal; + setCell(x, y, newVal); // Toggle between 0 and 1 + + } else { + // Assuming adding an agent if not toggling + agents.add(new Sheep(x, y)); // Default health for new agents + } } /** @@ -153,9 +309,14 @@ public class Simulator extends Thread { * @return value of cell */ public int getCell(int x, int y) { - //TODO : complete method with proper return - return 0; + //DONETODO : complete method with proper return + return worldGrid.getCell(x,y); } + + + + + /** * * @return list of Animals in simulated world @@ -170,6 +331,7 @@ public class Simulator extends Thread { * @param radius * @return list of agents in area */ + public ArrayList getNeighboringAnimals(int x, int y, int radius){ ArrayList inArea = new ArrayList(); for(int i=0;i getSaveState() { - //TODO : complete method with proper return - return null; + //DONETODO : complete method with proper return + int[][] gridData = worldGrid.getGrid(); // Get the grid + ArrayList saveState = new ArrayList<>(); + + for (int i = 0; i < worldGrid.getHeight(); i++) { + StringBuilder sb = new StringBuilder(); + for (int j = 0; j < worldGrid.getWidth(); j++) { + sb.append(gridData[i][j]); + if (j < worldGrid.getWidth() - 1) { + sb.append(";"); // Append a semicolon after each cell except the last in the row + } + } + saveState.add(sb.toString()); // Add the string for this row to the list + } + + return saveState; } /** * * @param lines of file representing saved world state */ + public void loadSaveState(ArrayList lines) { /* * First some checks that the file is usable @@ -211,6 +395,7 @@ public class Simulator extends Thread { * "Guard clauses", as they guard the method * against unwanted inputs */ + if(lines.size()<=0) { return; } @@ -219,10 +404,12 @@ public class Simulator extends Thread { if(firstLineElements.length<=0) { return; } + /* * now we fill in the world * with the content of the file */ + for(int y =0; y getRule() { - //TODO : complete method with proper return - - return null; - } + ArrayList rules = new ArrayList<>(); + StringBuilder sbSurvive = new StringBuilder("Survive:"); + for (Integer val : fieldSurviveValues) { + sbSurvive.append(val).append(";"); + } + if (!fieldSurviveValues.isEmpty()) sbSurvive.deleteCharAt(sbSurvive.length() - 1); - public void loadRule(ArrayList lines) { - if(lines.size()<=0) { - System.out.println("empty rule file"); - return; - } - //TODO : remove previous rule (=emptying lists) - - - String surviveLine = lines.get(0); - String birthLine = lines.get(1); - String[] surviveElements = surviveLine.split(";"); - for(int x=0; x getAgentsSave() { - //TODO : Same idea as the other save method, but for agents - return null; + //load rules from file + + public void loadRule(ArrayList lines) { + rules.loadRule(lines); + if(lines.size()>=3) { + rules.loadZombieRule(lines) ; + + } } - public void loadAgents(ArrayList stringArray) { - //TODO : Same idea as other load methods, but for agent list + + //method that return a string of agents + + public ArrayList getAgentsSave() { + ArrayList agentStates = new ArrayList<>(); + for (Agent agent : agents) { + agentStates.add(agent.toString()); + } + return agentStates; + + } + + //method that allows to load a file containing agent coordinates. + + public void loadAgents(ArrayList lines) { + + + for (String line : lines) { + String[] coordinates = line.split(";"); + int x = Integer.parseInt(coordinates[0]); + int y = Integer.parseInt(coordinates[1]); + if (Integer.parseInt(coordinates[2])==0) { + agents.add(new Sheep(x, y)); + } + if (Integer.parseInt(coordinates[2])==1) { + agents.add(new Wolf(x, y)); + } + + } + } @@ -324,9 +543,14 @@ public class Simulator extends Thread { * @return String representation of click action */ public String clickActionName() { - // TODO : initially return "sheep" or "cell" - // depending on clickActionFlag - return ""; + // Check the state of clickActionFlag + // Assuming true means we're placing an agent (e.g., Sheep) + // and false means we're toggling the state of a cell + if (clickActionFlag) { + return "cell"; // When flag is true, clicking adds a sheep + } else { + return "sheep"; // When flag is false, clicking toggles cell state + } } } diff --git a/Project_A05/src/backend/Wolf.java b/Project_A05/src/backend/Wolf.java new file mode 100644 index 0000000..03eb29c --- /dev/null +++ b/Project_A05/src/backend/Wolf.java @@ -0,0 +1,73 @@ +package backend; + +import java.awt.Color; +import java.util.ArrayList; +import java.util.Random; + + + +public class Wolf extends Agent { + private int loneliness; // this variable will be used to track how many steps since wolf found a friend + ArrayList neighbors = new ArrayList<>(); + + + public Wolf(int x, int y) { + super(x, y,Color.black); + this.loneliness = 0; // Initialize loneliness to 0 + + + } + + + + + @Override + public boolean liveTurn(ArrayList neighbors, Simulator world) { + + + moveRandomly(world); + + loneliness = lonelyWolf(neighbors); + return loneliness < 5; // Wolf dies if he didn't find another neighboring agent for 5 steps + } + + public int lonelyWolf(ArrayList allAgents) { + // Check if there are no neighboring agents around + neighbors = findNeighbors(allAgents,1); + if (neighbors.isEmpty()) { + loneliness++; // Increase loneliness if there are no neighbors + } else { + loneliness = 0; // Reset loneliness if there are neighbors + } + return loneliness; + } + + //method to find every agent near the wolf + private ArrayList findNeighbors(ArrayList allAgents, int radius) { + + for (Agent agent : allAgents) { + if (agent != this && this.isInArea(agent.getX(), agent.getY(), radius)) { + neighbors.add(agent); + } + } + return neighbors; + } + + + + +//method that makes a wolf move randomly + private void moveRandomly(Simulator world) { + Random rand = new Random(); + // Move randomly by one cell in any direction (including staying in the same place) + int newX = Math.max(0, Math.min(world.getWidth() - 1, getX() + rand.nextInt(3) - 1)); + int newY = Math.max(0, Math.min(world.getHeight() - 1, getY() + rand.nextInt(3) - 1)); + setPosition(newX, newY); + } + +// set position of wolf + private void setPosition(int x, int y) { + this.x = x; + this.y = y; + } +} diff --git a/Project_A05/src/windowInterface/JPanelDraw.java b/Project_A05/src/windowInterface/JPanelDraw.java index a210363..880f2d2 100644 --- a/Project_A05/src/windowInterface/JPanelDraw.java +++ b/Project_A05/src/windowInterface/JPanelDraw.java @@ -43,12 +43,12 @@ public class JPanelDraw extends JPanel { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); - this.setBackground(Color.black); + this.setBackground(Color.gray); if (mySimu != null) { // Draw Interface from state of simulator float cellWidth = (float)this.getWidth()/(float)mySimu.getWidth(); float cellHeight = (float)this.getHeight()/(float)mySimu.getHeight(); - g.setColor(Color.gray); + g.setColor(Color.black); for(int x=0; x