Skip to content
Snippets Groups Projects
Commit 195ac475 authored by ABDELMOUDJIB Mohammed el amine's avatar ABDELMOUDJIB Mohammed el amine
Browse files

tache 01 principe solid

parent 0ed143d7
No related branches found
No related tags found
No related merge requests found
File added
No preview for this file type
package Activation;
public interface Activation {
public void activation();
}
import Activation.Activation;
import Grid.Grid;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
......@@ -21,6 +23,7 @@ public class App extends Application {
Button restart = new Button("Restart");
VBox buttons = new VBox();
HBox total = new HBox();
Activation activation = null;
Grid grid = new Grid(1000,1000,20,20);
root.getChildren().add(total);
......@@ -37,7 +40,7 @@ public class App extends Application {
while(true){
try {
sleep(50);
grid.model.activation();
activation.activation();
grid.repaint();
} catch (InterruptedException e) {
e.printStackTrace();
......
package Fighters;
import javax.swing.text.Position;
import Model.Model;
import Position.Position;
import java.util.*;
import Grid.Grid;
public abstract class AntiFire {
Grid grid;
int colCount, rowCount;
List<Position> firefighters = new ArrayList<>();
Set<Position> fires = new HashSet<>();
public Model.Position randomPosition() {
return new Model.Position((int) (Math.random()*rowCount), (int) (Math.random()*colCount));
}
public abstract Position moveTowardFire(Position position);
public abstract List<Position> next(Position position);
public abstract Position activateFight(Position position);
public void extinguish(Position position) {
fires.remove(position);
grid.paint(position.row, position.col);
}
grid.paint(position.row(), position.col());
}
}
......@@ -4,10 +4,17 @@ package Fighters;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import Activation.Activation;
import Position.Position;
public abstract class Clouds extends AntiFire {
public abstract class Clouds extends AntiFire implements Activation {
List<Position> clouds = new ArrayList<>();
Set<Position> fires = new HashSet<>();
List<Position> cloudsNewPositions;
@Override
public Position activateFight(Position position) {
Position randomPosition = next(position).get((int) (Math.random()*next(position).size()));
......@@ -25,11 +32,24 @@ public abstract class Clouds extends AntiFire {
@Override
public 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.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;
}
@Override
public void activation() {
cloudsNewPositions = new ArrayList<>();
for(Position cc : clouds){
Position newPosition = activateFight(cc);
grid.paint(cc.row(),cc.col());
grid.paintCloud(newPosition.row(), newPosition.col());
cloudsNewPositions.add(newPosition);
}
clouds= cloudsNewPositions;
}
}
package Fighters;
import Activation.Activation;
import Fighters.AntiFire;
import Position.Position;
import javax.swing.*;
import java.util.*;
public class FireFighters extends AntiFire {
public class FireFighters extends AntiFire implements Activation {
int colCount, rowCount;
List<Position> firefighters = new ArrayList<>();
Set<Position> fires = new HashSet<>();
List<Position> ffNewPositions;
Position position;
@Override
public Position activateFight(Position position) {
Position randomPosition = moveTowardFire(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)
......@@ -29,7 +35,7 @@ public class FireFighters extends AntiFire {
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.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;
}
......@@ -55,4 +61,17 @@ public class FireFighters extends AntiFire {
}
return position;
}
@Override
public void activation() {
ffNewPositions = new ArrayList<>();
for(Position ff : firefighters){
Position newPosition = activateFight(ff);
grid.paint(ff.row(),ff.col());
grid.paintFF(newPosition.row(), newPosition.col());
ffNewPositions.add(newPosition);
}
firefighters = ffNewPositions;
}
}
package Fighters;
import Activation.Activation;
import Position.Position;
import java.util.*;
public class MotorizedFireFighters extends AntiFire {
public class MotorizedFireFighters extends AntiFire implements Activation {
List<Position> motorizedfirefighters = new ArrayList<>();
Set<Position> fires = new HashSet<>();
List<Position> mffNewPositions;
@Override
public Position activateFight(Position position) {
Position randomPosition = moveTowardFire(position);
......@@ -43,10 +48,23 @@ public class MotorizedFireFighters extends AntiFire {
@Override
public List<Position> next(Position position) {
List<Position> list = new ArrayList<>();
if(position.row()>0) list.add(new Position(position.row()-2, position.col());
if(position.row()>0) list.add(new Position(position.row()-2, position.col()));
if(position.col()>0) list.add(new Position(position.row(), position.col()-2));
if(position.row()<rowCount-1) list.add(new Position(position.row()+2, position.col()));
if(position.col()<colCount-1) list.add(new Position(position.row(), position.col()+2));
return list;
}
@Override
public void activation() {
mffNewPositions= new ArrayList<>();
for(Position mff : motorizedfirefighters){
Position newPosition = activateFight(mff);
grid.paint(mff.row(),mff.col());
grid.paintMFF(newPosition.row(), newPosition.col());
mffNewPositions.add(newPosition);
}
motorizedfirefighters=mffNewPositions;
}
}
package Fire;
import Activation.Activation;
import Grid.Grid;
import Position.Position;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Fire {
int colCount,rowCount;
public class Fire implements Activation {
int colCount,rowCount,step;
Grid grid;
Set<Position> fires = new HashSet<>();
private List<Position> activateFire(Position position) {
return next(position);
}
public void activation(){
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> next(Position position){
List<Position> list = new ArrayList<>();
if(position.row()>0) list.add(new Position(position.row()-1, position.col());
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));
......
package Grid;
import Activation.Activation;
import Model.Model;
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;
Model model;
int width;
int height;
public int colCount;
public int rowCount;
public Model model;
Activation activation=null;
public Grid(int width, int height, int colCount, int rowCount) {
......@@ -27,14 +35,13 @@ public class Grid extends Canvas{
repaint();
}
private void mousePressed(MouseEvent mouseEvent) {
model.activation();
activation.activation();
repaint();
/*double x = mouseEvent.getX();
double y = mouseEvent.getY();
model.click((int)x*rowCount/height,(int)y*colCount/width);*/
}
model.click((int)x*rowCount/height,(int)y*colCount/width);*/}
void repaint(){
public void repaint(){
for(int col=0; col<colCount; col++)
getGraphicsContext2D().strokeLine(0, col*width/colCount,height, col*width/colCount);
for(int row=0; row<rowCount;row++)
......@@ -42,7 +49,7 @@ public class Grid extends Canvas{
}
void paint(int row, int col){
public void paint(int row, int col){
getGraphicsContext2D().setFill(Color.WHITE);
getGraphicsContext2D().fillRect(row*height/rowCount,col*width/colCount,height/rowCount,width/colCount);
}
......@@ -56,5 +63,13 @@ public class Grid extends Canvas{
getGraphicsContext2D().setFill(Color.RED);
getGraphicsContext2D().fillRect(row*height/rowCount,col*width/colCount,height/rowCount,width/colCount);
}
public void paintMFF(int row, int col) {
getGraphicsContext2D().setFill(Color.BLUE);
getGraphicsContext2D().fillRect(row*height/rowCount,col*width/colCount,height/rowCount,width/colCount);
}
public void paintCloud(int row , int col){
getGraphicsContext2D().setFill(Color.GREY);
getGraphicsContext2D().fillRect(row*height/rowCount,col*width/colCount,height/rowCount,width/colCount);
}
}
\ No newline at end of file
import javax.swing.text.Position;
import java.util.*;
public class Model {
Position position;
Grid grid;
int colCount, rowCount;
List<Position> firefighters = new ArrayList<>();
Set<Position> fires = new HashSet<>();
List<Position> motorizedfirefighters = new ArrayList<>();
List<Position> clouds = new ArrayList<>();
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,int cloudNumber, int motorizedFireFighterNumber){
for(int index=0; index<fireNumber;index++)
fires.add(randomPosition());
for(int index=0; index<fireFighterNumber;index++)
firefighters.add(randomPosition());
for(int index=0; index<cloudNumber;index++)
clouds.add(randomPosition());
for(int index=0; index<motorizedFireFighterNumber;index++)
motorizedfirefighters.add(randomPosition());
}
public 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++;
}
public List<Position> activateFire(Position position) {
return next(position);
}
public 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;
}
public void extinguish(Position position) {
fires.remove(position);
grid.paint(position.row, position.col);
}
public 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;
}
public 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){}
}
package Model;
import Activation.Activation;
import Grid.Grid;
import Fighters.*;
import java.util.*;
import Fire.Fire;
import Position.Position;
public class Model {
Grid grid;
int colCount, rowCount;
List<Position> firefighters = new ArrayList<>();
Set<Position> fires = new HashSet<>();
List<Position> motorizedfirefighters = new ArrayList<>();
List<Position> clouds = new ArrayList<>();
public Model(Grid grid) {
this.grid = grid;
colCount = grid.colCount;
rowCount = grid.rowCount;
}
public void initialisation(int fireNumber, int fireFighterNumber,int cloudNumber, int motorizedFireFighterNumber){
for(int index=0; index<fireNumber;index++)
fires.add(randomPosition());
for(int index=0; index<fireFighterNumber;index++)
firefighters.add(randomPosition());
for(int index=0; index<cloudNumber;index++)
clouds.add(randomPosition());
for(int index=0; index<motorizedFireFighterNumber;index++)
motorizedfirefighters.add(randomPosition());
}
public Position randomPosition() {
return new Position((int) (Math.random()*rowCount), (int) (Math.random()*colCount));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment