diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..d3f906538be31389774b0d9edf0f9c076db0b565 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/.gradle/ +/build/ +/.idea/ diff --git a/src/main/java/App.java b/src/main/java/App.java index 2b1fbbaa34052927e01846fdace8ec9a5a3e661e..9c25e53970b93ae605b9d19aeb09a88712f66b88 100644 --- a/src/main/java/App.java +++ b/src/main/java/App.java @@ -9,8 +9,6 @@ import javafx.stage.Stage; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import static java.lang.Thread.sleep; - public class App extends Application { @@ -21,7 +19,7 @@ public class App extends Application { } @Override - public void start(Stage primaryStage) throws InterruptedException { + public void start(Stage primaryStage) { Group root = new Group(); Button restart = new Button("Restart"); Button switchPause = new Button("Pause"); @@ -41,13 +39,10 @@ public class App extends Application { grid.repaint(); ScheduledThreadPoolExecutor threadPoolExecutor = new ScheduledThreadPoolExecutor(1); - threadPoolExecutor.scheduleWithFixedDelay(new Runnable() { - @Override - public void run() { - if(!isInPause) { - grid.model.activation(); - grid.repaint(); - } + threadPoolExecutor.scheduleAtFixedRate(() -> { + if(!isInPause) { + grid.model.activation(); + grid.repaint(); } }, 0, 50 , TimeUnit.MILLISECONDS); } diff --git a/src/main/java/Grid.java b/src/main/java/Grid.java index 23fb50d23d9ba0dd308def943a81d8fe898d40a9..6b41aa270f5053cdad9d9d3a2b30bcbd833eb2c6 100644 --- a/src/main/java/Grid.java +++ b/src/main/java/Grid.java @@ -1,10 +1,12 @@ import javafx.scene.canvas.Canvas; -import javafx.scene.canvas.GraphicsContext; import javafx.scene.input.MouseEvent; import javafx.scene.paint.Color; public class Grid extends Canvas{ - int width, height, colCount, rowCount; + double width; + double height; + double colCount; + double rowCount; Model model; @@ -23,22 +25,19 @@ public class Grid extends Canvas{ public void restart(MouseEvent mouseEvent){ model = new Model(this); model.initialisation(3,6); - getGraphicsContext2D().clearRect(0,0,width,height); + getGraphicsContext2D().clearRect(0,0,width, height); repaint(); } private void mousePressed(MouseEvent mouseEvent) { model.activation(); repaint(); - /*double x = mouseEvent.getX(); - double y = mouseEvent.getY(); - model.click((int)x*rowCount/height,(int)y*colCount/width);*/ } void repaint(){ for(int col=0; col<colCount; col++) - getGraphicsContext2D().strokeLine(0, col*width/colCount,height, col*width/colCount); + getGraphicsContext2D().strokeLine(0, col*width/colCount, height, col*width/colCount); for(int row=0; row<rowCount;row++) - getGraphicsContext2D().strokeLine(row*height/rowCount,0,row*height/rowCount,width); + getGraphicsContext2D().strokeLine(row*height/rowCount,0,row*height/rowCount, width); } @@ -49,7 +48,7 @@ public class Grid extends Canvas{ public void paintFF(int row, int col) { getGraphicsContext2D().setFill(Color.BLUE); - getGraphicsContext2D().fillRect(row*height/rowCount,col*width/colCount,height/rowCount,width/colCount); + getGraphicsContext2D().fillOval(row*height/rowCount,col*width/colCount,height/rowCount,width/colCount); } public void paintFire(int row, int col) { diff --git a/src/main/java/Model.java b/src/main/java/Model.java index f23d0d13c6a3e847962201dc7c72fd5dedc0a249..7fce8f14a843914fb230bbe50c61bb575db3108a 100644 --- a/src/main/java/Model.java +++ b/src/main/java/Model.java @@ -2,104 +2,104 @@ import java.util.*; public class Model { - Grid grid; - int colCount, rowCount; - List<Position> firefighters = new ArrayList<>(); - Set<Position> fires = new HashSet<>(); - List<Position> ffNewPositions; - int step = 0; - - public Model(Grid grid) { - this.grid = grid; - colCount = grid.colCount; - rowCount = grid.rowCount; + Grid grid; + double colCount; + double rowCount; + List<Position> firefighters = new ArrayList<>(); + Set<Position> fires = new HashSet<>(); + List<Position> ffNewPositions; + int step = 0; + + public Model(Grid grid) { + this.grid = grid; + colCount = grid.colCount; + rowCount = grid.rowCount; + } + + + public void initialisation(int fireNumber, int fireFighterNumber) { + for (int index = 0; index < fireNumber; index++) + fires.add(randomPosition()); + for (int index = 0; index < fireFighterNumber; index++) + firefighters.add(randomPosition()); + } + + private Position randomPosition() { + return new Position((int) (Math.random() * rowCount), (int) (Math.random() * colCount)); + } + + + public void activation() { + ffNewPositions = new ArrayList<>(); + for (Position ff : firefighters) { + Position newPosition = activateFirefighter(ff); + grid.paint(ff.row, ff.col); + grid.paintFF(newPosition.row, newPosition.col); + ffNewPositions.add(newPosition); } - - - public void initialisation(int fireNumber, int fireFighterNumber){ - for(int index=0; index<fireNumber;index++) - fires.add(randomPosition()); - for(int index=0; index<fireFighterNumber;index++) - firefighters.add(randomPosition()); - } - - private Position randomPosition() { - return new Position((int) (Math.random()*rowCount), (int) (Math.random()*colCount)); - } - - - public void activation(){ - ffNewPositions = new ArrayList<>(); - for(Position ff : firefighters){ - Position newPosition = activateFirefighter(ff); - grid.paint(ff.row,ff.col); - grid.paintFF(newPosition.row, newPosition.col); - ffNewPositions.add(newPosition); - } - firefighters = ffNewPositions; - if(step%2==0){ - List<Position> newFires = new ArrayList<>(); - for(Position fire : fires){ - newFires.addAll(activateFire(fire)); - } - for(Position newFire : newFires) - grid.paintFire(newFire.row, newFire.col); - - fires.addAll(newFires);} - step++; - - } - - private List<Position> activateFire(Position position) { - return next(position); + firefighters = ffNewPositions; + if (step % 2 == 0) { + List<Position> newFires = new ArrayList<>(); + for (Position fire : fires) { + newFires.addAll(activateFire(fire)); + } + for (Position newFire : newFires) + grid.paintFire(newFire.row, newFire.col); + fires.addAll(newFires); } - - - - private Position activateFirefighter(Position position) { - Position randomPosition = aStepTowardFire(position); - //next(position).get((int) (Math.random()*next(position).size())); - List<Position> nextFires = next(randomPosition).stream().filter(fires::contains).toList(); - extinguish(randomPosition); - for (Position fire : nextFires) - extinguish(fire); - return randomPosition; - } - - private void extinguish(Position position) { - fires.remove(position); - grid.paint(position.row, position.col); - } - - private List<Position> next(Position position){ - List<Position> list = new ArrayList<>(); - if(position.row>0) list.add(new Position(position.row-1, position.col)); - if(position.col>0) list.add(new Position(position.row, position.col-1)); - if(position.row<rowCount-1) list.add(new Position(position.row+1, position.col)); - if(position.col<colCount-1) list.add(new Position(position.row, position.col+1)); - return list; - } - - private Position aStepTowardFire(Position position){ - Queue<Position> toVisit = new LinkedList<>(); - Set<Position> seen = new HashSet<>(); - HashMap<Position,Position> firstMove = new HashMap<>(); - toVisit.addAll(next(position)); - for(Position initialMove : toVisit) - firstMove.put(initialMove,initialMove); - while(!toVisit.isEmpty()){ - Position current = toVisit.poll(); - if(fires.contains(current)) - return firstMove.get(current); - for(Position adjacent : next(current)){ - if(seen.contains(adjacent)) continue; - toVisit.add(adjacent); - seen.add(adjacent); - firstMove.put(adjacent, firstMove.get(current)); - } - } - return position; + step++; + + } + + private List<Position> activateFire(Position position) { + return next(position); + } + + + private Position activateFirefighter(Position position) { + Position randomPosition = aStepTowardFire(position); + List<Position> nextFires = next(randomPosition).stream().filter(fires::contains).toList(); + extinguish(randomPosition); + for (Position fire : nextFires) + extinguish(fire); + return randomPosition; + } + + private void extinguish(Position position) { + fires.remove(position); + grid.paint(position.row, position.col); + } + + private List<Position> next(Position position) { + List<Position> list = new ArrayList<>(); + if (position.row > 0) list.add(new Position(position.row - 1, position.col)); + if (position.col > 0) list.add(new Position(position.row, position.col - 1)); + if (position.row < rowCount - 1) list.add(new Position(position.row + 1, position.col)); + if (position.col < colCount - 1) list.add(new Position(position.row, position.col + 1)); + return list; + } + + private Position aStepTowardFire(Position position) { + Queue<Position> toVisit = new LinkedList<>(); + Set<Position> seen = new HashSet<>(); + HashMap<Position, Position> firstMove = new HashMap<>(); + toVisit.addAll(next(position)); + for (Position initialMove : toVisit) + firstMove.put(initialMove, initialMove); + while (!toVisit.isEmpty()) { + Position current = toVisit.poll(); + if (fires.contains(current)) + return firstMove.get(current); + for (Position adjacent : next(current)) { + if (seen.contains(adjacent)) continue; + toVisit.add(adjacent); + seen.add(adjacent); + firstMove.put(adjacent, firstMove.get(current)); + } } + return position; + } - public record Position(int row, int col){} + public record Position(int row, int col) { + } } \ No newline at end of file