Skip to content
Snippets Groups Projects
Commit 15712410 authored by LATIOUI's avatar LATIOUI
Browse files

Merge remote-tracking branch 'origin/main'

parents 7f2e0140 c8912355
No related branches found
No related tags found
No related merge requests found
Showing
with 271 additions and 126 deletions
No preview for this file type
......@@ -23,6 +23,7 @@ public class SimulatorApplication extends javafx.application.Application {
public static final int INITIAL_MOTORIZEDFIREFIGHTER_COUNT = 2;
public static final int INITIAL_MOUNTAIN_COUNT = 15;
public static final int INITIAL_ROAD_COUNT = 10;
public static final int INITIAL_ROCKERY_COUNT = 20;
private Stage primaryStage;
private Parent view;
......@@ -48,7 +49,7 @@ public class SimulatorApplication extends javafx.application.Application {
view = loader.load();
Controller controller = loader.getController();
controller.initialize(SQUARE_WIDTH, SQUARE_HEIGHT, COLUMN_COUNT, ROW_COUNT,
INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT,INITIAL_MOTORIZEDFIREFIGHTER_COUNT,INITIAL_MOUNTAIN_COUNT,INITIAL_ROAD_COUNT);
INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT,INITIAL_MOTORIZEDFIREFIGHTER_COUNT,INITIAL_MOUNTAIN_COUNT,INITIAL_ROAD_COUNT,INITIAL_ROCKERY_COUNT);
}
private void showScene() {
......
......@@ -111,9 +111,9 @@ public class Controller {
public void initialize(int squareWidth, int squareHeight, int columnCount, int rowCount, int initialFireCount,
int initialFirefighterCount,int initialCloudCount,
int initialMotorizedFireFighterCount,int initialMountainCount,int initialRoadCount ) {
int initialMotorizedFireFighterCount,int initialMountainCount,int initialRoadCount ,int initialRockeryCount ) {
grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
board = new GameBoard(rowCount,columnCount,initialFireCount,initialFirefighterCount,initialCloudCount,initialMotorizedFireFighterCount,initialMountainCount,initialRoadCount);
board = new GameBoard(rowCount,columnCount,initialFireCount,initialFirefighterCount,initialCloudCount,initialMotorizedFireFighterCount,initialMountainCount,initialRoadCount,initialRockeryCount);
board.initializeElements();
repaintGrid();
}
......
......@@ -65,18 +65,12 @@ public class GameBuilder implements IGameBuilder {
for(int i=0;i<clouds;i++) {
Cloud cloud=new Cloud(Color.DARKCYAN);
cloud.initialize();
}/*
for(int i=0;i<mountains;i++) { ///la meme chose ici.
Mountain mountain=new Mountain(Color.BROWN);
mountain.initialize();
}
for(int i=0;i<roads;i++) {
Road road=new Road(Color.GRAY);
road.initialize();
}*/
for(int i=0;i<15;i++) {
}
for(int i=0;i<rockerys;i++) {
Rockery rockery=new Rockery( Color.rgb(85, 107, 47));
rockery.initialize();
}
......@@ -92,6 +86,10 @@ public class GameBuilder implements IGameBuilder {
FireFighter fireFighter=new FireFighter(Color.BLUE);
fireFighter.initialize();
}
for(int i=0;i<mountains;i++) {
Mountain mountain=new Mountain(Color.BROWN);
mountain.initialize();
}
}
}
\ No newline at end of file
......@@ -12,7 +12,7 @@ import java.util.*;
import static model.GameBoard.elementPosition;
import static model.GameBoard.randomPosition;
public class Cloud implements ExtinguishFire{
public class Cloud implements BoardElement{
private final Color color;
......
package model.ExtinguishFire;
import model.BoardElement;
import model.GameBoard;
import util.Position;
import java.util.ArrayList;
import java.util.HashMap;
public interface ExtinguishFire extends BoardElement {
//void update(GameBoard gameBoard , Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition);
}
......@@ -8,7 +8,6 @@ import util.Position;
import java.util.*;
public class FireFighter extends FireFighters {
private final Color color;
......@@ -25,33 +24,28 @@ public class FireFighter extends FireFighters {
return visitor.visit(this);
}
public void initialize() {
super.initialize();
}
public void moveAndExtinguish(HashMap<Position, ArrayList<BoardElement>> newElementPosition, Position newFirefighterPosition, ArrayList<Position> extinguishPosition, List<Position> firePositions, GameBoard gameBoard) {
public void moveAndExtinguish(HashMap<Position, ArrayList<BoardElement>> newElementPosition, Position newFirefighterPosition, ArrayList<Position> extinguishPosition) {
addElementToElementPosition(newElementPosition, newFirefighterPosition);
extinguishPosition.add(newFirefighterPosition);
List<Position> neighborFirePositions = gameBoard.neighbors(newFirefighterPosition).stream()
List<Position> neighborFirePositions = GameBoard.neighbors(newFirefighterPosition).stream()
.filter(firePositions()::contains).toList();
extinguishPosition.addAll(neighborFirePositions);
}
@Override
public void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
List<Position> firePositions = firePositions();
Position newFirefighterPosition = gameBoard.neighborClosestToFire(position);
extinguishPosition.add(position);
if(canMove(newFirefighterPosition)){
moveAndExtinguish(newElementPosition,newFirefighterPosition,extinguishPosition,firePositions,gameBoard);
moveAndExtinguish(newElementPosition,newFirefighterPosition,extinguishPosition);
}else {
List<Position> neighbors = gameBoard.neighbors(position);
List<Position> neighbors = GameBoard.neighbors(position);
for (Position neighbourPosition : neighbors) {
if(canMove(neighbourPosition)){
moveAndExtinguish(newElementPosition,neighbourPosition,extinguishPosition,firePositions,gameBoard);
moveAndExtinguish(newElementPosition,neighbourPosition,extinguishPosition);
return;
}
}
//moveAndExtinguish(newElementPosition,position,extinguishPosition,firePositions,gameBoard);
}
}
......
......@@ -28,20 +28,16 @@ public class MotorizedFireFighter extends FireFighters {
return visitor.visit(this);
}
public void initialize() {
super.initialize(); // to delete
}
public void moveAndExtinguish(HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> newMotorizedFireFighterPositions,
ArrayList<Position> extinguishPosition, List<Position> firePositions, GameBoard gameBoard) {
ArrayList<Position> extinguishPosition, List<Position> firePositions) {
addElementToElementPosition(newElementPosition, newMotorizedFireFighterPositions.get(1));
extinguishPosition.addAll(newMotorizedFireFighterPositions);
List<Position> neighborFirePositions = new ArrayList<>();
neighborFirePositions.addAll(gameBoard.neighbors(newMotorizedFireFighterPositions.get(0)).stream()
neighborFirePositions.addAll(GameBoard.neighbors(newMotorizedFireFighterPositions.get(0)).stream()
.filter(firePositions::contains).toList());
neighborFirePositions.addAll(gameBoard.neighbors(newMotorizedFireFighterPositions.get(1)).stream()
neighborFirePositions.addAll(GameBoard.neighbors(newMotorizedFireFighterPositions.get(1)).stream()
.filter(firePositions::contains).toList());
extinguishPosition.addAll(neighborFirePositions);
}
......@@ -57,13 +53,13 @@ public class MotorizedFireFighter extends FireFighters {
if (canMove(newMotorizedFireFighterPosition2)) {
newMotorizedFireFighterPositions.add(newMotorizedFireFighterPosition2);
moveAndExtinguish(newElementPosition, newMotorizedFireFighterPositions, extinguishPosition,firePositions, gameBoard);
moveAndExtinguish(newElementPosition, newMotorizedFireFighterPositions, extinguishPosition,firePositions);
} else {
List<Position> neighbors = gameBoard.neighbors(position);
List<Position> neighbors = GameBoard.neighbors(position);
for (Position neighbourPosition : neighbors) {
if (canMove(neighbourPosition)) {
newMotorizedFireFighterPositions.add(position);
moveAndExtinguish(newElementPosition, newMotorizedFireFighterPositions, extinguishPosition, firePositions, gameBoard);
moveAndExtinguish(newElementPosition, newMotorizedFireFighterPositions, extinguishPosition, firePositions);
break;
}
}
......
......@@ -10,7 +10,7 @@ import java.util.*;
import static model.GameBoard.elementPosition;
public class Fire implements Flammable{
public class Fire implements BoardElement {
private int turns=0;
private final Color color;
......@@ -57,7 +57,7 @@ public class Fire implements Flammable{
if(canMove(position,newElementPosition))
addElementToElementPosition(newElementPosition,position);
if ((gameBoard.stepNumber() % 2 == 0 && !inRockery(position))||(inRockery(position) && turns==4)) {
List<Position> positionsNeighbours = new ArrayList<>(gameBoard.neighbors(position));
List<Position> positionsNeighbours = new ArrayList<>(GameBoard.neighbors(position));
for(Position positionNeighbour : positionsNeighbours){
if(!extinguishPosition.contains(positionNeighbour)&& canMove(positionNeighbour,newElementPosition)){
addElementToElementPosition(newElementPosition,positionNeighbour);
......
package model.Flammable;
import model.BoardElement;
import model.GameBoard;
import util.Position;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public interface Flammable extends BoardElement{
//void update(GameBoard gameBoard, Position position,HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition);
}
......@@ -2,7 +2,6 @@ package model;
import model.Builder.GameBuilder;
import model.Flammable.Flammable;
import model.Visitor.FireFinder;
import util.Position;
......@@ -17,6 +16,7 @@ public class GameBoard implements Board{
private final int initialMotorizedFireFighterCount;
private final int initialMountainCount;
private final int initialRoadCount;
private final int initialRockeryCount;
private int step = 0;
static Random randomGenerator = new Random();
......@@ -28,7 +28,7 @@ public class GameBoard implements Board{
public GameBoard(int columnCount,int rowCount,int initialFireCount, int initialFirefighterCount,int initialCloudCount,
int initialMotorizedFireFighterCount,int initialMountainCount,int initialRoadCount) {
int initialMotorizedFireFighterCount,int initialMountainCount,int initialRoadCount,int initialRockeryCount) {
GameBoard.columnCount = columnCount;
GameBoard.rowCount = rowCount;
this.initialFireCount = initialFireCount;
......@@ -37,6 +37,7 @@ public class GameBoard implements Board{
this.initialMotorizedFireFighterCount=initialMotorizedFireFighterCount;
this.initialMountainCount = initialMountainCount;
this.initialRoadCount = initialRoadCount;
this.initialRockeryCount = initialRockeryCount;
}
public void initializeElements(){
......@@ -47,6 +48,7 @@ public class GameBoard implements Board{
.setCloud(initialCloudCount)
.setMotorizedFireFighter(initialMotorizedFireFighterCount)
.setMountain(initialMountainCount)
.setRockery(initialRockeryCount)
.build();
}
......@@ -69,8 +71,7 @@ public class GameBoard implements Board{
for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()){
for(BoardElement element : entry.getValue()){
if (element.accept(new FireFinder())){
Flammable element1 = (Flammable) element;
element1.update(this,entry.getKey(),newElementPosition,extinguishPosition);
element.update(this,entry.getKey(),newElementPosition,extinguishPosition);
}
}
}
......@@ -111,7 +112,7 @@ public class GameBoard implements Board{
return GameBoard.columnCount;
}
public List<Position> neighbors(Position position) {
public static List<Position> neighbors(Position position) {
List<Position> list = new ArrayList<>();
if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
......@@ -119,14 +120,6 @@ public class GameBoard implements Board{
if (position.column() < columnCount - 1) list.add(new Position(position.row(), position.column() + 1));
return list;
}
public static List<Position> neighborsObstacle(Position positionObstacle) {
List<Position> list = new ArrayList<>();
if (positionObstacle.row() > 0) list.add(new Position(positionObstacle.row() - 1, positionObstacle.column()));
if (positionObstacle.column() > 0) list.add(new Position(positionObstacle.row(), positionObstacle.column() - 1));
if (positionObstacle.row() < rowCount - 1) list.add(new Position(positionObstacle.row() + 1, positionObstacle.column()));
if (positionObstacle.column() < columnCount - 1) list.add(new Position(positionObstacle.row(), positionObstacle.column() + 1));
return list;
}
public Position neighborClosestToFire(Position position) {
......
......@@ -3,14 +3,12 @@ package model.Obstacle;
import javafx.scene.paint.Color;
import model.BoardElement;
import model.GameBoard;
import model.Visitor.Visitor;
import model.Visitor.*;
import util.Position;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.*;
import static model.GameBoard.elementPosition;
import static model.GameBoard.randomPosition;
import static model.GameBoard.*;
public class Mountain extends Obstacles {
......@@ -30,20 +28,62 @@ public class Mountain extends Obstacles {
return visitor.visit(this);
}
@Override
public void initialize() {
Position position=randomPosition();
if (elementPosition.containsKey(position))
elementPosition.get(position).add(this);
else {
ArrayList<Position> mountainsPositions=getMountainsPositions();
if(mountainsPositions.isEmpty()){
Position position = GameBoard.randomPosition();
while(!canInitialise(position)){
position = GameBoard.randomPosition();
}
addElementToElementPosition(elementPosition,position);
}else{
Random random=new Random();
while (true){
Position positionMountain=mountainsPositions.get(random.nextInt(mountainsPositions.size()));
List<Position> neighbourMountains=GameBoard.neighbors(positionMountain);
for (Position position:neighbourMountains){
if(canInitialise(position)){
addElementToElementPosition(elementPosition,position);
return;
}
}
}
}
}
private ArrayList<Position> getMountainsPositions() {
ArrayList<Position> mountains= new ArrayList<>();
for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()) {
for (BoardElement element : entry.getValue()) {
if (element.accept(new MountainFinder())) {
mountains.add(entry.getKey());
}
}
}
return mountains;
}
private boolean canInitialise(Position position) {
if(elementPosition.containsKey(position)) {
for (BoardElement element : GameBoard.elementPosition.get(position)) {
if (!element.accept(new CrossableByMountain())) {
return false;
}
}
}
return true;
}
private void addElementToElementPosition(HashMap<Position, ArrayList<BoardElement>> newElementPosition, Position newMountainsPosition) {
if (newElementPosition.containsKey(newMountainsPosition) ) {
newElementPosition.get(newMountainsPosition).add(this);
} else {
ArrayList<BoardElement> boardElements = new ArrayList<>();
boardElements.add(this);
elementPosition.put(position, boardElements);
newElementPosition.put(newMountainsPosition, boardElements);
}
}
@Override
public void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
super.update(gameBoard,position,newElementPosition,extinguishPosition);
}
}
......@@ -3,23 +3,19 @@ package model.Obstacle;
import javafx.scene.paint.Color;
import model.BoardElement;
import model.GameBoard;
import model.Visitor.CrossableByRoad;
import model.Visitor.Visitor;
import model.Visitor.*;
import util.Position;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
import static model.GameBoard.elementPosition;
import static model.GameBoard.randomPosition;
import static model.GameBoard.*;
public class Road extends Obstacles {
private final Color color;
public Road(Color color){
this.color=color;
initialize();
}
@Override
public Color getColor() {
......@@ -31,39 +27,104 @@ public class Road extends Obstacles {
return visitor.visit(this);
}
@Override
public void initialize() {
Position position = new Position(0,0);
int count = 0 ;
ArrayList<Position> roadPositions=getMountainsPositions();
if(roadPositions.isEmpty()){
Position position = GameBoard.randomPosition();
while(!canInitialise(position)){
position = GameBoard.randomPosition();
}
addElementToElementPosition(elementPosition,position);
}else{
Random random=new Random();
while (true){
Position positionMountain=roadPositions.get(random.nextInt(roadPositions.size()));
List<Position> neighbourMountains=GameBoard.neighbors(positionMountain);
for (Position position:neighbourMountains){
if(canInitialise(position) && squareProblem(position)){
addElementToElementPosition(elementPosition,position);
return;
}
}
}
}
}
private boolean squareProblem(Position position) {
int numberOfRoarsAround=0;
ArrayList<BoardElement> roadsPositions=getelementAtPositions(new Position(position.row()-1, position.column()),new Position(position.row()-1,position.column()-1),new Position(position.row(), position.column()-1));
for (BoardElement boardElement:roadsPositions) {
if(boardElement.accept(new RoadFinder())) numberOfRoarsAround++;
}
if(numberOfRoarsAround==3) return false;
numberOfRoarsAround=0;
roadsPositions=getelementAtPositions(new Position(position.row()-1, position.column()),new Position(position.row()-1,position.column()+1),new Position(position.row(), position.column()+1));
for (BoardElement boardElement:roadsPositions) {
if(boardElement.accept(new RoadFinder())) numberOfRoarsAround++;
}
if(numberOfRoarsAround==3) return false;
numberOfRoarsAround=0;
roadsPositions=getelementAtPositions(new Position(position.row(), position.column()-1),new Position(position.row()+1,position.column()-1),new Position(position.row()+1, position.column()));
for (BoardElement boardElement:roadsPositions) {
if(boardElement.accept(new RoadFinder())) numberOfRoarsAround++;
}
if(numberOfRoarsAround==3) return false;
numberOfRoarsAround=0;
roadsPositions=getelementAtPositions(new Position(position.row()+1, position.column()),new Position(position.row()+1,position.column()+1),new Position(position.row(), position.column()+1));
for (BoardElement boardElement:roadsPositions) {
if(boardElement.accept(new RoadFinder())) numberOfRoarsAround++;
}
if(numberOfRoarsAround==3) return false;
return true;
}
private ArrayList<BoardElement> getelementAtPositions(Position position, Position position1, Position position2) {
ArrayList<BoardElement> mountainsPositions=new ArrayList<>();
if(elementPosition.containsKey(position)) mountainsPositions.addAll(elementPosition.get(position)) ;
else return mountainsPositions;
if(elementPosition.containsKey(position1)) mountainsPositions.addAll(elementPosition.get(position1));
else return mountainsPositions;
if(elementPosition.containsKey(position2)) mountainsPositions.addAll(elementPosition.get(position2));
return mountainsPositions;
}
private ArrayList<Position> getMountainsPositions() {
ArrayList<Position> roads= new ArrayList<>();
for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()) {
ArrayList<BoardElement> boardElements = entry.getValue();
for(BoardElement boardElement : boardElements){
if(!boardElement.accept(new CrossableByRoad())){
position=entry.getKey();
count++;
for (BoardElement element : entry.getValue()) {
if (element.accept(new RoadFinder())) {
roads.add(entry.getKey());
}
}
}
if(count!=0){
Position newPosition = new Position(position.row(),position.column()+1);
if (elementPosition.containsKey(newPosition)) {
elementPosition.get(newPosition).add(this);
return roads;
}
} else {
ArrayList<BoardElement> boardElements = new ArrayList<>();
boardElements.add(this);
elementPosition.put(newPosition, boardElements);
private boolean canInitialise(Position position) {
if(elementPosition.containsKey(position)) {
for (BoardElement element : GameBoard.elementPosition.get(position)) {
if (!element.accept(new CrossableByRoad())) {
return false;
}
}
}
return true;
}
else {
private void addElementToElementPosition(HashMap<Position, ArrayList<BoardElement>> newElementPosition, Position newRoadPosition) {
if (newElementPosition.containsKey(newRoadPosition) ) {
newElementPosition.get(newRoadPosition).add(this);
} else {
ArrayList<BoardElement> boardElements = new ArrayList<>();
boardElements.add(this);
elementPosition.put(randomPosition(), boardElements);
newElementPosition.put(newRoadPosition, boardElements);
}
}
@Override
public void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
super.update(gameBoard,position,newElementPosition,extinguishPosition);
}
}
package model;
import javafx.scene.paint.Color;
import model.Visitor.CrossableByFire;
import model.Visitor.CrossableByRockery;
import model.Visitor.Visitor;
import util.Position;
......
package model.Visitor;
import model.ExtinguishFire.Cloud;
import model.ExtinguishFire.FireFighter;
import model.ExtinguishFire.MotorizedFireFighter;
import model.Flammable.Fire;
import model.Obstacle.Mountain;
import model.Obstacle.Road;
import model.Rockery;
public class MountainFinder implements Visitor{
@Override
public boolean visit(Fire fire) {
return false;
}
@Override
public boolean visit(FireFighter fireFighter) {
return false;
}
@Override
public boolean visit(Cloud cloud) {
return false;
}
@Override
public boolean visit(MotorizedFireFighter motorizedFireFighter) {
return false;
}
@Override
public boolean visit(Mountain mountain) {
return true;
}
@Override
public boolean visit(Road road) {
return false;
}
@Override
public boolean visit(Rockery rockery) {
return false;
}
}
package model.Visitor;
import model.ExtinguishFire.Cloud;
import model.ExtinguishFire.FireFighter;
import model.ExtinguishFire.MotorizedFireFighter;
import model.Flammable.Fire;
import model.Obstacle.Mountain;
import model.Obstacle.Road;
import model.Rockery;
public class RoadFinder implements Visitor{
@Override
public boolean visit(Fire fire) {
return false;
}
@Override
public boolean visit(FireFighter fireFighter) {
return false;
}
@Override
public boolean visit(Cloud cloud) {
return false;
}
@Override
public boolean visit(MotorizedFireFighter motorizedFireFighter) {
return false;
}
@Override
public boolean visit(Mountain mountain) {
return false;
}
@Override
public boolean visit(Road road) {
return true;
}
@Override
public boolean visit(Rockery rockery) {
return false;
}
}
......@@ -12,7 +12,6 @@ import java.util.List;
public class FirefighterGrid extends Canvas implements Grid<model.BoardElement>{
private void paintElementAtPosition(ArrayList<BoardElement> elementsAtPosition, Position position) {
paintSquare(position.row(), position.column(), elementsAtPosition);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment